🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

3001閲覧

PHP、 入力エラーが出てしまいます。

sawara29

総合スコア12

PHP

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

0グッド

0クリップ

投稿2019/09/14 02:21

編集2019/09/15 05:42

phpの教科書で、コンタクトフォームをつくってます。
入力ページから、確認ページ、完了ページで構成され、入力ページで、

氏名、メールアドレス、件名、問い合わせ内容、画像認証を入力し確認ボタンで、本来は確認ページに進むのですが、

入力ページのまま、件名と画像認証のエラーが出ます。
エラーは、subjectの'件名は必須項目です。'と画像認証の'確認キーワードは8文字で入力して下さい。';です。

どなたか、アドバイスをいただけないでしょうか?。

###これは、入力form2.phpのコードです。

phpsession_start();

1 2//必要な関数を読み込む 3require dirname(__FILE__).'../../libs/functions.php'; 4 5//画像認証 6include "zizai_captcha/check.php"; 7//POSTされたデータをチェック  8$_POST = checkInput($_POST); 9 10//固定トークンを確認 11if (isset($_POST['ticket'], $_SESSION['ticket'])) { 12 $ticket = $_POST['ticket']; 13 if ($ticket !== $_SESSION['ticket']) { 14 die('不正アクセスの疑いがあります。'); 15 } 16} else { 17 die('不正アクセスの疑いがあります。'); 18} 19 20//変数に POSTされたデータを代入 21$name = isset($_POST['name']) ? $_POST['name'] : NULL; 22$email = isset($_POST['email']) ? $_POST['email'] : NULL; 23$subject = isset($_POST['subject']) ? $_POST['subject'] : NULL; 24$body = isset($_POST['body']) ? $_POST['body'] : NULL; 25$code = isset($_POST['code']) ? $_POST['code'] : NULL; 26 27//POSTされたデータを整形 28$name = trim($name); 29$email = trim($email); 30$subject = trim($subject); 31$body = trim($body); 32$code = trim($code); 33 34//エラーメッセージを保存する配列の初期化 35$error = array(); 36 37//お名前欄をチェック 38if ($name == '') { 39 $error[] = 'お名前は必須項目です。'; 40} else if (mb_strlen($name) > 100) { 41 $error[] = 'お名前は100文字以内でお願いします。'; 42} 43//email欄をチェック 44if ($email == '') { 45 $error[] = 'メールアドレスは必須項目です。'; 46} else { 47 $pattern = 48 '/^([a-z0-9+_\-]+)(.[a-z0-9+_\-]+)*@([a-z0-9\-]+.)+[a-z]{2,6}$/iD'; 49 if (!preg_match($pattern, $email)) { 50 $error[] = 'メールアドレスの形式が正しくありません。'; 51 } 52} 53 54//件数名をチェック 55if ($subject == '') { 56 $error[] = '件名は必須項目です。'; 57} else if (mb_strlen($subject) > 100) { 58 $error[] = 'けんめいは100文字以内でお願いします。'; 59} 60 61//内容欄をチェック 62if ($body == '') { 63 $error[] = '内容は必須項目です。'; 64} else if (mb_strlen($body) > 500) { 65 $error[] = '内容は500文字以内でお願いします。'; 66} 67 68//画像認証をチェック 69if (mb_strlen($code) <> 8) { 70 $error[] = '確認キーワードは8文字で入力して下さい。'; 71} else if (!chk_crypt($code)) { 72 $error[] = '確認キーワードが誤っています。'; 73} 74 75//エラー数を確認 76if (count($error) > 0) { 77 //エラーがある場合は、入力フォームを表示 78 $data = array(); 79 $data['error'] = $error; 80 $data['name'] = $name; 81 $data['email'] = $email; 82 $data['subject'] = $subject; 83 $data['body'] = $body; 84 $data['ticket'] = $ticket; 85 display('form1_view.php', $data); 86} else { //エラーが0の場合 87 //POSTされたデータをセッションに保存 88 $_SESSION['name'] = $name; 89 $_SESSION['email'] = $email; 90 $_SESSION['subject'] = $subject; 91 $_SESSION['body'] = $body; 92 93//確認画面を表示 94 $data = array(); 95 $data['name'] = $name; 96 $data['email'] = $email; 97 $data['subject'] = $subject; 98 $data['body'] = $body; 99 $data['ticket'] = $ticket; 100 display('form2_view.php', $data); 101} 102 103```###form1_view.php 104このプログラムにjavascriptを組み込んでます。49行目付近 105```form1_view.php 106<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3 .org/TR/xhtml1-transitional.dtd"> 107 2 <html xmlns="http://www.w3.org/1999/xhtml"> 108 3 <head> 109 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 110 5 <meta http-equiv="Content-Style-Type" content="text/css" /> 111 6 <meta http-equiv="Content-Script-Type" content="text/javascript" /> 112 7 <title>メールフォーム</title> 113 8 <link rel="stylesheet" type="text/css" href="css/style.css" media="screen,tv " /> 114 9 </head> 115 10 <body> 116 11 <div id="box"> 117 12 <div id="header"> 118 13 <h1>PHP for Web Designer</h1> 119 14 </div> 120 15 <ul id="menu" class="clearfix"> 121 16 <li><a href="question1.php">アンケート</a></li> 122 17 <li class="active"><a href="form1.php">メールフォーム</a></li> 123 18 <li><a href="webapi/">グルメMAP</a></li> 124 19 </ul> 125 20 <div id="main"> 126 21 <h2 class="mail-bar">メールフォーム</h2> 127 22 128 23 <?php if (isset($error)): ?> 129 24 <?php foreach ($error as $val): ?> 130 25 <font color="red"><?php echo $val; ?></font><br /> 131 26 <?php endforeach; ?> 132 27 <?php endif; ?> 133 28 134 29 <form action="form2.php" method="post"> 135 30 136 31 <dl class="clearfix mailform"> 137 32 <dt>お名前</dt> 138 33 <dd><label> 139 34 <input type="text" name="name" value="<?php echo $name; ?>" size="50" /> 140 35 </label></dd> 141 36 <dt>e-mail</dt> 142 37 <dd><label> 143 38 <input type="text" name="email" value="<?php echo $email; ?>" size="50" /> 144 39 </label></dd> 145 40 <dt>件名</dt> 146 41 <dd><label> 147 42 <input type="text" nane="subject" value="<?php echo $subject; ?>" size="50 " /> 148 43 </label></dd> 149 44 <dt>内容</dt> 150 45 <dd><label> 151 46 <textarea name="body" cols="50" rows="10"><?php echo $body; ?></textarea> 152 47 </label></dd> 153 48 154 49 <script src="zizai_captcha/captcha.php" type="text/javascript"></script> 155 50 <script>zizai_captcha_show();</script><br> 156 51 157 52 <input type="submit" valeu="確認画面へ" /> 158 53 </p> 159 54 160 55 <input type="hidden" name="ticket" value="<?php echo $ticket; ?>" /> 161 56 162 57 </form> 163 58 </div> 164 59 <p class="copy"> 165 60 &copy; 2010 PHP for Web Designer. All rights reserved. 166 61 </p> 167 62 </div> 168 63 </body> 169 64 </html> 170 171

