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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2963閲覧

thanks.phpの表示

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/08/21 05:38

編集2019/08/21 05:54

フォーム入力を完了した後に、thanks.phpに移動したのですが、thanks.phpで命令した「〜様ありがとう〜(省略)〜」の様な表示が出てくるはずなのですが、現在、真っ白な画面が広がっており、なにも表示されません。

是非、解決する方法を教えて下さい。
又、改善する点がありましたら、
ファイル名
改善場所の明確な位置
変更前のコード
変更後のコード
問題だった点の説明を是非お願いしたいです。
よろしくお願いします。

index.html

html

1<html> 2 <head> 3 <meta http-equiv="content-type" charset="utf-8"> 4 </head> 5 <body> 6 <form method="POST" action="check.php"> 7 ニックネームを入力して下さい<br> 8 <input name="nickname" type="text" style="width: 100px"><br> 9 メールアドレスを入力して下さい。<br> 10 <input name="email" type="text" style="width: 200px"><br> 11 ご意見を一言でお聞かせ下さい。<br> 12 <input name="goiken" type="text" style="width: 300px"><br> 13 <br> 14 <input type="submit" value="送信"> 15 </form> 16 17 </body> 18</html>

check.php

php

1<html> 2 <head> 3 <meta http-equiv="content-type" charset="utf-8"> 4 </head> 5 6 7 <body> 8 9 <?php 10 $nickname=filter_input(INPUT_POST,"nickname"); 11 $email=filter_input(INPUT_POST,"email"); 12 $goiken=filter_input(INPUT_POST,"goiken"); 13 14 $nickname=htmlspecialchars($nickname); 15 $email=htmlspecialchars($email); 16 $goiken=htmlspecialchars($goiken); 17 18 if($nickname=="") 19 { 20 print"ニックネームが入力されていません。<br>"; 21 } 22 else 23 { 24 print"ようこそ"; 25 print $nickname; 26 print"様"; 27 print"<br>"; 28 } 29 30 if($email=="") 31 { 32 print"メールアドレスが入力されていません。<br>"; 33 } 34 else 35 { 36 print"メールアドレス:"; 37 print$email; 38 print"<br>"; 39 } 40 41 if($goiken=="") 42{ 43 print"ご意見が入力されていません。<br>"; 44} 45else 46{ 47 print"ご意見『"; 48 print $goiken; 49 print"』<br>"; 50} 51 52if( $nickname==''||$email==''||$goiken=='') 53{ 54 print'<form>'; 55 print'<input type="button" onclick="history.back()" value="戻る">'; 56 print'</form>'; 57} 58else 59{ 60 print'<form method="post" action="thanks.php">'; 61 print '<input name="nickname" type="hidden" value="'.$nickname.'">'; 62 print '<input name="email" type="hidden" value="'.$email.'">'; 63 print '<input name="goiken" type="hidden" value="'.$goiken.'">'; 64 65 print'<input type="button" onclick="history.back()" value="戻る">'; 66 print'<input type="submit" value="OK">'; 67 print"</form>"; 68} 69?> 70 71 </body> 72</html>

thanks.php

php

1<!DOCTYPE HTML PUBLIC="-//W3C//DTD/HTML 4.01Transitional//EN"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UFT-8"> 5</head> 6<body> 7 8 9<?php 10$dsn = 'myspl;dbname=project;host=localhost'; 11$user = 'root'; 12$password = ''; 13$dbh = new PDO('$dsn,$user,$password'); 14$dbh ->query('SET NAME uft8'); 15 16$nickname=$_POST['nickname']; 17$email=$_POST['email']; 18$goiken=$_POST['goiken']; 19 20$nickname=htmlspecialchars($nickname); 21$email=htmlspecialchars($email); 22$goiken=htmlspecialchars($goiken); 23 24print$nickname; 25print'様<br>'; 26print'ご意見ありがとうございました<br>'; 27print'いただいたご意見『'; 28print$goiken; 29print'』<br>'; 30print$email; 31print'メールに送りましたのでご確認ください。'; 32 33$mail_sub='アンケート受け付けました'; 34$mail_body=$nickname."様へ/nアンケートにご協力いただきありがとうございました。"; 35$mail_body=html_entity_decode($mail_body,ENT_QUOTES,"UFT-8"); 36$mail_head='From:xxx@xx.co.jp'; 37mb_language('Japanese'); 38mb_internal_encoding("UFT-8"); 39mb_send_mail($mail,$mail_sub,$maail_body,$mail_head); 40 41$sql = 'INSERT INTO anketo (nickname,email,goiken)VALUES("'.$nickname.'","'.$email.'","'.$goiken.'")'; 42$stmt = $dbh->prepare($sql); 43$stmt ->execute(); 44 45$dbh = null; 46?> 47</body> 48</html>

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

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

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

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

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

