質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1047閲覧

ユーザー登録機能が上手くいきません

ryo_1

総合スコア3

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/11/14 10:16

編集2021/11/14 11:45

前提・実現したいこと

PHPでユーザー登録、ログイン機能を作っているのですが、ユーザー登録の条件を満たしているはずなのにmysqlに登録できません。(コード中の$hasCreatedが働かない)、どこが原因か分からず詰まってしまっているのでご指摘いただけましたら幸いです。

dbconnect.php

php

1require_once 'env.php'; 2 3 4function connect() 5{ 6 $host = DB_HOST; 7 $db = DB_NAME; 8 $user = DB_USER; 9 $pass = DB_PASS; 10 11 $dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4"; 12 13try{ 14 $pdo = new PDO($dsn, $user,$pass,[ 15 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 16 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 17 ]); 18 return $pdo; 19}catch(PDOException $e){ 20 echo '接続失敗です!'.$e->getMessage(); 21 exit(); 22} 23 24}

env.php

php

1<?php 2 3define('DB_HOST', 'localhost'); 4define('DB_NAME', '〇〇〇'); 5define('DB_USER', '〇〇〇'); 6define('DB_PASS', '〇〇〇');

public/register.php

php

1<?php 2 3require_once '../classes/UserLogic.php'; 4 5$err =[]; 6 7if(!$username = filter_input(INPUT_POST,'username')){ 8 $err[] = 'ユーザー名を記入してください'; 9} 10if(!$email = filter_input(INPUT_POST,'email')){ 11 $err[] = 'メールアドレスを記入してください'; 12} 13$password = filter_input(INPUT_POST,'password'); 14if(!preg_match("/\A[a-z\d]{8,100}+\z/i",$password)){ 15 $err[]='パスワードは英数字8文字以上100文字以下にしてください' ; 16} 17$password_conf = filter_input(INPUT_POST,'password_conf'); 18if($password !== $password_conf){ 19 $err[] ='確認用パスワードと異なっています'; 20} 21if(!$address = filter_input(INPUT_POST,'address')){ 22 $err[] = '住所を記入してください'; 23} 24if(count($err) === 0){ 25 $hasCreated = UserLogic::createUser($_POST); 26 27 if(!$hasCreated){ 28 $err[] = '登録に失敗しました'; 29 } 30} 31?> 32 33<!DOCTYPE html> 34<html lang="en"> 35<head> 36 <meta charset="UTF-8"> 37 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 38 <title>ユーザー登録完了画面</title> 39</head> 40<body> 41 <?php if(count($err) > 0):?> 42 <?PHP foreach($err as $e) :?> 43 <P><?php echo $e ?></P> 44 <?php endforeach ?> 45 <?php else : ?> 46 <p>ユーザー登録が完了しました。</p> 47 <?php endif ?> 48 <a href="./signup_form.php">戻る</a> 49</body> 50</html>

public/signup_form.php

php

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>ユーザー登録画面</title> 7</head> 8<body> 9 <h2>ユーザー登録フォーム</h2> 10 <form action="register.php" method="POST"> 11 <p> 12 <label for="username">ユーザー名:</label> 13 <input type="text" name="username"> 14 </p> 15 <p> 16 <label for="email">メールアドレス:</label> 17 <input type="email" name="email"> 18 </p> 19 <p> 20 <label for="password">パスワード:</label> 21 <input type="password" name="password"> 22 </p> 23 <p> 24 <label for="password_conf">パスワード確認:</label> 25 <input type="password" name="password_conf"> 26 </p> 27 <p> 28 <label for="address">住所:</label> 29 <input type="text" name="address"> 30 </p> 31 <p> 32 <input type="submit" value="新規登録"> 33 </p> 34 </form> 35 36</body> 37</html>

classes/UserLogic.php

php

1<?php 2 3require_once '../dbconnect.php'; 4 5class UserLogic 6{ 7 public static function createUser($userDate) 8 { 9 $result = false; 10 11 $sql ='INSERT INTO users(name,email,password,address) VALUES (?,?,?,?)'; 12 13 $arr = []; 14 $arr[] = $userDate['username']; 15 $arr[] = $userDate['email']; 16 $arr[] = password_hash($userDate['password'],PASSWORD_DEFAULT); 17 $arr[] = $userDate['address']; 18 19 try{ 20 $stmt = connect()->prepare($sql); 21 $stmt->execute($arr); 22 return $result; 23 }catch(\Exception $e){ 24 return $result; 25 } 26 27 28 29 30 return $result; 31 } 32}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/11/14 10:53

上手くいかない、とは、どこがどういうふうに上手くいかないんでしょうか。 そこらへん詳しく説明しよう
m.ts10806

2021/11/14 10:56

>コード中のhascleatedが働かない コード内には見当たりません。
m.ts10806

2021/11/14 11:02

$hasCreated = UserLogic::createUser($_POST); の$hasCreated のことならそのように書かれたほうが良いかと。 基本はコピペです。
m.ts10806

2021/11/14 11:04

あと可能ならファイルが別ならコードブロックもわけてください。 コピペで再現確認する際に入り混じってると非常に面倒です。 それに「省略させていただきます」とのことですが、想定の通り動いてなくてどこに問題があるか分からないなら、絶対のそのコードに問題がないとは言い切れないはずです(根拠があるならきちんと質問にも書いてほしい) 接続パスワードなどセキュアな部分はマスクかけて構いませんので、その他はコピペで提示してください。
m.ts10806

2021/11/14 11:06

Exceptionを受け取ってるのに握りつぶしているのでデバッグを困難にしています。 }catch(\Exception $e){ return $result; } せめてこう }catch(\Exception $e){ var_dump($e); return $result; }
ryo_1