###zizai_captcha/check.phpです。

check.php

1function zizai_captcha_check($input_str = NULL,$key_time = NULL){ 2 if($input_str === NULL){ 3 if(isset($_POST["zizai_captcha_check"])){ 4 $input_str = $_POST["zizai_captcha_check"]; 5 }else{ 6 return FALSE; 7 } 8 } 9 10 if($key_time === NULL){ 11 if(isset($_POST["zizai_captcha_time"])){ 12 $key_time = $_POST["zizai_captcha_time"]; 13 }else{ 14 return FALSE; 15 } 16 } 17 18 mb_language("uni"); 19 mb_internal_encoding("utf-8"); 20 mb_http_input("auto"); 21 mb_http_output("utf-8"); 22 23 $input_str = mb_convert_kana($input_str,"r"); 24 25 $time = time(); 26 $post_t = intval($key_time); 27 28 $config = parse_ini_file(dirname(__FILE__)."/config.ini"); 29 $seed = parse_ini_file(dirname(__FILE__)."/seed.ini"); 30 31 if($post_t > $time || $post_t < $time - $config["expire"]){ 32 return FALSE; 33 } 34 35 $symbol = array("+","/"); 36 $alphabet = array("A","B"); 37 38 if($seed["last_updated"] <= $post_t){ 39 $seed_str = $seed["new_seed"]; 40 }else{ 41 $seed_str = $seed["old_seed"]; 42 } 43 44 $str = str_replace($symbol,$alphabet,strtoupper(substr(base64_encode(md5($post_t.$seed_str,TRUE)),0,$config["characters_count"]))); 45 46 if(strtoupper($input_str) !== $str){ 47 return FALSE; 48 } 49 50 return TRUE; 51} 52?>

###MAMPで、localhost/form1.phpにアクセスします。

表示されたフォームに、名前、E-メール、件名、内容、画像認証のボックスがありますので、入力して、送信ボタンを押します。

画面は、変わらないままですが、件名と、画像認証だけ入力文字が消えて、
赤文字で、
内容は必須項目です。
確認キーワードは8文字で入力して下さい。

が表示されてます。

###冒頭のform1.phpの中に、サーバー変数を書いたところ、エラー表示が出ましたが、どうすれば良いかわからなくなってます。何が、不備なのか、アドバイスいただけたら、有り難いです。