m.ts10806

2019/08/21 05:46 編集

mb_send_mail()使われていますが、環境はどこでしょうか。 ローカルPCに作った環境であればメール送信には別途設定が必要です。
退会済みユーザー

退会済みユーザー

2019/08/21 05:51

起きている現象としましては、フォームを送信した後に、「〜様ありがとうございます〜(省略)〜」等のページを実装しましたが、thanks.phpに移動はしたものの、何も表示されなく、真っ白な画面が表示されている状況です。 メール機能には、現在関係はありませんので、それに関する回答は控えさせていただきます。ご了承ください。
m.ts10806

2019/08/21 05:53

質問は編集してご対応ください。 またもう1つの下記、確認してください。 また、エラー表示確認してください。 https://qiita.com/shotets/items/3c95aef631b2c5eadae5 > メール機能には、現在関係はありませんので、それに関する回答は控えさせていただきます。ご了承ください。 では、その部分のコードを削ってください。
退会済みユーザー

退会済みユーザー

2019/08/21 05:57

m.ts 10806様のメッセージを第一に行なわせていただいて、その後質問の編集をして対応させていただかせていただきましたのですが、問題はありますでしょうか?
m.ts10806

2019/08/21 06:01

コードを見た限り「エラー表示設定」はされていないので、その部分を確認してくださいという依頼です。 「画面が真っ白」はあくまでPHPがコード実行継続不可能なエラーをおこして処理が中断していることになります。 何もなければ「表示されない」ことは起きないはずのコードなので、それが「真っ白」となるということはエラーがあるということです。 表示設定をONにしておかないと表示されません。ですので、そのエラーを表示させて確認して、質問に追記いただきたいのです。
m.ts10806

2019/08/21 06:15

本筋からそれますが、あまり頑張ってへりくだらなくても良いと思います。逆に分かりづらい言葉になります >対応させていただかせていただきましたのですが、 ↓ 対応したのですが で充分です。(連打で指も疲れますし)
m.ts10806

2019/08/21 06:31

いや、かなり致命的なミスやってますね。回答しておきます。
Y.H.

2019/08/21 06:41

ここですね。。。 > $dbh = new PDO('$dsn,$user,$password');
m.ts10806

2019/08/21 12:06 編集

コピペで動くコードで納得したところで何の成長にもつながらないということだけは言っておきますね。 yambejpさんの回答が悪いというわけではなく、今の質問者さんの段階で到底理解できないコードで何も確認なしで解決済みにしているのがよくありません。 自身のコードで起きている問題から逃げただけに見えます。同じ問題が起きたときにまた逃げますか? 先を見据えた上でよく考えてみてください。
退会済みユーザー

退会済みユーザー

2019/08/21 14:14 編集

yambejpさんの、indexページとcheckページを一緒にするという点で、ベストアンサーにしたのですが、m.ts10806さんのおっしゃる通り、理解できないコードも含まれていますので、そういう面では、ベストアンサーに今後のこと、又学習についての面ではベストアンサーにしてしまった事は間違っていました。 大変申し訳ございません。
m.ts10806

2019/08/21 14:20 編集

少し煽りっぽいことを言ってしまったことは申し訳ないと思っています。 yambejpさんのコードはきちんと動くものですし、様々な考慮がされているものなので大いに参考すべきと思います。 もし分からないところがあれば、回答のコメントで確認してみてください。理解は深まると思います。 ただ、「現在の問題が片付いた前提」「きちんと最後まで動くようになった前提」が必要なので、順序は守ってほしくてこのような対応を取らせていただきました。 セキュリティ含めるとyambejpさんのコメントにあるように突っ込みどころは沢山ありますが、目の前の問題をきちんと解決して理解を深めることも重要ですので、ひとまず「デバッグ」しやすい環境を作ることからやってみてください。
退会済みユーザー

退会済みユーザー

2019/08/21 14:27

おっしゃっていることは十分承知しています。 今回の問題点の解決にはないっていないという事は反省しております。 今後は、そのような面も考慮した上で、どれが今の自分にとってのベストアンサーなのかを考慮した上で、検討していきたいです。 m.ta10806さん、煽りの様な事を言ってしまったとありますが、それに対しては気にしておりません。 今回の問題に対して真剣に向き合ってもらい、とても感謝しております。 現在、私は中学三年生で色々な面でまだ分からない点等がありますが、今後ともご教示ください。 本当にありがとうございます。
m.ts10806

