ボールドテキスト### password_verify関数を使い、認証システムを作りたい
phpファイルで作業し、パスワード認証システムを実装中にエラーが出力されました。
発生している問題・エラーメッセージ
Notice: Trying to access array offset on value of type bool in /Applications/MAMP/htdocs/templates/login.php on line 12
該当のソースコード
login.php
PHP
1<?php 2ini_set('display_errors', 1); 3error_reporting(E_ALL); 4session_start(); 5$loginerror['vali']=""; 6require('join/dbconnect.php'); 7if(!empty($_POST)){ 8try{ 9 $member1 = $db->prepare('SELECT * FROM members where email=?'); 10 $member1->execute(array($_POST['email'])); 11 $result = $member1->fetch(); 12 if(password_verify($_POST['password'],$result['password'])){ 13 header('Location: index.php'); 14 exit(); 15 } 16} 17 catch(PDOException $e){ 18 print('db接続エラー' . $e->getMessage()); 19 } 20?> 21 22<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 23<html xmlns="http://www.w3.org/1999/xhtml"> 24<head> 25<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 26<link rel="stylesheet" type="text/css" href="style.css" /> 27<title>ログインする</title> 28</head> 29 30<body> 31<div id="wrap"> 32 <div id="head"> 33 <h1>ログインする</h1> 34 </div> 35 <div id="content"> 36 <div id="lead"> 37 <p>メールアドレスとパスワードを記入してログインしてください。</p> 38 <p>入会手続きがまだの方はこちらからどうぞ。</p> 39 <p>»<a href="join/">入会手続きをする</a></p> 40 </div> 41 <form action="" method="post"> 42 <input type="hidden" name="action" value="submit" /> 43 <dl> 44 <dt>メールアドレス</dt> 45 <dd> 46 <input type="text" name="email" size="35" maxlength="255" value="" /> 47 </dd> 48 <dt>パスワード</dt> 49 <dd> 50 <input type="password" name="password" size="35" maxlength="255" value="" /> 51 </dd> 52 <dt>ログイン情報の記録</dt> 53 <dd> 54 <input id="save" type="checkbox" name="save" value="on"> 55 <label for="save">次回からは自動的にログインする</label> 56 <?php if($loginerror['vali'] === 'blank'):?> 57 <p class="error">メールアドレスとパスワードを入力してください></p> 58 <?php endif;?> 59 60 ?> 61 </dd> 62 </dl> 63 <div> 64 <input type="submit" value="ログインする" /> 65 </div> 66 </form> 67 </div> 68 <div id="foot"> 69 <p><img src="images/txt_copyright.png" width="136" height="15" alt="(C) H2O Space. MYCOM" /></p> 70 </div> 71</div> 72</body> 73</html> 74
dbconnect.php
PHP
1<?php 2try{ 3 $db = new PDO('mysql:dbname=mini_bbs;host=127.0.0.1;charset=utf8', 'root', 'root'); 4 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 5}catch(PDOException $e){ 6print('db接続エラー' . $e->getMessage()); 7} 8 9?>
試したこと
password_verify関数の部分が原因ということで、Qiita等で調べると、スカラー型変数に配列アクセスするとこのようなエラーが出ると書いてありました。しかし、$_POST,$resultはどちらも連想配列の扱いで、正当にアクセスしているように思えます。何か誤っている点がありましたら、ご教授お願いしたいです。アドバイスのもと、try-catchを使用しましたが、db側からのエラーの返答はない状態です。
追記
fetchメソッドがfalseを返す場合を考慮して、if文で検証したのちにpasswoed_verify関数を使うことで入力したパスワード、データベースのパスワードを比較できました。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/26 03:00 編集
退会済みユーザー
2020/02/26 04:12
2020/02/26 04:17