2021/11/14 11:39

コメントありがとうございます。 全てのコードを載せさせていただきましたのでよろしくお願いいたします。
ryo_1

2021/11/14 11:44 編集

コメントありがとうございます。 上手くいかないところは、register.phpの$hasCreatedがエラーがたまっていないはずなのに動かず登録に失敗しましたと表示されてしまいます。
guest

回答1

0

ベストアンサー

$resultが初期値falseでそのままreturnされるので必ず[登録に失敗しました]が出るようになってます。
DB確認するとデータは登録されてました(テーブル定義提示されてないので全部varchar(200)で作りましたが)
execute()の返却値はboolなので別途変数も受けずにそのままreturnして良いと思います。Exception時は固定でfalseをreturn。

いずれにしてもcatchしたExceptionをどこにも出力せず終わらせる行為は「例外を握りつぶす」として実装上やってはいけない行為として知られています。
学習段階、製造工程中は画面に出力するようにした方が良いと思います(本番などではログファイルに出力するなど、やはりどこかで確認できるようにした方が良い)

投稿2021/11/14 11:52

編集2021/11/14 11:54
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryo_1

2021/11/14 12:13

コメントありがとうございます。 ご丁寧に返信いただきありがとうございます、 大変申し訳ないのですが当方まだ初心者でして execute()の返却値はboolなので別途変数も受けずにそのままreturnして良いと思います。Exception時は固定でfalseをreturn。 を深く理解できていない状態ですコード例とともにもう少し補足いただけませんでしょうか?
m.ts10806

2021/11/14 12:17 編集

>execute()の返却値はboolなので まずは提示したリンクを確認してください。 bool とは真偽値。つまりtrue/falseです。createUser()というメソッドで返したい値とイコールです。 なので、$resultという変数は必要なく、 return $stmt->execute($arr); とし、 exceptionのほうも return false; で良いということです(変数1個もコストなので)
ryo_1

2021/11/14 12:49

コメントありがとうございます。 コード変更したのですが、まだfalseがそのまま返っている感じがするのですが、アドバイスをお願いします、何度も申し訳ございません。 <?php require_once '../dbconnect.php'; class UserLogic { public static function createUser($userDate) { $result = false; $sql ='INSERT INTO users(name,email,password,address) VALUES (?,?,?,?)'; $arr = []; $arr[] = $userDate['username']; $arr[] = $userDate['email']; $arr[] = password_hash($userDate['password'],PASSWORD_DEFAULT); $arr[] = $userDate['address']; try{ $stmt = connect()->prepare($sql); return $stmt->execute($arr); }catch(\Exception $e){ return $result; } return $result; } }
m.ts10806

2021/11/14 20:18

私の手元では動いてるので、回答に書いてあるようにExceptionを握りつぶさず出力を。 「質問への追記修正依頼」にも「どう書くべきか」を記載しています。
m.ts10806

2021/11/14 20:18

あと最後のreturnは到達不可能なコードなので消して良いです。
ryo_1

2021/11/16 03:07

できました、ご丁寧に向き合っていただきありがとうございました!
m.ts10806

2021/11/16 03:10

解決されたようです何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問