2019/08/21 14:33

年齢は特に関係ないと思っています。 私は30代ですが、20以上も年齢が違ってもやっていることは同じなので、 1つの物事に対してきちんと向き合うことができれば、たとえ質問者回答者と立場は違ってもお互い成長になると思っています。 やり取りからするとkai03さんは今後楽しみかなと思ってます。お若いので私の技術力なんてすぐに追い越してしまうでしょう。私がPHPに初めて触れたのは大学卒業して就職して何年か経ってからですからね。 がんばってください。
退会済みユーザー

退会済みユーザー

2019/08/21 14:39

年齢に関する点では、まだ考えが子供であり、目先の利益を得て、今後の為にはならないという考えが今回の件で分かったため、入力させていただきました。 励ましの言葉ありがとうございます。とても嬉しく思います。 教えてもらってばかりのかたちとなっていますが、これからも分からない点などがありましたら、是非m.ts10806さんに教えてもらいたく思います。 本当にありがとうございます!
m.ts10806

2019/08/21 14:52

そうですね。 ただあくまでここはQAサイトであり、先生と生徒という関係性にはなれないので「サイトのガイドラインに沿ったうえでの対応」になることは覚えておいてください。 私はほかの回答者よりはガイドラインから外れる内容には厳しく見る傾向にあります(質問者さんの姿勢次第ではありますが)
退会済みユーザー

退会済みユーザー

2019/08/21 14:57

了解しました。
guest

回答2

0

ベストアンサー

学習期であればエラー表示設定を常時しておいてください。
コメントでも書いていますが「画面が真っ白」はプログラムが処理継続不可能なエラーが起きたとかで処理がそこで止まっている状態です。
大抵はfatalエラー等だとは思いますが、それはそれで大問題で、画面にエラーを表示させていないことで何が起きているかとか何が原因かが探れなくなります。

