PHPのログイン画面でスタッフコードかパスワードが違いますとエラーが表示される

このQ&Aのポイント
  • phpで作成されたログイン画面で、スタッフコードやパスワードを正しく入力してもログインできず、エラーが表示されます。
  • スタッフのデータがデータベースに存在しているにもかかわらず、ログインができない問題が発生しています。
  • エラーメッセージが「スタッフコードかパスワードが違います」と表示され、解決方法や原因を知りたいです。
回答を見る
  • ベストアンサー

php ログインについて

php ログインについて phpでログイン画面を作っているのですがログインできません。エラー等々もでず、「スタッフコードかパスワードが違います」になります。ちなみにDBにはスタッフのデータはしっかり存在します。 コードとパスワードを正しく入力しているにもかかわらずログインできません。 ソースはこちらです [staff_login.php] <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>ログイン</title> </head> <body> スタッフログイン<br/> <br/> <form method="post" action="staff_login_check.php"> スタッフコード<br/> <input type="text" name="code"><br/> パスワード<br/> <input type="password" name="pass"><br/> <br/> <input type="submit" value="ログイン"> </form> </body> </html> [staff_login_check.php] <?php try { $staff_code=$_POST['code']; $staff_pass=$_POST['pass']; $staff_code=htmlspecialchars($staff_code); $staff_pass=htmlspecialchars($staff_pass); $staff_pass=md5($staff_pass); $dsn='mysql:dbname=*****;host=********'; $user='*********'; $password='********'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql='SELECT name FROM mst_staff WHERE code=? AND password=?'; $stmt=$dbh->prepare($sql); $data[]=$staff_code; $data[]=$staff_pass; $stmt->execute($data); $dbh = null; $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { print'スタッフコードかパスワードが違います<br/>'; print'<a href="staff_login.html">戻る</a>'; } else { header('Location: staff_top.php'); } } catch(Exception $e) { print'エラーが発生しました'; exit(); } ?> 解決方法、ご指摘ございましたら教えていただきたいです。

  • PHP
  • 回答数2
  • ありがとう数3

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

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

if($rec==false) を if(false) にしたらいいんじゃないですか?

a7a7a77a7a74
質問者

お礼

muuming2001 様 回答ありがとうございます。 おっしゃるとうりにいたしましたらちゃんとろぐいんできました!!! 原因が自分もわからず 教材どおりにやっているにもかかわらず困ってました。 本当にありがとうございます。 直接の問題解決につながりましたのでベストアンサーとさせていただきます。 本当にありがとうございました。 今後ともよろしくお願いいたします。

その他の回答 (1)

  • coai
  • ベストアンサー率50% (152/301)
回答No.2

明確に「ここが原因だな」と感じられる部分はない。 気になる点としては以下の3行 $staff_code=htmlspecialchars($staff_code); $staff_pass=htmlspecialchars($staff_pass); $staff_pass=md5($staff_pass); それぞれcodeやpassは、htmlspecialcharsが必要だろうか? DBにちゃんと、md5で取得した結果が登録されているだろうか? とりあえずその辺りをクリアするため、テストの為にmd5しない値をDBに登録してみてはどうだろうか? たとえば、phpMyAdminなどで直接DBに以下のような値を登録する name=テスト (実際にはなんでもいい) code=test (※半角英数で登録することで、文字コード依存の問題、htmlエンコードの問題を回避する) password=pass (※とりあえずmd5しない値で登録、code同様に半角英数で登録して問題回避) そのうえで、前記の3行をコメントアウトして動かないようにしておく。 それでテストして動いたなら、その3行に問題があったというわけで、おそらくDB登録時にmd5を忘れていたという可能性が高いか。 あるいは、DB作成時にフィールド長が短く設定していたため、32文字全部を格納されていないという可能性もないではない。 md5で登録したが、それをコピペッタンして登録した際に、前後に余分な空白が含まれてしまった可能性もないではない。 コードはザッと眺めただけだが、パッと見おかしい感じはしなかったし、エラーが出ていないという事で正しいと仮定すると、そしたらDBがおかしいのでは? という事です。 もっとも怪しいのはmd5絡みだと判断して、次がhtmlspecialchars辺り。 それで、一旦両者を使わない形でテストしてみたら、切り分けできるかなという意図です。

