実現したいこと/ソースコード
ログインの認証時に、password_verifyで認証をしているのですが、認証されません。
また、別のテストページで少しスクリプトが違うハッシュ化と確認を試したところ正常にtrueが返されました。
コードは次のようになっています。
signup.php
php
1//~~~省略~~~ 2$emails = ""; 3$userids = ""; 4try { 5 $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8','user','password',, 6 array(PDO::ATTR_EMULATE_PREPARES => false)); 7}catch(PDOException $e){ 8 exit("spl"); 9} 10$stmt = $pdo->query("SELECT * FROM user_tb"); 11while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) { 12 $emails .= "[". $row["email"] ."]"; 13 $userids .= "[". $row["userid"] ."]"; 14} 15function ra(){ 16 $len=""; 17 for( $i = 0; $i < 10; $i++ ){ 18 $len.=substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10); 19 } 20 return $len; 21} 22 function newusers( $userids ) { 23 $kuserid=ra(); 24 if(strpos( $userids , $kuserid ) !== false){ 25 newusers(); 26 } else { 27 try { 28 $pdo = new PDO( 'mysql:host=example.jp;dbname=user_data;charset=utf8' , 'user' , 'password', 29 array(PDO::ATTR_EMULATE_PREPARES => false)); 30 } catch ( PDOException $e ){ 31 exit( "sql" ); 32 } 33 $name = $_POST['name']; 34 $email = $_POST['email']; 35 $pass1 = $_POST['password']; 36 $pass2 = $_POST['password2']; 37 $niti=date( "Y/m/d H:i:s" ); 38 $stmt = $pdo->prepare("INSERT INTO user_tb (name, password,password2,userid,createddate,email) VALUES (:name, :password,:password2,:userid,:createddate,:email)"); 39 $pass1s=password_hash($pass1, PASSWORD_DEFAULT);//ここでハッシュ化 40 $pass2s=password_hash($pass2, PASSWORD_DEFAULT);//ここでハッシュ化 41 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 42 $stmt->bindParam(':password', $pass1s, PDO::PARAM_STR); 43 $stmt->bindParam(':password2', $pass2s, PDO::PARAM_STR); 44 $stmt->bindParam(':email', $email, PDO::PARAM_STR); 45 $stmt->bindParam(':userid', $kuserid, PDO::PARAM_STR); 46 $stmt->bindParam(':createddate', $niti, PDO::PARAM_STR); 47 $stmt->execute(); 48 $_SESSION['id'] = $kuserid; 49 exit("ok"); 50 } 51 } 52function fu001 ( $emails ) { 53 $email = $_POST['email']; 54 if(strpos( $emails , $email ) !== false){ 55 exit( "emailerror" ); 56 }else { 57 newusers( $userids ); 58 } 59} 60fu001( $emails ); 61//~~~省略~~~
login.php
php
1try{ 2 $emails = array(); 3 $passs = array(); 4 $userids = array(); 5 $ivs = array(); 6 $pdo = new PDO( 'mysql:host=example.jp;dbname=user_data;charset=utf8' , 'user' , 'password' , 7array(PDO::ATTR_EMULATE_PREPARES=>false)); 8}catch( PDOException $e ) { 9 exit('sql'); 10} 11$stmt = $pdo->query("SELECT * FROM user_tb"); 12while($row = $stmt -> fetch(PDO::FETCH_ASSOC)){ 13$emails[] = $row["email"]; 14$passs[] = $row["password"]; 15$userids[] = $row["userid"];} 16$email = $_POST['mail']; 17if( in_array( $email, $emails ) ){}else{ exit("error"); }//メールアドレスが存在するかどうか 18$pass = $_POST['pass']; 19$mi = count($emails); 20for( $i = 0; $i < $mi; $i++ ){ 21 if( $emails[$i] === $email ){ 22 if( password_verify( $pass , $passs[$i]) ) {//ここで確認 23 $_SESSION['id'] = $userids[$i]; 24 exit("login"); 25 }else{ 26 exit("pass"); 27 } 28 } 29}
※質問に関係ない部分は一部省略しているほか、一部実際と異なりますが質問のコードとは無関係です。
何回アカウントを作り直してもfalseになってしまいます。
追記1
回答者からいただいたソースコードでlogin.phpのコードを改めました。
php
1try { 2 $pdo = new PDO('mysql:host=example.jp;dbname=user_data;charset=utf8','user','password', 3 array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) 4 ); 5 $stmt = $pdo->prepare('SELECT userid, email, password FROM user_tb WHERE email = :email'); 6 $stmt->bindValue(':email', $_POST['mail']); 7 $stmt->execute(); 8 $result = $stmt->fetchAll(); 9 if ($result === false) { 10 exit('fetch error'); 11 } 12 if ($resul ===array()){ 13 exit('pass'); 14 } 15 //exit($_POST['pass'].":". $result[0]['password']); 16 if (password_verify($_POST['pass'], $result[0]['password'])) { 17 $_SESSION['id'] = $result[0]['userid']; 18 exit('login'); 19 } 20 else { 21 exit('pass'); 22 } 23} catch (PDOException $e) { 24 exit('sql:' . $e->message); 25}
情報
皆様、貴重なお時間を頂きこの質問に回答してくださり、誠にありがとうございました。
今回解決することはできませんでしたが、質問の仕方に対する指摘等を、大切なお時間を割いて回答していただき非常に感謝しております。
お忙しい中ありがとうございました。