質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

PHPの記述について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 871

hainan

score 29

前提・実現したいこと

「気づけば プロ並み PHP(改訂版)」で勉強をしているのですが
調べても、動作が本通りにできず、相談させていただきました。

環境:XAMPP(バージョン 7.7.7)
OS:windows10(64bit)

発生している問題・エラーメッセージ

場所:Chapter4 以降のログイン画面作成画面
エラーメッセージ:ログインを試すとチェック用に用意したPHPのコードが表示されます。
試しに間違えて入力をしてみると、「ただいま障害により大変ご迷惑をおかけしております。」が表示されてきます。

[追記]
再度動作を確認してみたところ、ログインを試してもPHPのコード(記述したソースそのもの)が表示されてくるようになりました。

どこで違いが出てきたのかはわかりません。

また、Apacheのエラーログ(他のログも含めて)を確認してみましたが
ログインを試した後にログがあるか確認したところ、ログインを試した時間の
ログは確認できませんでした。

該当のソースコード

詰まった部分の流れとしては以下です。
2の部分で、なぜかPHPのソースが表示されてきました。

1.「staff_login.html」でログインのリクエスト
2.「staff_login_check.php」で内容のチェック
(内容が間違えていればエラー表示)
3.ログインが成功すれば「staff_top.php」が表示される

「staff_login.html」のコードは以下です。
<!DOCTYPE html>
<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,ENT_QUOTES,'UTF-8');
    $staff_pass=htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8');

    $staff_pass=md5($staff_pass);

    $dsn='mysql:dbname=shop;host=loalhost;charset=utf8';
    $user='root';
    $password='';
    $dbh=new PDO($dsn,$user,$password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    $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">戻る<br>';
    }else{
        header('Location:staff_top.php');
        exit();
    }
}catch(Exception $e){
    print 'ただいま障害により大変ご迷惑をおかけしております。';
    exit();
}
「staff_top.php」のコードは以下です。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ろくまる農園</title>
</head>
<body>
    ショップ管理トップメニュー<br>
    <br>
    <a href="../staff/staff_list.php">スタッフ管理</a><br>
    <br>
    <a href="../product/pro_list.php">商品管理</a><br>
</body>
</html>

試したこと

1.本を出しているサイトにて、正誤表の確認
→問題なし

2.本内にある別の章のコードと見比べてみる
→サーバー接続部分のみですが、あっているかと思われます。

3.他のサイトで同じ案件が上がっていないか確認
→見つけられませんでした

4.全角スペースがないかの確認
→なし

補足情報(言語/FW/ツール等のバージョンなど)

恐らく、try内にあるif文かサーバーの接続を行う部分に問題があるのかな・・・とは思うのですが
見つけられませんでした。

ご助力いただけますと幸いです。

追記(2017/08/17 13:30)

コメントでご指摘いただいた、

echo '捕捉した例外: ',  $e->getMessage(), "\n";

を追加し試してみたところ、以下のエラーメッセージが表示されました。

捕捉した例外: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: ���̂悤�ȃz�X�g�͕s���ł��B

さらにネットで調べていくと、IPの変換ができない(localhostで接続していること)
が原因とのことでしたので、試しに「http://127.0.0.1/staff_login/staff_login.html」でログインを行いましたが
エラーメッセージが変わらない状態です。

PHPのPDOでhostをlocalhostに指定するとエラーになる

エラーログも確認してみましたが、実行後の同時刻のエラーは見つけきれませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2017/08/17 11:01

    Apacheは正しくstartしてますでしょうか?Apacheのエラーログは確認してみましたか?

    キャンセル

  • hainan

    2017/08/17 11:25

    ご指摘ありがとうございます。Apacheは起動がしている状態です(XAMPP内で緑色表示になっています)。Logsを見てみたのですが、該当時刻にエラーが表示されている様子はありませんでした。

    キャンセル

回答 1

checkベストアンサー

+2

チェック用のPHPサイトが何を指すのか分かりませんが、「ただいま障害により大変ご迷惑をおかけしております。」が表示されるのは、DB 関連で失敗していると考えられるので

catch (Exception $e) {
    echo '捕捉した例外: ',  $e->getMessage(), "\n";
}


とでもしてエラー内容を確認してください。

ただ、このスクリプト、全体的によろしくないです。

・md5 を使用している
・パスワードをhtmlspecialcharsでエスケープ後にハッシュ化して比較している。
$_POST['code']等、存在チェックなしに使用している。

ざっと目についた箇所ですが、以上の点が好ましくない処理をしています。
ちゃんと学べるサンプルを選び直したほうが良いかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/17 17:14 編集

    ご提示頂いているソースの

    $dsn='mysql:dbname=shop;host=loalhost;charset=utf8';

    でDB接続先の名前解決失敗しているのは、localhostが誤字になってるのが原因ではないかと思います。
    loalhost => localhost
    127.0.0.1でもいいと思いますがTCP経由になるのでちょっと意味が違ってくるので、ソケット接続失敗しているなどの理由以外であればlocalhostの方がよさげです。

    キャンセル

  • 2017/08/17 17:18

    あ、ホントだ。TYPO ですね。localhost が解決できない理由が説明できなかったので、実は納得いかないコメントでした^^;
    指摘ありがとうございます。

    キャンセル

  • 2017/08/18 09:21 編集

    すいません、見逃していました・・・。
    本当にありがとうございます!!動きました!

    もっと誤字など見つけられるように気を付けます_| ̄|〇

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる