よく分かるphpの教科書という本で勉強中です。
正しいパスワードとメールアドレスを入れてもログインできません。なぜでしょうか。仕組みを理解してコードを書いてない為訳が分からず困っています。
login.php
<!doctype html> <html lang="ja"> <head> <meta charset=utf8> </head> <body> <?php require('dbconnect.php'); session_start(); if(!empty($_COOKIE['email'])&&$_COOKIE['email'] != ''){ $_POST['email']=$_COOKIE['email']; $_POST['email']=$_COOKIE['password']; $_POST['save']='on'; } if(!empty($_POST)){ //ログイン処理 if($_POST['email']!=''&&isset($_POST['password'])&&$_POST['password']!=''){ $login=$db->prepare('SELECT * FROM members WHERE email=? AND password=?'); $login->execute(array( $_POST['email'], sha1($_POST['password']) )); $member=$login->fetch(); if($member){ //ログイン成功 $_SESSION['id']=$member['id']; $_SESSION['time']=time(); //ログイン情報を記録する if($_POST['save']=='on'){ setcookie('email',$_POST['email'],time()+60*60*24*14); setcookie('password',$_POST['password'],time()+60*60*24*14); } header('Location:index.php'); exit(); }else{ $error['login']='failed'; } }else{ $error['login']='blank'; } } ?> <div id="lead"> <p>メールアドレスとパスワードを記入してログインしてください。</p> <p>入会手続きがまだの方はこちらからどうぞ。</p> <p>»<a href="join/">入会手続きをする</a></p> </div> <form action="" method="post"> <dl> <dt>メールアドレス</dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php if(!empty($_POST['email'])){ echo htmlspecialchars($_POST['email'],ENT_QUOTES);}?>"/> <?php if(isset($error['login'])&&$error['login']=='blank'):?> <p class="error">メールアドレスとパスワードをご記入ください。</p> <?php endif;?> <?php if(isset($error['login'])&&$error['login']=='failed'):?> <p class="error">ログインに失敗しました。正しくご記入ください。</p> <?php endif;?> </dd> <dt>パスワード</dt> <dd> <input type="password" name="password" size="35" maxlength="255" value="<?php if(!empty($_POST['password'])){echo htmlspecialchars($_POST[password],ENT_QUOTES);}?>"/> </dd> <dt>ログイン情報の記録</dt> <dd> <input id="save" type="checkbox" name="save" value="on"><label for="save">次回からは自動的にログインする。</label> </dd> </dl> <div><input type="submit" value="ログインする"/></div> </body>
index.php
<?php session_start(); require('dbconnect.php'); if(isset($_SESSION['id'])&&$_SESSION['time']+3600>time()){ //ログインしている $_SESSION['time']=time(); $members=$db->prepare('SELECT * FROM members WHERE id=?'); $members->execute(array($_SESSION['id'])); $member=$members->fetch(); }else{ //ログインしてない header('Location:login.php'); exit(); } //投稿を記録する if(!empty($_POST)){ if($_POST['message']!=''){ $message=$db->prepare('INSERT INTO posts SET member_id=?,message=?,reply_post_id=?,created=NOW()'); $message->execute(array( $member['id'], $_POST['message'], $_POST['reply_post_id'] )); header('Location:index.php'); exit(); } } //投稿を取得する $posts=$db->query('SELECT m.name ,m.picture, p.* FROM members m,posts p WHERE m.id=p.member_id ORDER BY p.created DESC'); //返信の場合 if(isset($_REQUEST['res'])){ $response=$db->prepare('SELECT m.name,m.picture,p.* FROM members m,posts p WHERE m.id=p.member_id AND p.id=? ORDER BY p.created DESC'); $response->execute(array($_REQUEST['res'])); $table=$response->fetch(); $message='@'.$table['name'].' '.$table['message']; } ?> <!doctypehtml> <html lang="ja"> <head> <meta charset=utf8> </head> <body> <form action="" method="post"> <dl> <dt><?php echo htmlspecialchars($member['name'],ENT_QUOTES);?>さんメッセージをどうぞ</dt> <dd> <textarea name="message" cols="50" rows="5"><?php echo htmlspecialchars($message,ENT_QUOTES);?></textarea> <input type="hidden" name="reply_post_id" value="<?php echo htmlspecialchars($_REQUEST['res'],ENT_QUOTES);?>"/> </dd> </dl> <div> <input type="submit" value="投稿する"/> </div> </form> <?php foreach($posts as $post):?> <hr> <div class="msg"> <img src="member_picture/<?php echo htmlspecialchars($post['picture'],ENT_QUOTES);?>" width="48" height="48" alt=<?php echo htmlspecialchars($post['name'],ENT_QUOTES);?>> <p><?php echo htmlspecialchars($post['message'],ENT_QUOTES);?><span class="name">(<?php echo htmlspecialchars($post['name'],ENT_QUOTES);?>)</span> [<a href="index.php?res=<?php echo htmlspecialchars($post['id'],ENT_QUOTES);?>">RE</a>] </p> <p class="day"><?php echo htmlspecialchars($post['created'],ENT_QUOTES);?></p> </div> <?php endforeach;?> </body>
dbconnect.php
<!doctype html> <html lang ="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel ="stylesheet" href="css/style.css"> </head> <body> <?php try{ $db=new PDO ('mysql:dbname=mini_bbs;host=127.0.0.1;charset=utf8','root','s@kana51'); }catch(PDOException $e){ echo 'DB接続エラー:'.$e->getMessage(); } ?>
index.php-post¥join
<!doctype html> <html lang="ja"> <head> <meta charset=utf8> </head> <body> <?php require('dbconnect.php'); session_start(); if(!empty($_COOKIE['email'])&&$_COOKIE['email'] != ''){ $_POST['email']=$_COOKIE['email']; $_POST['email']=$_COOKIE['password']; $_POST['save']='on'; } var_dump($_POST); if(!empty($_POST)){ //ログイン処理 if($_POST['email']!=''&&isset($_POST['password'])&&$_POST['password']!=''){ $login=$db->prepare('SELECT * FROM members WHERE email=? AND password=?'); $login->execute(array( $_POST['email'], sha1($_POST['password']) )); $member=$login->fetch(); if($member){ //ログイン成功 $_SESSION['id']=$member['id']; $_SESSION['time']=time(); //ログイン情報を記録する if($_POST['save']=='on'){ setcookie('email',$_POST['email'],time()+60*60*24*14); setcookie('password',$_POST['password'],time()+60*60*24*14); } header('Location:index.php'); exit(); }else{ $error['login']='failed'; } }else{ $error['login']='blank'; } } ?> <div id="lead"> <p>メールアドレスとパスワードを記入してログインしてください。</p> <p>入会手続きがまだの方はこちらからどうぞ。</p> <p>»<a href="join/">入会手続きをする</a></p> </div> <form action="" method="post"> <dl> <dt>メールアドレス</dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php if(!empty($_POST['email'])){ echo htmlspecialchars($_POST['email'],ENT_QUOTES);}?>"/> <?php if(isset($error['login'])&&$error['login']=='blank'):?> <p class="error">メールアドレスとパスワードをご記入ください。</p> <?php endif;?> <?php if(isset($error['login'])&&$error['login']=='failed'):?> <p class="error">ログインに失敗しました。正しくご記入ください。</p> <?php endif;?> </dd> <dt>パスワード</dt> <dd> <input type="password" name="password" size="35" maxlength="255" value="<?php if(!empty($_POST['password'])){echo htmlspecialchars($_POST['password'],ENT_QUOTES);}?>"/> </dd> <dt>ログイン情報の記録</dt> <dd> <input id="save" type="checkbox" name="save" value="on"><label for="save">次回からは自動的にログインする。</label> </dd> </dl> <div><input type="submit" value="ログインする"/></div> </body>
試したこと
var_dumpを使って変数の内容を見てみること
login.phpの16行目にvar_dump($_POST)を打ってみたらこんなのが出てきました。
array(3) { ["email"]=> string(8) "sakana51" ["password"]=> string(12) "ab@gmail.com" ["save"]=> string(2) "on" }
sakana51というのはパスワードのつもりでいれましたがemailに入っています。メールアドレスとパスワードが逆に入っているのではないかと思い、フォームの所を間違ってないか見てみたり、逆にメールアドレスとパスワードを入れてログインできるか試みたのですがログインできませんでした。でもlogin.phpの$_POSTの前で何かが起こっているはずなのでもう少し探してみます。
開発環境はWindows10でxamppを使ってます。よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー