• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:password_verifyがうまくできません)

password_verifyがうまくできません

このQ&Aのポイント
  • データベースから取り出したpasswordをpassword_verifyでマッチさせる方法がわかりません。
  • データベースから取り出した値で直にマッチさせる方法を教えてください。
  • password_hashで生成したパスワードとデータベースから取り出したpasswordをマッチさせる方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

以下のメモリ上でSQLiteのデータベースを一時的に作成するコードにて試してみましたが、再現できません。常にTrueになります。 <?php // 使う情報 $id = 66; $password = 'xyz'; // 接続 $pdo = new \PDO('sqlite::memory:'); // データ準備 $pdo->exec("CREATE TABLE members(id INT, password TEXT)"); $stmt = $pdo->prepare("INSERT INTO members VALUES(?, ?)"); $stmt->execute([$id, password_hash($password, PASSWORD_DEFAULT)]); // データ検証 $stmt = $pdo->prepare("SELECT password FROM members where id = ?"); $stmt->execute([$id]); var_dump(password_verify($password, $stmt->fetchColumn())); 【蛇足】 ・プリペアドステートメント生成時に変数を展開するのは用い方を誤っています。これではSQLインジェクションの対策になりません。$idが「' OR 1=1」など悪意のある文字列でないことが保証出来ている場合のみにしかこの手段を用いてはなりません。 ・FETCH_ASSOCで連想配列で抜き出してきても先頭1カラムしか利用しない場合は最初からFETCH_COLUMNで十分です。そしてこれは更にfetchColumn()という専用のメソッドによって簡略化出来ます。 (詳細) http://qiita.com/mpyw/items/b00b72c5c95aac573b71

nike_bmura
質問者

お礼

お礼が遅くなりまして、大変申し訳ございません。 質問の件ですが、PCを再起動したら何事もなかったかのようにtrueになりました。今後、質問を立てる時は、apacheやpcを再起動かけて様子をみてからにします。お騒がせして、申し訳ございませんでした。 また、FETCH_COLUMN調べました。理解しました。なるほど、一つだけの値を取り出せるんですね。参考書の「スカラー値(先頭行の値)」の説明を見てはいたのですが、何に使うのかさっぱり分かっておりませんでした。重ね重ねありがとうございます。 最後に……紹介していただいた記事、読みました! というか、以前から何度か読んでいたはずなのに、ちゃんと理解できていませんでした。繰り返し理解できるまで読み込みたいと思います。 長々と失礼いたしました。 本当にありがとうございました!

nike_bmura
質問者

補足

コメントありがとうございます!! >>プリペアドステートメント生成時に変数を展開するのは用い方を誤っています。 こちら、教えてくださって本当に本当に本当にありがとうございました!!!!!!!!! 全部、変数を展開して使っていました。勉強足らずで本当にお恥ずかしいです。すぐに直しました。 FETCH_COLUMNこれから調べてみます。 コメントをきちんと読むまで知識が足らず時間がかかるため、補足から失礼いたしました。 ありがとうございます!

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

> var_dump($hash)はやってみたんです……でも同じでした…… なんと表示されたのでしょうか?表示結果をすべて省略せずに書いてください。

nike_bmura
質問者

お礼

お付き合いくださいまして、ありがとうございます。 非常に申し訳ないのですが、PCに再起動をかけてページを開いたら、何事もなかったようにtrueになりました…… 次からはapacheを再起動したりPCを再起動したりして様子を見てから質問をたてたいと思います。 大変ご迷惑をおかけしました。こんな質問にも付き合ってくださり、本当に本当にありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

改行とか空白がくっついたままでDBに格納して、printでそれに気づいてないということではないでしょうか。 print $hash; でなく、var_dump($hash); してみてください。 あるいは print bin2hex($hash); で16進数に直してチェックするのが良いかも。

nike_bmura
質問者

お礼

コメントありがとうございます! var_dump($hash)はやってみたんです……でも同じでした…… print bin2hex($hash); はやってないので、やってみます。ありがとうございます!