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

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

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

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

2回答

1724閲覧

PHP ログイン機能 ユーザー新規登録

k0ta

総合スコア0

MySQL

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

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/05/17 12:55

前提・実現したいこと

PHPでログイン機能を作成しようとしています
そのなかで新規登録の部分を作成しようとしています

発生している問題・エラーメッセージ

以下のコードで表示したページで、ユーザーネームとパスワードを設定しても新規登録が完了せず、”登録に失敗しました”が出力されてしまいます
また、データベースへも新規登録の情報は追加されませんでした

該当のソースコード

signup.php

PHP

1 2<!DOCTYPE html> 3<html lang="ja"> 4 5<head> 6 <meta charset="UTF-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 <title>Signup</title> 9</head> 10 11<body> 12 <h2>新規登録</h2> 13 <form action="register.php" method="POST"> 14 <p> 15 <label for="username">ユーザー名:</label> 16 <input type="text" name="name"> 17 </p> 18 <p> 19 <label for="password">パスワード:</label> 20 <input type="password" name="password"> 21 </p> 22 <p> 23 <label for="password">パスワード確認</label> 24 <input type="password" name="password_conf"> 25 </p> 26 <p> 27 <input type="submit" value="新規登録する"> 28 </p> 29 </form> 30</body> 31 32</html>

register.php

PHP

1<?php 2 3require_once './classes/UserLogic.php'; 4 5//エラーメッセージ 6$err = []; 7 8//バリデーション・・・内容の妥当性のチェック 9 10//ユーザー名やパスワードがうまく記入されていない場合 11 12if (!$username = filter_input(INPUT_POST, 'name')) { 13 14 $err[] = 'ユーザー名を記入してください'; 15} 16 17$password = filter_input(INPUT_POST, 'password'); 18 19//正規表現 20if (!preg_match("/\A[a-z\d]{6,100}+\z/i", $password)) { 21 22 $err[] = 'パスワードは英数字6文字以上にしてください'; 23} 24 25$password_conf = filter_input(INPUT_POST, 'password_conf'); 26 27if ($password !== $password_conf) { 28 29 $err[] = '確認用パスワードと異なっています'; 30} 31 32//ユーザー登録がうまくいかない場合 33 34if (isset($err)) { 35 36 $hasCreated = UserLogic::createUser($_POST); 37 38 if (!$hasCreated) { 39 40 $err[] = '登録に失敗しました'; 41 } 42} 43 44?> 45 46<!DOCTYPE html> 47<html lang="ja"> 48 49<head> 50 <meta charset="UTF-8"> 51 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 52 <title>Document</title> 53</head> 54 55<body> 56 57 <?php if (count($err) > 0) : ?> 58 59 <?php foreach ($err as $e) : ?> 60 61 <p><?php echo $e ?></p> 62 63 <?php endforeach ?> 64 65 <?php else : ?> 66 67 <p>登録完了</p> 68 69 <?php endif ?> 70 71 <a href="./signup.php">戻る</a> 72</body> 73 74</html> 75

UserLogic.php

PHP

1<?php 2 3// 相対パスで指定するとうまくいかないので(../dbconnect.php)、絶対パスで指定 4require_once dirname(__FILE__) . '/../dbconnect.php'; 5 6class UserLogic 7{ 8 9 10 // PHPDoc・・・コメントを書く時のあるきまった形式 11 // ー>他の人が見ても分かりやすいようにするため 12 13 /** 14 * ユーザーの登録          ー>説明を書く 15 * @param array $userData     ->引数 16 * @return bool $result      ->返り値 17 */ 18 19 public static function createUser($userData) 20 { 21 22 $result = false; 23 24 $sql = 'INSERT INTO user (name, password) VALUES (?, ?)'; 25 26 // ユーザーデータを配列に入れる 27 28 $arr = []; 29 $arr[] = $userData['name']; 30 $arr[] = password_hash($userData['password'], PASSWORD_DEFAULT); 31 32 try { 33 34 $stmt = connect()->prepare($sql); 35 $stmt->execute($arr); 36 return $result; 37 } catch (\Exception $e) { 38 39 return $result; 40 } 41 } 42} 43

env.php

<?php define('DB_HOST', 'ホスト名'); define('DB_NAME', 'データベース名'); define('DB_USER', 'データベースユーザー名'); define('DB_PASS', 'データベースパスワード');

dbconnect.php

<?php require_once 'env.php'; ini_set('display_errors', true); function connect() { $host = DB_HOST; $db = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host = $host; dbname = $db"; try { $pdo = new PDO($dsn, $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); return $pdo; } catch (PDOException $e) { echo '接続失敗です' . $e->getMessage(); exit(); } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報

UserLogic.phpのみ同じ階層にあるclassesディレクトリ内にあります

質問の仕方やコードの記述などの未熟な部分もあるかと思いますが、よろしければご指摘のほどよろしくお願いします

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

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

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

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

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

guest

回答2

0

現状ではデバッグが不可能なコードになっているので、とりあえずは

PHP

1 try { 2 3 $stmt = connect()->prepare($sql); 4 $stmt->execute($arr); 5 return $result; 6 } catch (\Exception $e) { 7 8 return $result; 9 }

PHP

1 try { 2 3 $stmt = connect()->prepare($sql); 4 $stmt->execute($arr); 5 return $result; 6 } catch (\Exception $e) { 7 echo $e->getMessage(); 8 echo $e->getTraceAsString(); 9 die(); 10 //return $result; 11 }

等として例外の中身を把握してデバッグしましょう。
(本来はここより上の部分で例外をキャッチして処理する&エラーをログに吐き出すのが適切です。)

もし、参考にしている教科書等が質問に書いてある通りのコードなのであれば、(デバッグに必要な情報を隠蔽するのは)コードの質に問題があると言わざるを得ないので別の教材を検討することをお勧めします。

投稿2020/05/17 13:04

編集2020/05/17 14:06
tanat

総合スコア18727

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

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

k0ta

2020/05/18 12:28

回答ありがとうございます。 しっかりとデバッグを意識しようと思います。 また、学習教材は別のものを検討しようと思います。
tanat

2020/05/18 12:49

例外を表示するようにしてもダメな場合はSQL自体は通っているということになるので、 m.ts10806さんの回答の通り、$resultの変化について確認しながらデバッグをしてみてください。 *現状ではINSERTに成功しても失敗が表示されるはずです。
guest

0

$resultは初期でfalseが定義されそのままreturnされてます。
なので、必ずfalseが返ります。

PDOStatement::executeの返却値はboolなので下記で良いかと。

php

1return $stmt->execute($arr);

$resultも定義不要で、catchではreturn false;を直接書くので良いです。
※catchしたらいずれにせよ処理続行不可だからdie("登録失敗");でも良いと思いますが。

あとは既に指摘があるように例外を握りつぶしてはいけません。
学習時期、開発途中は必ず出力するようにしてください。

投稿2020/05/17 22:36

編集2020/05/17 22:43
m.ts10806

総合スコア80875

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

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

k0ta

2020/05/18 12:30

回答ありがとうございます。 例外の出力を念頭に置いて取り組もうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問