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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

1回答

1177閲覧

PHPの記述について

hainan

総合スコア31

PHP

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

0グッド

0クリップ

投稿2017/08/17 01:57

編集2017/08/17 04:32

###前提・実現したいこと
「気づけば プロ並み 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」が表示される

HTML

1「staff_login.html」のコードは以下です。 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="utf-8"> 6 <title>ろくまる農園</title> 7</head> 8<body> 9 スタッフログイン<br> 10 <br> 11 <form method="post" action="staff_login_check.php"> 12 スタッフコード<br> 13 <input type="text" name="code"><br> 14 パスワード<br> 15 <input type="password" name="pass"><br> 16 <br> 17 <input type="submit" value="ログイン"> 18 </form> 19</body> 20</html> 21

PHP

1「staff_login_check.php」のコードは以下です。 2<?php 3 4try{ 5 $staff_code=$_POST['code']; 6 $staff_pass=$_POST['pass']; 7 8 $staff_code=htmlspecialchars($staff_code,ENT_QUOTES,'UTF-8'); 9 $staff_pass=htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); 10 11 $staff_pass=md5($staff_pass); 12 13 $dsn='mysql:dbname=shop;host=loalhost;charset=utf8'; 14 $user='root'; 15 $password=''; 16 $dbh=new PDO($dsn,$user,$password); 17 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 18 19 $sql='SELECT name FROM mst_staff WHERE code=? AND password=?'; 20 $stmt=$dbh->prepare($sql); 21 $data[]=$staff_code; 22 $data[]=$staff_pass; 23 $stmt->execute($data); 24 25 $dbh=null; 26 27 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 28 29 if($rec==false){ 30 print 'スタッフコードかパスワードが間違っています。<br>'; 31 print '<a href="staff_login.html">戻る<br>'; 32 }else{ 33 header('Location:staff_top.php'); 34 exit(); 35 } 36}catch(Exception $e){ 37 print 'ただいま障害により大変ご迷惑をおかけしております。'; 38 exit(); 39}

PHP

1「staff_top.php」のコードは以下です。 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="utf-8"> 6 <title>ろくまる農園</title> 7</head> 8<body> 9 ショップ管理トップメニュー<br> 10 <br> 11 <a href="../staff/staff_list.php">スタッフ管理</a><br> 12 <br> 13 <a href="../product/pro_list.php">商品管理</a><br> 14</body> 15</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に指定するとエラーになる

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/08/17 02:01

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

2017/08/17 02:25

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

回答1

0

ベストアンサー

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

php

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

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

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

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

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

投稿2017/08/17 02:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hainan

2017/08/17 02:46 編集

回答ありがとうございます。 いただいた、「 echo '捕捉した例外: ', $e->getMessage(), "\n";」を入れて実行してみたのですが、 以前は出てきていたエラーメッセージ(ただいま障害により~)が 今は出てこなくなり、どの画面でもstaff_login_check.phpのコード自体が表示されるようになりました・・・。 他の「スタッフを追加する」などサーバーのやり取りをする項目については 問題なく追加・削除・修正・参照ができるのですが、 XAMPPを入れなおしたほうがいいでしょうか。。 スクリプトについても、ご指摘ありがとうございます。 本に記載されている記述方法などは、本自体にも「安全でない」と書かれており ネットで挙げない(ローカルにとどめる)よう注意がされていました。 また、徳丸浩さん協力の改修版だったので (基礎を学んでいる最中なので)最低限が理解できるかな、と思い 購入し勉強を進めております。 他のサイトも併用して勉強しているので まずはPHPの基礎ができてから、危険と思われる箇所が改修できるように セキュリティに関する部分を学んでいけたらと思います。
退会済みユーザー

退会済みユーザー

2017/08/17 02:56

コードそのものが表示されるのは、スクリプトが web サーバを通っていない場合です。staff_login.html をダブルクリックで開いているとかじゃないですか? あと、徳丸さんの改修は入っていないと思います。 *入っていれば、私が指摘したような点は残っていないはずです。 副読本は協力しているみたいですが、そちらは目を通しましたか? http://blog.tokumaru.org/2014/10/php-book.html
hainan

2017/08/17 03:05

ご指摘ありがとうございます。 ダブルクリックで html を開いておりました。申し訳ありません。 もう一度開いてみたところ、以下のエラーが表示されました。 これはSQLの文章がおかしいといったことでしょうか・・・。 (もう少し自分でも調べてみます) エラー: 捕捉した例外: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: ���̂悤�ȃz�X�g�͕s���ł��B 改修は入っていないんですね。失礼しました。 副読本はまだ大まかにしか見ていないのですが、レベルが高いので 一通り本を読み切ってから確認してみます。
退会済みユーザー

退会済みユーザー

2017/08/17 07: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';
cs_sonar

2017/08/17 08:15 編集

ご提示頂いているソースの $dsn='mysql:dbname=shop;host=loalhost;charset=utf8'; でDB接続先の名前解決失敗しているのは、localhostが誤字になってるのが原因ではないかと思います。 loalhost => localhost 127.0.0.1でもいいと思いますがTCP経由になるのでちょっと意味が違ってくるので、ソケット接続失敗しているなどの理由以外であればlocalhostの方がよさげです。
退会済みユーザー

退会済みユーザー

2017/08/17 08:18

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

2017/08/18 00:23 編集

すいません、見逃していました・・・。 本当にありがとうございます!!動きました! もっと誤字など見つけられるように気を付けます_| ̄|〇
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問