前提・実現したいこと
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}
上手くいかない、とは、どこがどういうふうに上手くいかないんでしょうか。
そこらへん詳しく説明しよう
>コード中のhascleatedが働かない
コード内には見当たりません。
$hasCreated = UserLogic::createUser($_POST);
の$hasCreated のことならそのように書かれたほうが良いかと。
基本はコピペです。
あと可能ならファイルが別ならコードブロックもわけてください。
コピペで再現確認する際に入り混じってると非常に面倒です。
それに「省略させていただきます」とのことですが、想定の通り動いてなくてどこに問題があるか分からないなら、絶対のそのコードに問題がないとは言い切れないはずです(根拠があるならきちんと質問にも書いてほしい)
接続パスワードなどセキュアな部分はマスクかけて構いませんので、その他はコピペで提示してください。
Exceptionを受け取ってるのに握りつぶしているのでデバッグを困難にしています。
}catch(\Exception $e){
return $result;
}
せめてこう
}catch(\Exception $e){
var_dump($e);
return $result;
}
コメントありがとうございます。
全てのコードを載せさせていただきましたのでよろしくお願いいたします。
コメントありがとうございます。
上手くいかないところは、register.phpの$hasCreatedがエラーがたまっていないはずなのに動かず登録に失敗しましたと表示されてしまいます。
回答1件
あなたの回答
tips
プレビュー