質問: ### 前提・実現したいこと 「気づけば プロ並み 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」のコードは以下です。 ろくまる農園 スタッフログイン スタッフコード パスワード ``` ``` 「staff_login_check.php」のコードは以下です。 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 'スタッフコードかパスワードが間違っています。'; print '戻る'; }else{ header('Location:staff_top.php'); exit(); } }catch(Exception $e){ print 'ただいま障害により大変ご迷惑をおかけしております。'; exit(); } ``` ``` 「staff_top.php」のコードは以下です。 ろくまる農園 ショップ管理トップメニュー スタッフ管理 商品管理 ``` ### 試したこと 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に指定するとエラーになる エラーログも確認してみましたが、実行後の同時刻のエラーは見つけきれませんでした。
回答: チェック用のPHPサイトが何を指すのか分かりませんが、「ただいま障害により大変ご迷惑をおかけしております。」が表示されるのは、DB 関連で失敗していると考えられるので ``` catch (Exception $e) { echo '捕捉した例外: ', $e->getMessage(), "\n"; } ``` とでもしてエラー内容を確認してください。 ただ、このスクリプト、全体的によろしくないです。 ・md5 を使用している ・パスワードを`htmlspecialchars`でエスケープ後にハッシュ化して比較している。 ・`$_POST['code']`等、存在チェックなしに使用している。 ざっと目についた箇所ですが、以上の点が好ましくない処理をしています。 ちゃんと学べるサンプルを選び直したほうが良いかと。