a7a7a77a7a74
質問者

お礼

coai 様 上記の方の回答の通りif($rec==false)をif(false)にすればうまくいきました。 私はPHP初心者レベルのものなので、この解決理由がわかりませんん。私のPHPの教材にはif($rec==false)で載っています。 ネットで調べましたがほかに同じ原因で悩んでいる人は見当たりませんでした。 なによりcoai 様がいろいろ原因を調べていただいたり、親身になってアドバイスしていただき本当にありがとうございます。 まだわからないことだらけなので 今後ともよろしくお願いいたします。 ありがとうございました!!

関連するQ&A

  • phpプリペアードステートメントについて質問です。

    phpの練習で、以下のようなhtmlファイルとphpファイルを作り XAMPで作業をおこなっています。 以下にあるhtml.phpファイルでのやり取りはうまくいっているのですが、 このphpをプリペアードステートメントにする所で躓いています。 いろいろ調べてやってはみたものの、どうしても%を使った あいまい検索のところがわかりません。 ---------------------------------------------------------------- 以下、プリペアードステートメントにする前の ページ内容です。こちらではうまくいっています。 html <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br /> <input name="code" type="text" style="width:100px"><br /> <br /> <input type="submit" value="送信"> </form> php <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso;host=localhost'; $user = 'root'; $password =''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['code']; print $rec['nickname']; print $rec['email']; print $rec['goiken']; print '<br />'; } $dbh = null; ?> ---------------------------------------------------------------- 以上のphpの中の以下の分を $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); ↓ $sql ="SELECT*FROM anketo WHERE goiken like ?"; $stmt = $dbh->prepare($sql); $data[] = $code; $stmt->execute(array("%$_GET[$data]%")); こんな風に直しては見たのですが、なんだか うまくい行かずです。 よろしければ教えてください。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHP ログインについて

    PHPを使い会員サイトを作っています。 遷移としては index→login→top でログインして中の各ページで、サイトロゴをクリックすればマイページトップに戻るようにしたいです。 ログイン時はPOSTでデータを受け取り、ログイン後はセッションで全ページを繋いでいます。 そののtopで困っています。 ログインしようとすると画面が真っ白になり、検証を見てもエラーは出ていませんでした。エラー表示になるよう設定しており、今までのエラーは見れていました。 session_start(); if(!isset( $_SESSION["uid"])&&(!isset( $_SESSION["pass"]))){ if(!isset ( $_POST ["uid"] )&&(!isset( $_POST["pass"]))){ header ( "Location: login.php" );} } if((isset ( $_POST ["uid"] ))&&(isset( $_POST["pass"]))){ login(); exit; } 上記で$_SESSIONのuidとpassがなければ$_POSTのuidとpassをチェック。$_POSTもなければ、login画面に移動。 $_POSTが入っていたら次のIF文で、関数login()。 関数login()は下記の通りです。 function login(){   function inputCheck($uid, $pass){ $flg=0; // IDの登録チェック require("dbConnect.php");//接続 $sql = "select * from usr where uid ={$uid}" ; //echo "sql=".$sql."<br>"; $result = $dbInfo->query ( $sql ); $record = $result->fetch ( PDO::FETCH_ASSOC ); $count = $result->rowCount (); if($count<=0){ echo "このIDは存在しません<br>"; $flg=1; } if($pass<>$record["pass"]){ echo "パスワードが違います<br>"; $flg=1; // データベースの切断 $dbInfo = null; } return $flg; } // 送信データの取得 $uid = htmlspecialchars($_POST ["uid"], ENT_QUOTES); $pass = htmlspecialchars($_POST ["pass"], ENT_QUOTES); $flg=inputCheck($uid, $pass); if($flg<>0){ require("login.php"); exit; }} 関数に入れ子で関数が使えると見たので中に入れましたが、inputCheck()をlogin()の外に出してみても同じように画面が真っ白になりました。 最初にログインだけ作って動かした際にはログインすることが出来ました。 ログイン状態のチェックが悪いのか関数の使い方が悪いのか、わかりません。 ご教授いただければ幸いです。

    • ベストアンサー
    • PHP
  • phpのコードでうまく動かず困っています

    現在ある書籍でログイン機能の基礎を学んでいるのですが、エラーが出て困っています。 書籍内のコードや付属のサンプルファイルの物をいれたり確認したりするのですがエラーがでます。 エラー Fatal error: Call to a member function bindParam() on a non-object in C:\xampp\htdocs\tennis\login.php on line 15 (この15行目は〇の部分です) コード <?php session_start(); //セッション開始 if(isset($_SESSION['id'])){ //セッションにユーザーIDがある(ログインしている) header('Location:index.php'); }else if(isset($_POST['name']) && isset($_POST['password'])){ $dsn = 'mysql:host=localhost; dbname=tennis; charset=utf8'; $user ='tennisuser'; $password = 'password'; try{ $db = new PDO($dsn, $user, $password); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $db->prepare("SELECT * FROM users WHERE name=:name AND password=:pass"); ○$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR); $stmt->bindParam(':pass', sha1($_POST['password']), PDO::PARAM_STR); //クエリ実行 $stmt->execute(); if($row = $stmt->fetch()){ //ユーザーが存在していたので、セッションにユーザーIDをセット $_SESSION['id'] = $row['id']; header('Location:index.php'); exit(); }else{ //1レコードも取得できなかった場合 //ユーザー名・パスワードは間違っている可能性があるのでもう一度ログインフォームを表示 header('Location:login.php'); exit(); } }catch(PDOException $e){ die('エラー:'.$e->getMessage()); } }else{ //ログインしていない場合はログインフォームを表示 ?> <html> ~省略~

    • ベストアンサー
    • PHP
  • PHPのログイン処理について

    PHPのログイン処理について教えてください。 「login_auth.phpファイル」 <?php //session開始 session_start(); session_regenerate_id(true); //エラーメッセージを格納する変数を初期化 $error_message=""; //ログインボタンが押されたかを確認 if(isset($_post["sub"])){ if($_post["auth_id"] == "auth" && $_post["auth_pass"] == "1234"){ //ログインが成功した証拠をセッションに保持する $_session["login_name"] = $_post["auth_id"]; //管理者トップへWebブラウザをリダイレクトさせる $login_url = "http://{$_server["http_host"]}/reservation/auth_top.php"; header("Location: {$login_url}"); exit; } $error_message = "IDかPASSが間違えています"; } ?> <html> <body> <?php if($error_message){ print '<font color="red">'.$error_message.'</font>'; } ?> <center> <hr size="2" color="blue" width="50%"><br><br> <font size="4"><b>管理者認証画面</b></font> <br><br><hr size="2" color="blue" width="50%"><br><br> ユーザID/パスワードを入力してください。 <form action="login_auth.php" method="post"> <table border="2"> <tr> <td bgcolor="cyan">ユーザID</td> <td><input type="text" name="auth_id" value=""></td> </tr> <tr> <td bgcolor="cyan">パスワード</td> <td><input type="password" name="auth_pass" value=""></td> </tr> </table> <input type="submit" name="sub" value="ログイン"> </form> <a href="javascript:window.close();" target=_parent>閉じる</a> </center> </body> </html> 「auth_top.phpファイル」 <?php //セッションを開始する session_start(); //ログインが成功した証拠である変数のチェックを行なう if (!isset($_SESSION["login_name"])) { //変数に値がセットされていない場合は不正な処理とみなし、ブラウザをログイン画面へリダイレクトさせます $no_login_url ="http://{$_server["http_host"]}/reservation/login_auth.php"; header("Location: {$no_login_url}"); exit; } ?> 管理者画面です。 この簡単なプログラムなんですが、IDとPASSを入力しても画面が切り替わりません。 今、そこで行き詰っています。 どなたか教えていただけないでしょうか??

    • 締切済み
    • PHP
  • 管理パスワードによる認証

    既存のファイルに管理者による認証を付加したいと思いますが、下記のコードではうまくいきません。アドバイス下さい。 <?php //パスワードの設定 $password = "admin"; //パスワードチェック passchk(); function passchk(){ global $password, $post; $p = $post['pass']; if ($p == $password) { echo "認証成功!"; // return; } else { echo<<<EOM <p>パスワードを確認して下さい。</p><br> <form action="login.php" method="post"> パスワード:<input type="password" name="pass" size="8"> <input type=submit value="ログイン" /> </form> EOM; exit; } } ?>

    • 締切済み
    • PHP
  • 特定のレコードだけを表示させるためのコード

    ●質問の主旨 kensaku.htmlから数字(データベースのコード番号)を入力・検索して、 PHPMyAdminにあるデータベースから、特定のレコードを取り出したいのですが、 データベースにあるすべてのデータが返されます。 検索窓に入力した特定のレコードの内容だけを 返すためには、下記のichiran.phpをどのように直せばよいでしょうか? ●プログラムの流れ 1.kensaku.htmlの検索窓に番号を入力・送信 2.PHPMyAdminにあるデータベース(aketo)にアクセス 3.ichiran.phpで検索結果を表示 ●プログラムコード (kensaku.html) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br/> <input name="code" type="text" style="width:100px"><br/> <br/> <input type="submit" value="送信"><br/> </body> </html> (ichiran.php) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso2;host=localhost'; $user = 'root'; $password = ''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = 'SELECT * FROM anketo WHERE code='.$code; $stmt = $dbh->prepare($sql); $stmt->execute(); $stmt->execute(); while(1) { $rec = $stmt->fetch(PDO::FETCH_ASSOC); if($rec == false) { break; } print$rec['code']; print$rec['nickname']; print$rec['email']; print$rec['goiken']; print'<br/>'; } $dbh = null; ?> </body> </html> ●開発環境 windows8 xammp1.8.1 MySQL(PHPMyAdmin)

    • ベストアンサー
    • MySQL
  • php ログインでセッションが切れる

    PHPでログインする機能があります。 ログインして操作をしていると問題はないのですが、数分(測っていないのですが5分~10分)操作をせず放置しているとログインが切れてしまいます。 セッションの有効期限は24時間にしています。 確認してもセッションの有効期限はログインを行って24時間にちゃんとなっています。 if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { // POSTで受け取ったパラメータを変数として展開 extract(filter_struct_utf8(INPUT_POST, array( 'email' => FILTER_STRUCT_FULL_TRIM, // トリミング 'pass' => '', 'token' => '', ))); // トークンをチェック Token::check($token); // IDをセッションに取得 $_SESSION['id'] = DB::connect()->userlogin($email, $pass); // セッションハイジャック対策 session_regenerate_id(true); // リダイレクト redirect(); } catch (Exception $e) { $errors = exception_to_array($e); } } 『userlogin』の部分 public function userlogin($email, $pass) { // 例外初期化 $e = null; // メールアドレスチェック if ($mail === '') { $e = e('メールアドレスが入力されていません。', $e); } // パスワードチェック if ($password === '') { $e = e('パスワードが入力されていません', $e); } // 1つでも例外が発生していればスローする if ($e) { throw $e; } // プリペアドステートメントを生成 $stmt = $this->pdo->prepare(implode(' ', array( 'SELECT `id`, `pass`', 'FROM `users`', 'WHERE `email` = ?', 'LIMIT 1', ))); // 値をバインドして実行 $stmt->execute(array($email)); // 見つかったかどうかチェック if (!$stmt->rowCount()) { throw e('そのメールアドレスは登録されていません。'); } // パスワード照合 $row = $stmt->fetch(); if ($row['pass'] !== password_hash($pass)) { throw e('パスワードが違います。'); } // IDを返す return (int)$row['id']; } ログイン処理に問題があるのでしょうか? それともサーバー側の設定(php.ini)なども何か設定を行ったほうがよいのでしょうか? 確認すべき点などございましたらアドバイスいただけませんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのセッションについて

    PHPのセッションについて 現在ログインフォームを作成しているのですが、 ログインフォームからIDとパスワードを送信して、合っていれば セッションを発行してロケーションで飛ばそうと思っているのですが、 初回時にIDとパスワードを入力して送信しても、セッションが引き継がれず 2回目以降だとセッションが引き継がれる症状に悩んでおります。 どなたかご教授ください。 宜しくお願いいたします。 【login.php】-------------------------------- <?php session_name("stock"); session_start(); $error_flag = 0; if(isset($_POST["login"])){ $id = htmlentities($_POST["id"],ENT_COMPAT); $password = trim(htmlentities($_POST["password"],ENT_COMPAT)); if($login_id == $id && $login_pass == $password){ $_SESSION["id"] = $id; $_SESSION["password"] = $password; header("Location:stock.php"); exit; }else{ $error_flag = 1; } } echo <<<EOD <form method="post" action="login.php" id="login"> <input type="text" name="id" id="id" > <input type="password" name="password" id="password"> <input type="submit" name="login" value="ログイン" /> </form> EOD; 【stock.php】--------------------------------- <?php session_name("stock"); session_start(); echo $_SESSION["id"]; echo $_SESSION["password"]; ?>

    • ベストアンサー
    • PHP
  • 一つのphpファイルでログイン画面を作りたい

    一つのphpファイルでログイン画面を作りたい 一つのphpファイルでログイン画面→管理者画面 ログインエラー画面を作りたいと思っております。 下記のスクリプトで上手くセッションが保持できないので、 どなたかご教授ください。 宜しくお願いいたします。 -------------------------------------------- session_start(); //パスワードチェック $error_flag = 0; if(isset($_POST["login"])){ if($_POST["id"] == $login_id && $_POST["password"] == $login_pass){ $_SESSION["login"]["admin"] = 1; }else{ $error_flag = 1; } } if(isset($_SESSION["login"]["admin"]) && $_SESSION["login"]["admin"] == 1){ //管理者画面 }else{ //エラー画面 }

    • ベストアンサー
    • PHP
  • PHP初心者です。何処がエラーなのかさっぱり解りません。

    超初心者です。 PHPの勉強を始めたばかりで、いきなりつまずいています。 下記の表示になりエラーになっているのですが、何処がエラーなのか意味が解りません。 Parse error: syntax error, unexpected $end in C:\xampp\htdocs\phplesson\03\login.php on line 31 どなたか教えてください。 よろしくお願いします。 ----------------- <?php session_start(); $error_message = ""; //ログインボタンが押されたかを判定 if (isset($_POST["login"])) { if ($_POST["member_name"] == "php" && $_POST["password"] == "password") { //ログインが成功した証拠をセッションに保持 $_SESSION["login_name"] = $_POST["member_name"]; //管理者専用画面へWebブラウザをリダイレクトさせる $login_url = "http://{$_SERVER["HTTP_HOST"]}/phplesson/03/anq_result.php"; header("Location: {$login_url}"); exit; } $error_message ="メンバー名かパスワードを間違えています。"; } ?> <html> <body> <?php if ($error_message) { print '<font color="red">' .$error_message. '</font>'; } ?> <form action="/phplesson/03/login.php" method="post"> メンバー名:<input type="text" name="member_name" value="" /><br /> パスワード:<input type="password" name="password" value="" /><br /> <input type="submit" name="login" value="ログイン" /> </form> </body> </html>

    • ベストアンサー
    • PHP