• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームのデータを受け取りについて)

フォームのデータを受け取りについて

このQ&Aのポイント
  • フォームのデータを受け取る際に発生したエラーについて解決方法を教えてください。
  • 質問者はフォームのデータを受け取る際にエラーが発生し、extract()関数の使用に関して質問しています。
  • 現在の処理では、フォームから送信されたデータを配列に格納した後、extract()関数を使用しようとしていますが、エラーが発生してしまいます。どのようにすれば正常に動作させることができるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • oka5130
  • ベストアンサー率66% (35/53)
回答No.1

POST で submit が送られてこなければ foreach で POST の値に処理を加えて 配列 $array に値を入れなおしているという処理だと思いますが、 POST がなければ $array の中身は NULL なので、extract に渡される値が NULL となり、 配列を渡してくださいね、って怒られています。 foreach の前に if( $_POST ) を入れるなり、$array = array(); で $array を初期化するなりすればいいんじゃないでしょうか。

noname#65793
質問者

補足

お返事ありがとうございます。 エラーの意味すらわからなかったもので非常に助かりました。 var_dump($array);として試してみたところ正常に値を取得できました。 array(5) { ["name"]=> string(6) "名前" ["email"]=> string(7) "mail@ad" ["title"]=> string(12) "タイトル" ["msg"]=> string(15) "メッセージ" ["mode"]=> string(7) "confirm" } メールフォームから送信するプログラムで流れとして 入力→確認→送信完了という形なので確認する箇所に記述しましたが 知識不足で自信がないものでおかしい箇所などがありましたら 教えて頂けますと幸いです。 ---forms.php--- require_once "tpl.php"; // データ取得 $mode = $_POST["mode"]; switch ($mode) { // メール送信 case "send": send(); break; // データ処理と確認 case "confirm": if (!$_POST["submit"]) { //POSTデータを全て受け取りエスケープして変数に入れる foreach($_POST as $k => $v) { if(get_magic_quotes_gpc()) { $v=stripslashes($v); } $v=htmlspecialchars($v); $array[$k]=$v; } extract($array); } confirm(); break; // 入力フォーム表示 default: input(); break; } ---tpl.php--- // フォーム表示 function input() { echo <<<EOM <form method="post" action="forms.php"> <table border="1"> <tr> <td>お名前</td> <td><input type="text" name="name" size="20"></td> </tr> <tr> <td>メールアドレス</td> <td><input type="text" name="email" size="20"></td> </tr> <tr> <td>タイトル</td> <td><input type="text" name="title" size="20"></td> </tr> <tr> <td>メッセージ</td> <td><textarea name="msg" rows="5" cols="40"></textarea></td> </tr> <tr> <td colspan="2"><input type="submit" value="内容を確認"></td> </tr> </table> <input type="hidden" name="mode" id="mode" value="confirm" /> </form> EOM; exit(); } // 確認画面表示 function confirm() { $aa = nl2br($_POST['msg']); echo <<<EOM <p>{$_POST["name"]} 様</p> 下記の内容で送信致します。送信内容を確認後送信ボタンを押してください。 <form method="post" action="forms.php"> <table border="1"> <tr> <td>お名前</td> <td>{$_POST["name"]}</td> </tr> <tr> <td>メールアドレス</td> <td>{$_POST['email']}</td> </tr> <tr> <td>タイトル</td> <td>{$_POST['title']}</td> </tr> <tr> <td>メッセージ</td> <td>$aa</td> </tr> <tr> <td colspan="2"><input type="submit" value="送 信" /> <input type="button" value="戻 る" onclick="history.back()" /></td> </tr> </table> <input type="hidden" name="mode" id="mode" value="send" /> </form> EOM; exit(); } // 送信完了画面表示 function send() { echo <<<EOM <p>{$_POST["name"]} 様</p> <p>お問い合わせありがとうございました。</p> EOM; exit(); } 勉強中の段階ですのでまだまだ完成品には程遠く入力チェックなどの エラー処理など課題は山積みです・・・^^;

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • oka5130
  • ベストアンサー率66% (35/53)
