🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

2回答

6227閲覧

PHPログイン機能での3パターンのエラー

GZX17

総合スコア5

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2019/09/11 00:44

編集2019/09/11 02:57

前提・実現したいこと

MAMP上でPHPを使い簡素なログイン機能を作っています。
新規登録からメールアドレス、ユーザー名、パスワードを入力し、その情報をDBテーブルに格納し、
ログインの際にはメールアドレスとパスワードを入力し、そのメールアドレスの行からパスワードが一致したらログイン成功というようなものです。
いくつかのパターンのときにエラーが返され、その原因を解明したいです。

原因がわかる方いらっしゃいましたら、教えていただきたいです。
よろしくお願いします。

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

新規登録では問題なくデータをテーブルに格納できるのですが、ログインの際にうまくいきません。
現在パターンとして三つあり、

一つ目は、実際にはありえないのですが、新規登録の際にメールアドレスとパスワードが数字のみで登録した場合(例えば、メールアドレス:111、ユーザー名:sample、パスワード:111)、その情報を使ってログインすると成功します。

二つ目は、メールアドレスとパスワードに文字が入っている場合(例えば、メールアドレス:sample@gmail.com、ユーザー名:sample、パスワード:sample)、では、'データベースエラー' が返されます。

三つ目は、メールアドレスは文字入り、パスワードが数字のみ(例えば、メールアドレス:sample@gmail.com、ユーザー名:sample、パスワード:111)では、'ユーザーIDあるいはパスワードに誤りがあります。1' が返されます。

###パターン1
イメージ説明
ログイン成功します

###パターン2
イメージ説明
イメージ説明

###パターン3
イメージ説明
イメージ説明

該当のソースコード

php

1<?php 2session_start(); 3 4$db['host'] = "localhost"; 5$db['user'] = "root"; 6$db['pass'] = "root"; 7$db['dbname'] = "(データーベース名)"; 8 9//userdata:テーブル構成 10//mailadress (varchar(50) (UNIQUE) 11//username (varchar(20)) 12//password (varchar(100)) 13 14 15$errorMessage = ""; 16 17// ログインボタンが押された場合 18if (isset($_POST["login"])) { 19 // 1. ユーザIDの入力チェック 20 if (empty($_POST["mailadress"])) { // emptyは値が空のとき 21 $errorMessage = 'メールアドレスが未入力です。'; 22 } else if (empty($_POST["password"])) { 23 $errorMessage = 'パスワードが未入力です。'; 24 } 25 26 if (!empty($_POST["mailadress"]) && !empty($_POST["password"])) { 27 // 入力したユーザIDを格納 28 $mailadress = $_POST["mailadress"]; 29 30 // 2. ユーザIDとパスワードが入力されていたら認証する 31 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); 32 33 // 3. エラー処理 34 try { 35 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 36 37 $stmt = $pdo->prepare('SELECT * FROM userdata WHERE mailadress=?'); 38 $stmt->execute(array($mailadress)); 39 40 $password = $_POST["password"]; 41 42 43 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 44 if (password_verify($password, $row['password'])){ 45 $sql="SELECT * FROM userdata WHERE mailadress=$mailadress"; 46 $stmt=$pdo->query($sql); 47 foreach($stmt as $row){ 48 $row['username']; 49 } 50 $_SESSION["username"] = $row['username']; 51 header("Location: https://www.google.com"); 52 exit(); 53 }else { 54 $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。1'; 55 } 56 } else { 57 $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。2'; 58 } 59 } catch (PDOException $e) { 60 $errorMessage = 'データベースエラー'; 61 } 62 } 63} 64 65 66if (isset($_POST["signUp"])) { 67 // 1. ユーザIDの入力チェック 68 if (empty($_POST["username"])) { // 値が空のとき 69 $errorMessage = 'ユーザーIDが未入力です。'; 70 } else if (empty($_POST["mailadress"])) { 71 $errorMessage = 'メールアドレスが未入力です。'; 72 } else if (empty($_POST["password"])) { 73 $errorMessage = 'パスワードが未入力です。'; 74 } else if (empty($_POST["password2"])) { 75 $errorMessage = 'パスワードが未入力です。'; 76 } 77 78 if (!empty($_POST["username"]) &&!empty($_POST["mailadress"]) && !empty($_POST["password"]) && !empty($_POST["password2"]) && $_POST["password"] === $_POST["password2"]) { 79 // 入力したユーザIDとパスワードを格納 80 $mailadress=$_POST["mailadress"]; 81 $username = $_POST["username"]; 82 $password = $_POST["password"]; 83 84 // 2. ユーザIDとパスワードが入力されていたら認証する 85 $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']); 86 87 // 3. エラー処理 88 try { 89 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 90 91 $stmt = $pdo->prepare("INSERT INTO userdata(mailadress,username,password) VALUES (?,?,?)"); 92 93 $stmt->execute(array($mailadress,$username, password_hash($password, PASSWORD_DEFAULT))); 94 95 $signUpMessage = ''.$username.'さん、登録が完了しました。あなたの登録メールアドレスは '. $mailadress. ' です。パスワードは '. $password. ' です。'; // ログイン時に使用するIDとパスワード 96 } catch (PDOException $e) { 97 $errorMessage = 'データベースエラー'; 98 } 99 } else if($_POST["password"] != $_POST["password2"]) { 100 $errorMessage = 'パスワードに誤りがあります。'; 101 } 102} 103?> 104 105 106 107 108<!doctype html> 109<html> 110 <head> 111 <meta charset="UTF-8"> 112 <title>ログイン</title> 113 </head> 114 <body> 115 <h1>ログイン画面</h1> 116 <form id="loginForm" name="loginForm" action="index.php" method="POST"> 117 <fieldset> 118 <legend>ログインフォーム</legend> 119 <div> 120 <font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font> 121 </div> 122 <label for="mailadress">メールアドレス</label><input type="text" id="mailadress" name="mailadress" placeholder="メールアドレスを入力" value="<?php if (!empty($_POST["mailadress"])) {echo htmlspecialchars($_POST["mailadress"], ENT_QUOTES);} ?>"> 123 <br> 124 <label for="password">パスワード</label><input type="password" id="password" name="password" value="" placeholder="パスワードを入力"> 125 <br> 126 <input type="submit" id="login" name="login" value="ログイン"> 127 </fieldset> 128 </form> 129 <br> 130 <h1>新規登録画面</h1> 131 <form id="loginForm" name="loginForm" action="index.php" method="POST"> 132 <fieldset> 133 <legend>新規登録フォーム</legend> 134 <div><font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font></div> 135 <div><font color="#0000ff"><?php echo htmlspecialchars($signUpMessage, ENT_QUOTES); ?></font></div> 136 <label for="mailadress">メールアドレス</label><input type="text" id="mailadress" name="mailadress" placeholder="メールアドレスを入力" value="<?php if (!empty($_POST["mailadress"])) {echo htmlspecialchars($_POST["mailadress"], ENT_QUOTES);} ?>"> 137 <br> 138 <label for="username">ユーザー名</label><input type="text" id="username" name="username" placeholder="ユーザー名を入力" value="<?php if (!empty($_POST["username"])) {echo htmlspecialchars($_POST["username"], ENT_QUOTES);} ?>"> 139 <br> 140 <label for="password">パスワード</label><input type="password" id="password" name="password" value="" placeholder="パスワードを入力"> 141 <br> 142 <label for="password2">パスワード(確認用)</label><input type="password" id="password2" name="password2" value="" placeholder="再度パスワードを入力"> 143 <br> 144 <input type="submit" id="signUp" name="signUp" value="新規登録"> 145 </fieldset> 146 </form> 147 </body> 148</html>