もちろんエラーログを見に行けば良い話ではありますが、
学習期でエラーログを探るのはストレスも大きいでしょう(それまで起きたエラーが全てたまっていっているので 現在の問題と紐づけるのは簡単ではありません。

またデータベースを扱うのであればtry-catchによる例外捕捉も必要です。

という前提で、
コードからだけ言えることをアドバイスとして投稿します。
ここから下は、前提部分を全て承知・理解した上で呼んでください。


まずは下記を見てください。
イメージ説明

Eclipseのエディタ部分の画面キャプチャです。

何か所か黄色い警告がありますね。

上3つは定義されながら使用されていない変数 で
下2つは未定義なのに使用されている変数 です。

上3つについて、なぜそうなるか
根拠は下記

PHPマニュアル:文字列#引用符

注意: ダブルクォート 構文や heredoc 構文とは異なり、 変数と特殊文字のエスケープシーケンスは、 引用符 (シングルクオート) で括られた文字列にある場合には展開されません。

下記、それぞれどのように出力されるか分かりますか?

php

1$test = "hogehoge"; 2echo $test; 3echo "$test"; 4echo '$test';

つまり↓ここのが3つ目のようになっているということです
$dbh = new PDO('$dsn,$user,$password');

これではPDOに正しい情報が送れていないということになります。
シングルクォーテーションの位置、カンマの位置から、基本形式も守れていません。
PHPでデータベースに接続するときのまとめ♯データベースに接続

$pdo = new PDO($dsn, $username, $password, $driver_options);

今のコードでは第1引数dsnに全部突っ込んでいることになります。
確かに仕様上第1引数のみが必須パラメータとはいえ、変数が展開された情報ではなく**"$dsn,$user,$password"という文字列**が渡ってきているわけですから、接続できるはずがないわけです。

これは、前提2つ目の「try-catchによる例外捕捉」をしていれば気づけたことですね。

次。
下2つの未定義なのに使用されている変数

メール機能には、現在関係はありませんので

と仰ってはいますが、
mb_send_mail()の引数にあてている変数に未定義が出ていますよね。

mb_send_mail($mail,$mail_sub,$maail_body,$mail_head);

mb_send_mail()の説明にある通り
mb_send_mail ( string $to , string $subject , string $message [, mixed $additional_headers = NULL [, string $additional_parameter = NULL ]] ) : bool
第3引数まで必須パラメータです。

コード上では第1引数と第3引数が未定義の変数になっています。
必須パラメータがきちんと送られないとどうなるか。

下記、実際に動かしてみてください。

php

1<?php 2function test(string $b){ 3 echo $b; 4} 5test($a);

大きく2点、指摘しました。

これだけ直せば想定通り動くとは限りません。
これでも動かない場合、別の場所にも原因があると言えます(特にmb_send_mail()とか怪しい。)

デバッグは学習期の初期の初期に覚えてください。
PHPマニュアルは必ず確認、活用するようにしてください。
できれば、IDEを利用してください。

それだけで自己解決できることも増えてきて、あまり悩むことなく(質問も良い質問ができるようになり)学習を進められるようになります。

PHP初心者に読んでもらいたい記事:
初心者を戒めるPHP
PHP初心者は最低限これはやっとけ - 開発に入る前編


蛇足:
SQLに直接、入力値を突っ込むとSQLインジェクションの脆弱性があります。
PDO利用でしたら prepare→bindValue→executeのながれを癖づけましょう。

PHPでデータベースに接続するときのまとめ#PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行する

投稿2019/08/21 06:43

編集2019/08/21 06:53
m.ts10806

総合スコア80850

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

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

m.ts10806

2019/08/21 07:04 編集

これで低評価とは余程ひねくれている人か、それとも何かの嫌がらせか。 技術的にきっちり指摘してください。 間違いあれば調整します。
退会済みユーザー

退会済みユーザー

2019/08/21 14:08

低評価は私はしていませんよ? それどころか、自分の間違いだった点を具体的に説明して、さらには改善する場所も明確に教えてくださっているので、高評価を押させていただきましたよ。
m.ts10806

2019/08/21 14:15

質問者さんかどうかは疑っていません。紛らわしい表現をしてしまって失礼しました。 あくまで「技術的に指摘してほしい」だけなので、それもなく低評価はエンジニアとしてどうなんだろうという疑問ですね。 私として質問者さんにお願いしたいのは冒頭部分ですね。 エラー表示設定部分です。try-catchも必要です。 参考記事にもPHPマニュアルにもサンプルコードはありますので確認して試してみてくださいね。
guest

0

普通に動くと思いますけど・・・
便宜的にindexとcheck.phpを同じページにしてあります

PHP

1<?PHP 2print_r($_POST); 3?> 4<form method="POST"> 5ニックネームを入力して下さい<br> 6<input name="nickname" type="text" style="width: 100px" value="aaa"><br> 7メールアドレスを入力して下さい。<br> 8<input name="email" type="text" style="width: 200px" value="bbb@ccc"><br> 9ご意見を一言でお聞かせ下さい。<br> 10<input name="goiken" type="text" style="width: 300px" value="ddd"><br> 11<br> 12<input type="submit" value="送信"> 13</form> 14 15<?php 16 $nickname=filter_input(INPUT_POST,"nickname"); 17 $email=filter_input(INPUT_POST,"email"); 18 $goiken=filter_input(INPUT_POST,"goiken"); 19 20 $h_nickname=htmlspecialchars($nickname); 21 $h_email=htmlspecialchars($email); 22 $h_goiken=htmlspecialchars($goiken); 23 24if(!is_null($nickname)){ 25 if($nickname==""){ 26 print "ニックネームが入力されていません。<br>\n"; 27 }else{ 28 print "ようこそ{$nickname}様<br>\n"; 29 } 30 31 if($email==""){ 32 print"メールアドレスが入力されていません。<br>"; 33 }else{ 34 print"メールアドレス:{$email}<br>\n"; 35 } 36 37 if($goiken==""){ 38 print"ご意見が入力されていません。<br>"; 39 }else{ 40 print"ご意見『{$goiken}』<br>\n"; 41 } 42 43 if( $nickname==''||$email==''||$goiken==''){ 44 print <<<eof 45<form> 46<input type="button" onclick="history.back()" value="戻る"> 47</form> 48eof; 49 }else{ 50 print <<<eof 51<form method="post" action="thanks.php"> 52<input name="nickname" type="hidden" value="{$h_nickname}"> 53<input name="email" type="hidden" value="{$h_email}"> 54<input name="goiken" type="hidden" value="{$h_goiken}"> 55 56<input type="button" onclick="history.back()" value="戻る"> 57<input type="submit" value="OK"> 58</form> 59eof; 60 } 61} 62?> 63

ちなみにサーバー側でバリデートした処理をhiddenに入れて再度POSTするのは
あまり意味がありません。
セッションに保持して渡すようにしてください

投稿2019/08/21 05:53

yambejp

総合スコア114779

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問