form1.php

1if($_SERVER["REQUEST_METHOD"]==="POST"){ 2 POSTの時の処理 3}else{ 4 echo "不正なアクセス!!!"; 5} 6

##この部分を

form2.php

1//変数に POSTされたデータを代入 2$name = isset($_POST['name']) ? $_POST['name'] : NULL; 3$email = isset($_POST['email']) ? $_POST['email'] : NULL; 4$subject = isset($_POST['subject']) ? $_POST['subject'] : NULL; 5$body = isset($_POST['body']) ? $_POST['body'] : NULL; 6$code = isset($_POST['code']) ? $_POST['code'] : NULL; 7

###このように、書き換えたのですが、

form2.php

1 2$args = array( 3 'name' => FILTER_DEFAULT, 4 'email' => FILTER_VALIDATE_EMAIL, 5 'subject' => FILTER_DEFAULT, 6 'body' => FILTER_DEFAULT, 7 'code' => FILTER_DEFAULT, 8); 9$post_data = filter_input_array(INPUT_POST, $args); 10

Notice: Undefined variable: name in /Applications/MAMP/htdocs/form2.php on line 33
と出てしまい、全ての入力が、未入力の状態になって、赤文字のエラーメッセージが出ます。

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

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

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

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

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

tabuu

2019/09/14 04:32

>$_POST = checkInput($_POST); この関数の中で何かしているのではないでしょうか?もしくはそもそもFormに該当のnameを持つ要素が無いか。
退会済みユーザー

退会済みユーザー

2019/09/14 05:02

質問者さんが持っている本?を、他の人も持っているわけではないし、示されたコードの外で定義されているユーザー関数についてもコードを示してもらわないと、解決に近づけませんよ。functions.phpとcheck.phpで何をやっているのか示してください。
退会済みユーザー

退会済みユーザー

2019/09/14 05:06 編集

雑にコードを貼らないでくださいね、どこからどこまでが、何のファイルなのかわかるように工夫してください。コード箇所を選択して「code」ボタンをクリックすれば少しは見やすくなるでしょうk。
sawara29

2019/09/14 05:06

functions.phpを示します。
sawara29

2019/09/14 05:26

ご指摘ありがとうございます。本当にもしわけありません。
m.ts10806

2019/09/14 05:32 編集

謝ってもらいたいと思ってる人ってこの手のQAサイトにはいないですよ。
sawara29

2019/09/14 05:35

初心者で、まだ慣れてないので、気をつけます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/09/14 05:41

初心者でも、自分で書いた質問文の見直しはできるはずですから、細かいところまで配慮された質問文に修正してくださいね。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2019/09/14 05:45

問題解決に必要な情報が足りないから、指摘しています。実務的な指摘が冷たいとか怒ってるように見えるようなら申し訳ないですが、コードが読みやすくなるだけで回答がつきやすくなりますし、足りない情報が補われたら解決に近づきます。互いの解決させたい熱意を汲み取っていただきたいです。
sawara29

2019/09/14 05:51

ありがとうございます。私も不備がないよう努力します。
退会済みユーザー

退会済みユーザー

2019/09/14 05:54

zizai_captcha/check.php で何をやっているのか、また、htmlフォームにjavascriptを組み合わせているなら、jsのコードも示してほしいです。
kei344

2019/09/14 06:04

「教科書」の名称は提示したほうがよいです。また、「form1_view.php」と「html」は同じ物でしょうか。
sawara29

2019/09/14 06:08

同じものです。教科書は、PHP入門講座です。
退会済みユーザー

退会済みユーザー

2019/09/14 07:04

エラーの再現方法を丁寧に表してほしい。form1_view.phpを単にwebブラウザからurl入力したのか、それとも送信ボタンを押したのか。そのときどういう入力をしたのか。
m.ts10806

2019/09/14 07:16

表示されているエラーと画像認証の問題は別にした方が良いかと思います。 全部一気にまとめて片付けようと思うと質問者さんがどんどん底なし沼に沈んでいくだけです。 1個1個丁寧に対応していきましょう。つまり【今回片付けたい問題を1点に絞る】ことです。 余談ですが・・・ 参考書籍は古すぎると思います。 htmlの構成もそうですし、扱っているPHPのバージョンもかなり古いものではないですか? おそらくそのまま進めても実用的なWebの技術は身につきませんので、PHP7対応(できれば7.1,7.2以上)の書籍を利用してください。
guest

回答2

0

ベストアンサー

いくつか気になったところ。


php

1//POSTされたデータをチェック  2$_POST = checkInput($_POST);

$_POSTは定義済の外部からくる変数のため、
そこに加工したデータを書き戻すのはあまりいいことではないと私は考える。
書き換えてはいけない、という決まりではないものの、
プログラムの冒頭で$_POSTを参照して得た値と、
あとの方で$_POSTを参照して得た値が異なるような振る舞いは混乱しやすい。