補足情報

PHP(7.3)

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

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

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

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

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

Y.H.

2019/09/11 00:53

> ログインの際にうまくいきません。現在パターンとして三つ それぞれ3パターンで本来どうなることが正しいと思い作成されたのか を質問を編集し追記ください。
退会済みユーザー

退会済みユーザー

2019/09/11 03:29

SQL シンタックスエラーになってるなんてわからないのですね
guest

回答2

0

コピペの継ぎ接ぎですかね^^;
SQL インジェクションが可能なので、データベース操作の基礎から学習してください。

ざっと見た感じ、フローに考慮漏れがあるので、設計も見直したほうが良いです。

投稿2019/09/11 03:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

Exception をせっかくキャッチしているのにどこにも出力していないので問題に気づけません。

学習期や開発時期なのであれば

php

1 } catch (PDOException $e) { 2 $errorMessage = 'データベースエラー'; 3 }

ではなく下記のようにして、処理をそこで終了させてください。

php

1 } catch (PDOException $e) { 2 var_dump($e); 3 die(); 4 }

あとはエラーログ出力の仕組みは入れておきたいですね。
テキストファイルでいいので。

見返して思ったこと追記

  • dsn部分:;などの前後空白入れて接続失敗したケースをよく見ます。PHPマニュアルの記述に倣ったほうが間違いないです
  • prepare→bindValue→executeの流れを徹底しましょう。

参考:PHPでデータベースに接続するときのまとめ

  • プログラム的にはただの文字列なので影響ないですけど、「ん?」てなります)。英単語のスペルは間違いないようにしましょう(結構これでコードレビュー引っかかることあるんですよ)

例: adress → address

細かいところを突っ込んでいくとキリがないので、ひとまずこれで。

投稿2019/09/11 00:52

編集2019/09/11 05:20
m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問