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

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

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

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

Q&A

解決済

1回答

611閲覧

ログイン時のテーブル検索対象

Roo

総合スコア55

PHP

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

0グッド

0クリップ

投稿2019/03/05 09:07

編集2019/03/05 11:29

###前提
■会員登録

DB:MYSQL ver5.6.43
php: ver5.4.55

仮会員登録→完了→本会員登録→完了→ログイン画面→マイページ

本会員登録画面にて、
本登録時に、テーブルにpasswordを外部ファイル(下記URL)を利用して、ハッシュ化し登録しています。
https://github.com/ircmaxell/password_compat/blob/master/lib/password.php

###起きている事象
ログインはできているが、一列目しか見ていない。
そのためid2以降の登録ユーザーではログインできない。

idmailpass
1hoge@.co.jptest1
2hoge2@.co.jptest2
###質問点

すみませんが下記の修正をお教えいただきたいです。
ご指摘等何でも構いませんのでよろしくお願いいたします。

php

1 if (isset($_POST["login"])) { 2 // 1. ユーザIDの入力チェック 3 if (empty($_POST["mail"])) { // emptyは値が空のとき 4 $errorMessage = '※kuuhaku'; 5 } else if (empty($_POST["password"])) { 6 $errorMessage = '※mailまたはPasswordが間違っています。'; 7 } else if (!preg_match('/^[!-~]+@[!-~]+$/', $_POST["mail"])){ 8 $errorMessage = '※正規表現外'; 9 } else if (!preg_match("/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{8,100}+\z/i", $_POST["password"])){ 10 $errorMessage = '※oi'; 11 } else if (!preg_match("/^.{4,32}$/",$_POST["mail"])){ 12 $errorMessage = '※桁数上'; 13 } else if (!preg_match("/^.{4,32}$/",$_POST["password"])){ 14 $errorMessage = '※桁数上'; 15 16 17 }else{ 18 19 20 if (!empty($_POST["mail"]) && !empty($_POST["password"])) { 21 // 入力したユーザIDを格納 22 $mail = $_POST["mail"]; 23 24 25 26 27 // 2. ユーザIDとパスワードが入力されていたら認証する 28 $dsn = sprintf('mysql:host=%s; dbname=%s; charset=utf8;unix_socket=/tmp/mysql.sock', $db['host'], $db['dbname']); 29 // 3. エラー処理 30 try { 31 $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 32 33 34 $stmt = $pdo->prepare('SELECT * FROM member WHERE mail = ?'); 35 $stmt->execute(array($mail)); 36 37 $password = $_POST["password"]; 38 39 if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 40 // if (password_verify($password, $row['password'])) { 41 if ( $password == $row['password']) { 42 43 44 45 session_regenerate_id(true); 46 47 //正常に叩かれた場合、SQL実施 48 $sql = "UPDATE member SET sdate='$date' WHERE id='1'"; 49 $result = $pdo->query($sql); 50 51 52 // 入力したIDのユーザー名を取得 53 $id = $row['id']; 54 $sql = "SELECT * FROM member WHERE id = $id"; //入力したIDからユーザー名を取得 55 $stmt = $pdo->query($sql); 56 foreach ($stmt as $row) { 57 $row['mail']; // ユーザー名 58 } 59 $_SESSION["mail"] = $row['mail']; 60 header("location: my.php"); 61 exit(); // 処理終了 62 } else { 63 // 認証失敗 64 $errorMessage = '※mailまたはPasswordが間違っています。'; 65 } 66 } else { 67 // 4. 認証成功なら、セッションIDを新規に発行する 68 // 該当データなし 69 $errorMessage = '※該当データなしmailまたはPasswordが間違っています。'; 70 } 71 } catch (PDOException $e) { 72 73 $errorMessage = header("Location: 500.php"); 74 75 } 76 } 77 78 } 79 var_dump($errorMessage); 80 } 81 82?>

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

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

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

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

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

date

2019/03/05 09:21

phpのバージョンはあげられないのでしょうか?
Roo

2019/03/05 09:24

バージョンは上げれません。すみません
退会済みユーザー

退会済みユーザー

2019/03/05 09:35 編集

「$sql = "UPDATE member SET sdate='$date' WHERE id='1'";」が何をしたいのかわからん、なぜid=1限定なのか、sdateは何を意図したデータなのか、など。
Roo

2019/03/05 09:37

マイページに遷移した際に、id=1のみ時間を更新してマイページで ログイン時間を表示したかったため、そのような記載になっております。
Roo

2019/03/05 09:40

ハッシュ化の値とパスワードを比較のコードがわからずでして、、。
date

2019/03/05 09:41

このログイン画面にpassword_compatは読み込んでいますか?
退会済みユーザー

退会済みユーザー

2019/03/05 09:43

idってユーザーidだとしたら、常に1ってどーなのよ、と。そして、update文の直後に $row['id'] ってどっから来た? せっかくpdo接続するんならprepare()とかbindValue()とか駆使してSQLインジェクション対策したほうが良いよ。
Roo

2019/03/05 09:45

date様 !?失礼いたしました。修正してみます。。。 m6u様 ですよね。この問題解決時に試させていただきます。
guest

回答1

0

ベストアンサー

パスワードはどのような方法でハッシュ化しましたでしょうか。

PHP標準のpassword_hashを使った場合、比較用のpassword_verifyという関数が用意してあります(PHPリファレンス)。

投稿2019/03/05 09:13

maisumakun

総合スコア145121

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

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

Roo

2019/03/05 09:19

お忙しい中ご回答感謝いたします。 下記で実施いたしました。 require_once 'hasu_test.php'; $password_hash = password_hash($_SESSION['password'],PASSWORD_DEFAULT); ■質問点:PHP より if (password_verify($password, $row['password'])) { こちら、無邪気に試したのですがうまくいかずです。
date

2019/03/05 09:20

php: ver5.4. とあるのでpassword_hashが使えなかったと推測されます
Roo

2019/03/05 09:25

なるほどです。。。 しかし、テーブルにはハッシュの値が格納されているのは何故でしょうか?
退会済みユーザー

退会済みユーザー

2019/03/05 09:38

PHP: Hash 関数 - Manual <http://jp2.php.net/manual/ja/ref.hash.php> あたりを駆使してハッシュ求めたりするとかしないとか。パスワードの生の値を保持しておくと漏洩したときとかいろいろ面倒だから、ハッシュ化した値を保持しておくんじゃないのかな。
Roo

2019/03/05 09:46

なるほど…です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問