前提・解決したいこと
PHPで自作webサイトにてユーザー登録実装を行なっている。
実装の中でDBに登録は実装できるのだが、登録できなかった場合に入力フォームに
エラーメッセージを出力する機能を実装しようとしているのだがうまくデータの受け渡しができない。
理想としてはSQL実行時にbool型で取得し、その値にて判定する機能を実装したい。
・データの流れ
新規登録画面(sign_up.php)送信→入力値バリデーション、メールアドレス等二重登録チェック確認OK→新規登録完了画面(sign_up_complete.php)
新規登録完了画面にてユーザー登録関数を起動し成否でページを遷移させたい。
ディレクトリ構成 config Controllers ↓→UserController.php Models ↓→User.php ↓→Db.php Views/test ↓→sign_up_complete.php ↓→sign_up.php
発生している問題
php
1<?php 2// 登録完了画面(sign_up_complete.php) 3session_start(); 4require_once '../functions.php'; //バリデーション等関数 5require_once ROOT_PATH.'Controllers/UserController.php'; 6$User = new UserController(); 7//ユーザー登録関数 8$hasCreated = $User->createUser($post); 9if (!$hasCreated) { 10 echo '登録に失敗しました。'; 11} else { 12 echo '登録に成功しました。'; 13} 14 15 16?>
php
1<?php 2// Models/User.php 3require_once ROOT_PATH.'/Models/Db.php'; 4class User extends Db 5{ 6 public function __construct($dbh = null) 7 { 8 parent::__construct($dbh); 9 } 10 11 /** 12 * ユーザー登録. 13 * 14 * @param array $userData 15 * 16 * @return bool $result 17 */ 18 public function userCreate($userData) 19 { 20 $result = false; 21 try { 22 $sth = $this->dbh; 23 $sql = 'INSERT INTO users (name,email,password) 24 VALUES (:name,:email,:password)'; 25 $password = password_hash($userData['password'], PASSWORD_DEFAULT); 26 $sth->beginTransaction(); 27 $stmt = $sth->prepare($sql); 28 $stmt->bindValue(':name', $userData['name'], PDO::PARAM_STR); 29 $stmt->bindValue(':email', $userData['email'], PDO::PARAM_STR); 30 $stmt->bindValue(':password', $password, PDO::PARAM_STR); 31 $stmt->execute(); 32 $sth->commit(); 33 // 成功時にtrueを返したい 34 } catch (PDOException $e) { 35 $sth->rollBack(); 36 // 失敗時にfalseを返したい 37 return $result; 38 } 39 } 40} 41?>
php
1// Models/Db.php 2<?php 3require_once ROOT_PATH.'/config/env.php'; 4class Db 5{ 6 protected $dbh; 7 8 protected function __construct($dbh = null) 9 { 10 $host = DB_HOST; 11 $dbname = DB_NAME; 12 $user = DB_USER; 13 $pass = DB_PASS; 14 $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8"; 15 if (!$dbh) { 16 try { 17 $this->dbh = new PDO($dsn, $user, $pass, [ 18 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 19 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 20 ]); 21 } catch (PDOException $e) { 22 echo '接続失敗'.$e->getMessage(); 23 exit(); 24 } 25 } else { 26 $this->dbh = $dbh; 27 } 28 } 29}
php
1//Controllers/UserController.php 2<?php 3require_once ROOT_PATH.'Models/User.php'; 4class UserController 5{ 6 private $request; 7 private $User; 8 public function __construct() 9 { 10 $this->request['get'] = $_GET; 11 $this->request['post'] = $_POST; 12 $this->User = new User(); 13 } 14 15 /** 16 * ユーザーDB登録. 17 * 18 * @param array $post 19 * 20 * @return 21 */ 22 public function createUser($post) 23 { 24 $result = $this->User->userCreate($post); 25 } 26}
試したこと
トランザクションを外しexecute()するときにtrueを返してくれると
web記事を発見し試してみるも希望通り動作せず。
PHP
1<?php 2// Models/User.php 3require_once ROOT_PATH.'/Models/Db.php'; 4class User extends Db 5{ 6 public function __construct($dbh = null) 7 { 8 parent::__construct($dbh); 9 } 10 public function userCreate($userData) 11 { 12 $result = false; 13 try { 14 $sth = $this->dbh; 15 $sql = 'INSERT INTO users (name,email,password) 16 VALUES (:name,:email,:password)'; 17 $password = password_hash($userData['password'], PASSWORD_DEFAULT); 18 $stmt = $sth->prepare($sql); 19 $stmt->bindValue(':name', $userData['name'], PDO::PARAM_STR); 20 $stmt->bindValue(':email', $userData['email'], PDO::PARAM_STR); 21 $stmt->bindValue(':password', $password, PDO::PARAM_STR); 22 $result = $stmt->execute(); //変更 23 } catch (PDOException $e) { 24 return $result; //変更 25 } 26 } 27 /* 28 * ユーザー名チェック. 29 * 30 * @param array $post 31 * 32 * @return bool 33 */ 34 public function nameCheck($post) 35 { 36 $result = false; 37 try { 38 $sth = $this->dbh; 39 $sql = 'SELECT id FROM users WHERE name = :name'; 40 $stmt = $sth->prepare($sql); 41 $stmt->bindValue('name', $post['name'], PDO::PARAM_STR); 42 $stmt->execute(); 43 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 44 return $result; 45 } else { 46 $result = true; 47 48 return $result; 49 } 50 } catch (PDOException $e) { 51 return $result; 52 } 53 } 54} 55?>
Qiita記事(PHPでデータベースに接続するときのまとめ)を見てみるの改善策が見つからず。
また登録前段階で二重登録時にはエラー出力できているのですがトランザクション処理を入れると
データの流れが把握できず難航しています。
ご助言をよろしくお願いします。
補足情報(FW/ツールのバージョンなど)
MAMP
PHP 7.4.21
phpMyAdmin 5.1.0
あなたの回答
tips
プレビュー