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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

0回答

1014閲覧

PHP DB登録時のbool型で取得するには

n_k23

総合スコア21

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2022/01/11 11:32

前提・解決したいこと

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

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

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

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

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

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

m.ts10806

2022/01/11 11:34

単に return true return false ではダメなんでしょうか。
n_k23

2022/01/11 11:58 編集

m.ts10806様 返信ありがとうございます。 確かに$resultに値を入れずに 結果だけを返してみます。 検証してみます。
m.ts10806

2022/01/11 11:59

変数に入れて一か所でreturnも良いですが、早期returnもコードの可読性やパフォーマンスも良いのかなと。 ただ、DBクローズはfinallyに逃がした方が良いでしょうけど。
n_k23

2022/01/11 12:04

m.ts10806様 指摘された通りに試してみると成功しました。 DBクローズについても後ほど調べながら実装していきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問