回答No.4

処理の流れはそんな感じで良いんじゃないでしょうか。 エラーの意味に関しては、プログラムをやるならエラーはご自分で 理解できるようになっておいた方が良いと思います。 エラーメッセージには行番号が出ますし、英語もそれほど難しくはありませんので。 行番号がおかしなところを指していれば、括弧が合っていないことが多いです。 もしエラーメッセージの意味がわからなかったら翻訳サイトで日本語に翻訳するか、 検索エンジンにそのまま放り込めば大抵は答えが見つかります。

noname#65793
質問者

お礼

お返事ありがとうございます! 本やサイトを見て勉強しているのですが十人十色という言葉通り 構成もそれぞれでどの方法が効率がいいものかというところからで 困惑しておりました。 今回質問させて頂きました件は、おかげ様でなんとか解決できましたので 引き続き頑張ってみたいと思います。 またつまずいた際にお世話になることがあるかと思いますがその際は またアドバイスなど頂けますと幸いです。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • oka5130
  • ベストアンサー率66% (35/53)
回答No.3

No.2の方の回答への補足ですが、 PHP の配列は $_POST["submit"] のように [] で括るのが普通ですが、 {}で括っても良いようです。 (私も知りませんでしたが書いてみると動いてびっくりしました。。) PHP のマニュアルを見てもこのような書き方は見つからなかったのですが…。 いずれにせよ、配列は [] で括った方が良いかと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

