password_verifyによる認証に失敗してしまった場合、Noticeエラーが出てしまいます。今までは、認証に失敗してもNoticeエラーとはならず、falseとなるだけでした。Noticeエラーが出てしまう、理由が分からないため、ご教示頂ければ幸いです。
該当のコードは、以下のlogin.phpです。
php
1<?php 2include 'shop_class.php'; 3$shop = new shop('mysql:host=localhost;dbname=ec_website','root','12345'); 4$err = []; 5 6 7if($_POST){ 8 $user_name = filter_input(INPUT_POST,'user_name'); 9 $password = filter_input(INPUT_POST,'password'); 10 11 if(!$user_name){ 12 $err[] = 'ユーザー名を入力してください'; 13 } 14 if(!$password){ 15 $err[] = 'パスワードを入力してください'; 16 } 17 18 19 if(!count($err) > 0){ 20 // var_dump($err); 21 // echo 'ng'; 22 // exit(); 23 24 $user_info = $shop->login_check($user_name); 25 26 if(count($user_info) > 0){ 27 28 if(password_verify($password,$user_info['password'])){ 29 echo 'top.phpへ遷移'; 30 //header('Location:top.php'); 31 exit(); 32 33 }else{ 34 $err[] = 'ユーザー名あるいはパスワードが違います'; 35 } 36 37 }else{ 38 $err[] = 'ユーザー名あるいはパスワードが違います'; 39 40 } 41 42 } 43 44} 45 46 47?> 48 49 50 51 52 53 54 55 56 57 58 59<!DOCTYPE html> 60<html lang="ja"> 61<head> 62 <meta charset="UTF-8"> 63 <link type="text/css" rel="stylesheet" href="./css/common.css"> 64 <title>user_regiseter</title> 65 66</head> 67<body> 68 <header class="header_box"> 69 <a href="user_register.php"> 70 <img class ="logo" src="./images/logo.png" alt="CodeShop"> 71 </a> 72 <a href="cart.php"> 73 <img src="./images/cart.png" alt="cart"> 74 </a> 75 </header> 76 77 <div class="content"> 78 79 <?php if($err):?> 80 <div class="check_msg"> 81 <?php foreach($err as $msg): ?> 82 83 <span class="err"><?=$msg;?></span> 84 85 <?php endforeach;?> 86 </div> 87 88 <?php endif;?> 89 90 91 <form class="form" method="post" action="login.php" > 92 <p><input type="text" name="user_name" placeholder="ユーザー名"></p> 93 <p>パスワード:<input type="password" name="password" placeholder="パスワード"></p> 94 <input type="submit" value="ログイン"> 95 </form> 96 97 <a class="login_link" href="user_register.php">ユーザー新規作成</a> 98 99 </div> 100 101</body> 102</html>
下記は、shop_class.phpです
php
1 2<?php 3 4class Shop 5{ 6 7 private $dbh; 8 9 public function __construct($dsn,$user,$password){ 10 $dbh = new PDO($dsn,$user,$password); 11 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 12 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 13 $this->dbh = $dbh; 14 } 15 16 public function h($str){ 17 return htmlspecialchars($str,ENT_QUOTES,'UTF-8'); 18 } 19 20 public function write($user_name,$password){ 21 22 $stmt = $this->dbh->prepare("INSERT INTO user(user_name,password,created_at)VALUES(:user_name,:password,now())"); 23 $stmt->bindValue(':user_name',$user_name,PDO::PARAM_STR); 24 $stmt->bindValue(':password',$password,PDO::PARAM_STR); 25 $stmt->execute(); 26 27 28 } 29 30 public function user_check($user_name){ 31 $stmt = $this->dbh->prepare("SELECT user_name FROM user WHERE user_name = :user_name"); 32 $stmt->bindValue(':user_name',$user_name,PDO::PARAM_STR); 33 $stmt->execute(); 34 $result = $stmt->fetchALL(PDO::FETCH_ASSOC); 35 if(count($result) > 0){ 36 return '同じユーザー名が既に登録されています'; 37 } 38 return 'ok'; 39 40 } 41 42 public function login_check($user_name){ 43 $stmt = $this->dbh->prepare(" SELECT user_name,password FROM user WHERE user_name = :user_name "); 44 $stmt->bindValue(':user_name',$user_name,PDO::PARAM_STR); 45 $stmt->execute(); 46 $user_info = $stmt->fetchALL(PDO::FETCH_ASSOC); 47 return $user_info; 48 49 } 50 51}
以下はエラーの内容になります。 「Notice: Undefined index: password in C:\xampp\xampp\htdocs\ec_website\login.php on line 28」 追記です。$user_infoの中身なのですが、$user_info = $shop->login_check($user_name);ここの時点では、キー「password」及び「user_name」は存在しています。 追記です。
$user_info = $shop->login_check($user_name);
var_dump($user_info);
if(count($user_info) > 0){ var_dump($user_info); if(password_verify($password,$user_info['password'])){
上記の、「$user_info」の返り値は、上から、「array(1) { [0]=> array(2) { ["user_name"]=> string(7) "yamada1" ["password"]=> string(60) "$2y$10$wVmi2NTWAK857dsfUTIG1O5r0krEMP2m1yfVH6MXva1XJbJbtH3my" } }」 その下のvar_dumpの結果は、「array(1) { [0]=> array(2) { ["user_name"]=> string(7) "yamada1" ["password"]=> string(60) "$2y$10$wVmi2NTWAK857dsfUTIG1O5r0krEMP2m1yfVH6MXva1XJbJbtH3my" } }」 です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/26 05:23
2019/04/26 05:33
2019/04/26 05:34
2019/04/26 05:35
2019/04/26 05:55
2019/04/26 06:03
2019/04/26 06:21