php

1//変数に POSTされたデータを代入 2$name = isset($_POST['name']) ? $_POST['name'] : NULL; 3$email = isset($_POST['email']) ? $_POST['email'] : NULL; 4$subject = isset($_POST['subject']) ? $_POST['subject'] : NULL; 5$body = isset($_POST['body']) ? $_POST['body'] : NULL; 6$code = isset($_POST['code']) ? $_POST['code'] : NULL; 7 8//POSTされたデータを整形 9$name = trim($name); 10$email = trim($email); 11$subject = trim($subject); 12$body = trim($body); 13$code = trim($code);

これをやるんなら、むしろこうするべき:

php

1// **** おそらく期待した動きになるはず 2//変数に POSTされたデータを代入 3$name = filter_input(INPUT_POST, 'name'); 4$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); 5$subject = filter_input(INPUT_POST, 'subject'); 6$body = filter_input(INPUT_POST, 'body'); 7$code = filter_input(INPUT_POST, 'code');

あるいは、こう:

php

1// **** おそらく期待した動きになるはず 2$args = array( 3 'name' => FILTER_DEFAULT, 4 'email' => FILTER_VALIDATE_EMAIL, 5 'subject' => FILTER_DEFAULT, 6 'body' => FILTER_DEFAULT, 7 'code' => FILTER_DEFAULT, 8); 9$post_data = filter_input_array(INPUT_POST, $args); 10// 以後、$post_dataを参照するようにすれば、最後のdisplay()ユーザー関数にそのまま引き渡せる。

PHP: filter_input - Manual
PHP: filter_input_array - Manual
PHP: 検証フィルタ - Manual
PHP: 除去フィルタ - Manual
これで、POST受信していない場合には空文字列''が変数に代入される。

しかし、filter_input()を通してしまうと、
意図的に空文字列をPOST送信した場合との区別がつきにくいのが難点。
なので、私は$_POSTを書き換えず、isset($_POST['name'])でPOST受信しているかどうかを見て判断するように書いたりする。


その後、$nameなどの評価に移るのだけど、

php

1if ($_SERVER['REQUEST_METHOD'] === 'POST') { 2 if ($name == '') { 3456}

のようにすれば、POST受信したときだけ$nameなどの評価ができるので、
フォームのURLに直にアクセスした最初から入力エラーメッセージのオンパレードにならなくて済む。
PHP: $_SERVER - Manual


php

1//確認画面を表示 2 $data = array(); 3 $data['name'] = $name; 4 $data['email'] = $email; 5 $data['subject'] = $subject; 6 $data['body'] = $body; 7 $data['ticket'] = $ticket; 8 display('form2_view.php', $data);

次のhtml表示につなげるためと思われるdisplay()ユーザー関数は示されていないのでなんとも言えないけど、
この場面はこういうふうに書くこともできる:

php

1//確認画面を表示 2 $data = compact( array('name', 'email', 'subject', 'body', 'ticket') ); // 変数名を列挙すると、それをキーにした配列を作ってくれる。 3 display('form2_view.php', $data);

同じようなことを羅列するとデバッグしづらくなるので、必須ではないもののこういう書き方もあるよ、くらいの認識でOK。

投稿2019/09/14 10:41

編集2019/09/14 10:46
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sawara29

2019/09/14 12:10

色々なアイデアを有難うございます。 4つ目のfilter_input_arrayに書き換えしたのですが、 Warning: Use of undefined constant FILTER_DEFAULT_EMAIL - assumed 'FILTER_DEFAULT_EMAIL' (this will throw an Error in a future version of PHP) in /Applications/MAMP/htdocs/form2.php on line 26 とエラーが出ます。 私のphpはバージョンが7.3.1なのですが、プログラムそのものが古く、教えていただいた、コードは対応してないのかもしれません。 自分の知識不足を痛感してます。
退会済みユーザー

退会済みユーザー

2019/09/14 12:38

それは、シングルクォーテーションマークつきの表記にしておいたほうが、将来のバージョンのPHPでも安全に動作するよと教えてくれているので、おとなしく従うと表示されなくなるかと思います。
sawara29

2019/09/16 20:56

アドバイス有難うございました。色々やってみましたが、今後のために非常に勉強になりました、
guest

0

入力ページのまま、件名と画像認証のエラーが出ます。

POSTで送信されているかどうかも確認せずに「POSTされたデータを代入」をしているため、必ずその項目が空になります。まず確認しましょう。

投稿2019/09/14 06:14

kei344

総合スコア69596

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

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

sawara29

2019/09/14 07:01

すみません、エラー表示される、件名と、画像認証の送信を確認する方法がわかりません。教えてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問