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

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

ただいまの
回答率

90.50%

  • PHP

    23945questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPの記述について

解決済

回答 1

投稿 編集

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

hainan

score 23

前提・実現したいこと

「気づけば プロ並み 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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    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 11:34 編集

    回答ありがとうございます。
    いただいた、「 echo '捕捉した例外: ', $e->getMessage(), "\n";」を入れて実行してみたのですが、
    以前は出てきていたエラーメッセージ(ただいま障害により~)が
    今は出てこなくなり、どの画面でもstaff_login_check.phpのコード自体が表示されるようになりました・・・。

    他の「スタッフを追加する」などサーバーのやり取りをする項目については
    問題なく追加・削除・修正・参照ができるのですが、
    XAMPPを入れなおしたほうがいいでしょうか。。

    スクリプトについても、ご指摘ありがとうございます。
    本に記載されている記述方法などは、本自体にも「安全でない」と書かれており
    ネットで挙げない(ローカルにとどめる)よう注意がされていました。

    また、徳丸浩さん協力の改修版だったので
    (基礎を学んでいる最中なので)最低限が理解できるかな、と思い
    購入し勉強を進めております。

    他のサイトも併用して勉強しているので
    まずはPHPの基礎ができてから、危険と思われる箇所が改修できるように
    セキュリティに関する部分を学んでいけたらと思います。

    キャンセル

  • 2017/08/17 11:56

    コードそのものが表示されるのは、スクリプトが web サーバを通っていない場合です。staff_login.html をダブルクリックで開いているとかじゃないですか?

    あと、徳丸さんの改修は入っていないと思います。
    *入っていれば、私が指摘したような点は残っていないはずです。
    副読本は協力しているみたいですが、そちらは目を通しましたか?
    http://blog.tokumaru.org/2014/10/php-book.html

    キャンセル

  • 2017/08/17 12:05

    ご指摘ありがとうございます。
    ダブルクリックで html を開いておりました。申し訳ありません。

    もう一度開いてみたところ、以下のエラーが表示されました。
    これはSQLの文章がおかしいといったことでしょうか・・・。
    (もう少し自分でも調べてみます)

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


    改修は入っていないんですね。失礼しました。
    副読本はまだ大まかにしか見ていないのですが、レベルが高いので
    一通り本を読み切ってから確認してみます。

    キャンセル

  • 2017/08/17 16:55

    何で文字化けしてるんだろ。。。
    っていうのは一旦置いておいて、hainan さんが調べたリンクを辿っていくと、stackoverflow に辿り着きます。
    https://stackoverflow.com/questions/1676688/php-mysql-connection-not-working-2002-no-such-file-or-directory
    そこの記述を読むと、解決に有効そうな手段が幾つか載っています。
    とりあえず、リンク先でも採用している以下を試してみては?

    ・localhost を ループバックアドレスに置き換え
    $dsn='mysql:dbname=shop;host=127.0.0.1;charset=utf8';

    キャンセル

  • 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 編集

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

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    23945questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。