$_POST{"submit"} ――が悪さしているのでは。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • functionの中にfunction?

    functionの中にfunctionの関数を読み込みたいのですが そのようなことはphpで可能でしょうか? ソースは以下のようになっております。 // 実行 hoge1(); hoge2(); function hoge1() { if (!$_POST["submit"]) { foreach($_POST as $k => $v) { if(get_magic_quotes_gpc()) { $v=stripslashes($v); } $v=htmlspecialchars($v); $array[$k]=$v; } extract($array); } } function hoge2() { echo <<<EOM ~~表示させる文章など~~ EOM; foreach ($array as $key => $val){ echo "<input type=\"hidden\" name=\"$key\" value=\"$val\" />\n"; } } 具体的にはhoge1のextract($array);をhoge2の$arrayに入れて foreachで出力させたいのですがどのようにすればできますでしょうか?

    • 締切済み
    • PHP
  • バックスラッシュの対策について

    formでデータを送信するとバックスラッシュが入ってしまうので、stripslashes()で処理しています。 POSTでデータを送信しているのですが、 $prmarray_post = $_POST; $data1 = stripslashes($prmarray_post["data1"]); というような処理だと大丈夫なのですが、受け取るデータがいくつもあるので function cnv_formstr($array) { foreach($array as $k => $v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v, ENT_QUOTES); $$k = $v; } return $array; } $prmarray_post = cnv_formstr($_POST); $data1 = $prmarray_post["data1"]; という感じでやりたいのですが、これだとうまくいきません。 どのようにすればよいのでしょうか。 よろしくお願いしますm(__)m

    • ベストアンサー
    • PHP
  • エスケープ解除

    以下のようなPHP構文の時に、 magic_quotes_gpcがOnであっっとしたら、 どのようにエスケープを解除すればいいのでしょうか? // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k = $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); }

    • 締切済み
    • PHP
  • [初心者]メールフォーム

    PHP初心者です。 メールフォームをPHPで作りました(貰いものでカスタマイズした感じ)。 FTPでサーバーの[httpdocs]の直下に置き、 誤作動はなく動いていたのですが、 今回サーバーを移行した関係で、 [www]→[htdocs]に同じものを入れたら、 htmlで入力した文字などが反映されなくなりました。 これはやはり階層の違いによるもの何のでしょうか? 現在、入力確認用とsend用に2つのphpを使用していますが、 どれを修正したらいいのか分かりません。 記入したものが反映されないので 以下の箇所が怪しいかと思いますが、どうでしょうか? <?php  //フォームの値を取得  if($_SERVER["REQUEST_METHOD"] == "POST"){   foreach($_POST as $k => $v){    //「magic_quotes_gpc = On」のときはエスケープ解除    if(get_magic_quotes_gpc()){    $v = stripslashes($v);    }    $v = htmlspecialchars($v);    $$k = $v;   }  }else{    exit();  } よろしくお願いします。

    • ベストアンサー
    • PHP
  • foreachの代入時 $$を使う理由

    フォームからPOSTで値を受け取り、変数に代入する方法ですが、最後の$$kの意味がわかりません。 $k=$v;では、キチンと動作されず理解に困っています。 なぜ$$k=$v;で動作が正常なのでしょうか? プログラム自体はPHPによる スーパーサンプルという本に書いてあったのですが、説明もなく釈然としません。 if($_SERVER["REQUEST_METHOD"]=="POST"){ foreach($_POST as $k=>$v){ if(get_magic_quotes_gpc()){ $v=stripslashes($v); } $v=htmlspecialchars($v); $$k=$v; } } ググっても$$自体の検索がかけれず、色々なサイトで探したのですが、結局わからなかったので、分かる方がいたらよろしくお願いします。

    • 締切済み
    • PHP
  • 送信した配列の取得方法

    formで送信した配列データを受け取りたいのですが、以下のような記述だとうまく受け取れません。 記述方法を教えてくださいm(__)m (取得データはほかにもいくつかあり、まとめてPOSTで受け取っています) ◆取得側 function cnv_formstr($array1) { foreach($array1 as $k => $v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v,ENT_QUOTES); $array1[$k]=$v; } return $array1; } $prmarray_post = cnv_formstr($_POST); $data_cnt = isset($prmarray_post["data_cnt"]) ? $prmarray_post["data_cnt"] : ""; for ($i = 0; $i < $data_cnt; $i++) { $test_data[$i] = isset($prmarray_post["test_data[".$i."]"]) ? $prmarray_post["test_data[".$i."]"] : ""; } ◆送信側(html部分のphp宣言解除記述は省きます) <input type="hidden" name="data_cnt" value="<?=$data_cnt?>"> for ($i = 0 ; $i <= $data_cnt; $i++) { <input type="hidden" name="test_data[<?=$i?>]" value="<?=$test_data[$i]?>"> } という感じでやりたいです。 わかりにくかったらすみません(-_-; よろしくお願いします。

    • ベストアンサー
    • PHP
  • POSTされた値の\問題

    はじめて質問させていただきます。最近PHPをはじめたばかりの初心者の私です。お願いいたします。 お問い合わせフォームを作っているのですがPOSTされた値の\問題を取り除く下の文なのですが、これを$_POST全部にあてはめることは可能でしょうか?一括でということです。ご回答お願いいたします。 if(get_magic_quotes_gpc()){ $name = stripslashes($name); $age = stripslashes($age); ・ ・ ・ ↑私はこれをなんと12個書いています(恥) ちなみに $name = htmlspecialchars ($name); も同様に・・・・。 ・}

    • ベストアンサー
    • PHP
  • php 送信されたフォームについて

    送信されたフォームの受け取る側のソースを書いたのですが、 <?php $i = 0; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; print('正解数'.$i./4'です'); ?> を付け加えるとエラーが表示されます。エラーの対象になっているのは print('正解数'.$i./4'です');らしいのですが、なぜエラーになるのかわかりません 回答お願いします。 以下ソースです。 <html> <head> <title>解答</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style type=""text/css""> #container{ width:1000 } #main{ width:500px; float:right; } #sidebar{ width:500px; float:left; } </style> </head> <body> <div id="container"> <div id="main"> <p>問題の解答</p> <p>問1</p> <p>(1)(2)(3)(4)</p> <p>問2</p> <p>(1)(2)(3)(4)</p> <p>問2</p> <p>(1)(2)(3)(4)</p> </div> <div id="sidebar"> <p><>あなたの解答<></p> <p>問1</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran11'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran12'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran13'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran14'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問2</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran21'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran22'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran23'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran24'], ENT_QUOTES, 'UTF-8')); ?> </p> <p>問3</p> <p>(1)<?php print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')); ?> (2)<?php print(htmlspecialchars($_POST['kaitouran32'], ENT_QUOTES, 'UTF-8')); ?> (3)<?php print(htmlspecialchars($_POST['kaitouran33'], ENT_QUOTES, 'UTF-8')); ?> (4)<?php print(htmlspecialchars($_POST['kaitouran34'], ENT_QUOTES, 'UTF-8')); ?> </p> </div> </div> <?php $i = 0; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; if(print(htmlspecialchars($_POST['kaitouran31'], ENT_QUOTES, 'UTF-8')) == 'a') $i++; print('正解数'.$i./4'です'); ?> </body> </html>

    • 締切済み
    • PHP
  • メールフォーム セキュリティについての質問

    メールフォーム セキュリティについての質問 はじめまして。 現在PHPを勉強中で、とりあえずメールフォームを サンプル本を参考にして作ろうとしているのですが、 不明なところが出てきたので質問させていただきました。 セキュリティのために入力された文字を htmlspecialchars を使って エスケープをするのですが、それをメールで受信するときには 正常に戻した状態(デコード?)で表示したいと思い 送信するためのスクリプトの前で html_entity_decode を使って再変換しようと 考えているのですが、これはセキュリティ上良くないのでしょうか? 以下は入力画面から確認画面で送信ボタンを 押した後に読み込む送信用のPHPファイルです。 環境はPHP 5.2となります。 <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } // 文字化け対応 mb_language("Japanese"); mb_internal_encoding("UTF-8"); $to = "xx@xx.ne.jp"; $contact = "お名前:$name\nメールアドレス:$from\nタイトル:$title\n内容:$naiyou\n"; $contact = html_entity_decode($contact); if (mb_send_mail($to,$title,$contact,"From:$from")) { echo "メールを送信しました"; } else { echo "メール送信失敗です"; } ?> 以上 初心者のため質問に不備があるかもしれず 申し訳ありませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPメールフォームの、記入内容のチェック方法を教えてください>-<

    PHPの初心者です。 問い合わせフォームを作成していたのですが、 間違いの無いように メールアドレスを2回入力してもらって その2つが合ってるかどうかをチェックする という仕組みを作りたいのですが、 どのように記述すれば良いのか教えて頂けませんでしょうか。 フォームチェックの部分はこのように記述しています。 <? // フォームの値を取得します。 if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k => $v){ // 「magic_quotes_gpc = On」のときはエスケープ解除 if (get_magic_quotes_gpc()) { $v = stripslashes($v); } $v = htmlspecialchars($v); $$k = $v; } } else { exit(); } // 値をチェックします。 $ErrFlg = 0; if ($name == "") { echo "<div style='width: 500px; padding:5px 5px 5px 5px; font-size:12px;'>入力に誤りがあります。必要事項をお確かめの上「入力フォームに戻る」ボタンでお戻りください。</div>"; $ErrFlg = 1; } echo "<table width='93%' border='0' cellpadding='5' cellspacing='1' bgcolor='#c7c2af'>"; if ($name == "") { echo "<tr>"; echo "<td bgcolor='#FFFFFF'>「お名前」が入力されておりません。</td>"; echo "</tr>"; $ErrFlg = 1; } if ($ErrFlg == 1) { echo "</table>"; echo "<br>"; echo "<div id='submit' style='width: 450px; padding:5px 5px 5px 5px; font-size:12px; text-align:center;'>"; echo "<a href='javascript:javascript:history.go(-1);'>戻る</a>"; echo "</div>"; } if (!$ErrFlg) { ?>

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • 水酸化物、水和物、酸化物はそれぞれ異なる物質の性質を持っています。
  • これらの物質の官能基を分解する方法について知りたいです。
  • また、これらの物質を分解するには、水中に入れる方法や酸素雰囲気で高温加熱する方法が考えられます。
回答を見る