• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:POSTを配列として送信し、キーと値を一覧で表示)

配列としてPOSTを送信し、キーと値を一覧で表示する方法

このQ&Aのポイント
  • PHPを使って、フォームで入力した値を配列としてPOSTで送信し、キーと値の一覧表を表示する方法を解説します。
  • HTMLフォームで入力した値を配列に格納し、その配列をPOSTで送信します。
  • 受け取ったPOSTデータをループ処理で一つずつ取り出し、キーと値を表示します。

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

  • ベストアンサー
回答No.4

>Parse error: syntax error, unexpected $end in ××× on line 32 これは構文エラーで、?>とかがちゃんと終わってないときに出るものなんですが、 見る限りおかしいところはありません。 とりあえず、以下参考になりそうな質問を見つけてきたので、確認してみてください。 http://okwave.jp/qa/q3026151.html それと実際に私の方でも実行してみたのですが、いくつかミスがあるのと、 ロジック的な問題で、POSTした先で無限ループに陥ってしまいました。 まずはこの部分、 while($key_no = key($_POST["no"])+1){ このkey関数は現在の配列ポインタのキーを返し、 最後までいくとNULLを返しますが、 残念ながら実行しても内部ポインタは進みません。 なので、ループの最後で next($_POST["no"]); としてやって内部ポインタを進めてやらない限り永久に最初のキーを返し続けます。 それと +1 の部分。 whileは()の中の結果がFALSEと==にならない限りループを続けます。 いくらkey($_POST["no"])で配列の最後に達してNULLが返ってきたとしても、 +1 をされているので、NULLが0に暗黙変換され、key($_POST["no"])+1 の結果は 1 となってしまい、 $key_no に 1 が入り続けてしまいます。 ですので、+1はループの中で行ってください。 そうすると、 while($key_no = key($_POST["no"])){ になると思いますが、これでもだめで、$_POST["no"]の最初のキーは数字の0、 つまりこれはFALSEと==になってしまいます。 なので、この場合1ループも実行されません。 ですので、 while(NULL !== ($key_no = key($_POST["no"]))){ としてやる必要があります。 それとミスが一つ、 $values = htmlspecialchars($_POST[no],ENT_QUOTES); この部分は $values = htmlspecialchars($_POST["no"][$key_no],ENT_QUOTES); ですね。 最後に、連想配列のキーを$array[key]といった感じで、クオートで囲わずに書いてますが、 これでも一応は動くのですが、これは間違いで、 連想配列のキーは文字列なので必ず $array["key"] といった感じで書いてやってください。 じゃぁなぜ動くの?って思いますが、 それはPHPの仕様で、意味を成さない文字列は文字列として自動解釈されてしまうからです。 本来、$array[key]と書いた場合、keyというまず定数を探しますから、 もし、keyという名前の定数が定義されていた場合、それに格納された値が返ってきてしまいます。 っと、長々と説明しましたが、 結局のところ配列と取り出す場合は、速度的に foreach($_POST["no"] as $key => $value) としてやるのが良いですし、一般的です。

kiseki777
質問者

お礼

EOS;の前のTABスペースが原因でした。削除したところちゃんと動きました。 while($key_no = key($_POST["no"])){の部分ですが、 内部ポインタが進まず正しく動かないのですね。 whileよりもforeachを基本としてやっていきます。 ありがとうございます。

その他の回答 (4)

回答No.5

追加で、 $values = htmlspecialchars($_POST["no"][$key_no],ENT_QUOTES); の部分、すでに$key_noを+1した値が入ってるとだめなので、 やはり+1は表示する直前か、表示用の別の変数を用意してやってください。

回答No.3

>このコードを書いたphpファイルのパスを >ブラウザのURL欄に入力してEnterを押しても何も表示されず、 >表示される画面は真っ白な状態です。 >ちなみに、試しにphpの部分を全て削除すればformの部分が表示されます。 思うようにどころか、それは動いてませんね。 ちなみに、phpの動作確認自体はとれてますか? サーバーのエラー文がでないということはphpのエラーかもしれません。 単純にテスト環境であるなら、 php.iniの display_errors = Off のところをOnに変えて見てください。 なにかしらエラー文がでるかもしれません。

kiseki777
質問者

お礼

ありがとうございます。 再度試したところ、 Parse error: syntax error, unexpected $end in ××× on line 32 といったエラーが出てきました。 「解析エラー: 文法のエラー 予想外の$で終わっている。それは32列目で判断されました。」 という意味になるのでしょうか。32列目は</html>の列です。 $が抜けているか余分ということか見直してみたのですが、見つかりませんでした。

回答No.2

まず、どういう風に動かないか、なるべく正確にお教えいただけますでしょうか。 添付の画像は問題を示しているものなのでしょうか? 添付の画像と質問文を見る限りでは、何が間違っていて、どう動かないのか見当がつきません。

kiseki777
質問者

お礼

Apache/2.4.1 (Win32) PHP/5.2.17の環境で動かしています。 添付画像はイラストレーターで作ったもので実現したいイメージです。 このコードを書いたphpファイルのパスを ブラウザのURL欄に入力してEnterを押しても何も表示されず、 表示される画面は真っ白な状態です。 ちなみに、試しにphpの部分を全て削除すればformの部分が表示されます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

foreachでまわすほうがロジックが簡略では? その他いろいろ無駄な処理も整理できそうですね <?php if(isset($_REQUEST["no"]) and is_array($_REQUEST["no"])){ echo "<table border=\"1\"><tr><td>番号</td><td>内用</td></tr>"; foreach($_REQUEST["no"] as $key=>$val){ $key++; $val = htmlspecialchars($val); echo <<< EOS <tr> <td>{$key}</td> <td>{$val}</td> </tr> EOS; } echo "</table>"; } ?> <form> 1<input type="text" name="no[]"><br> 2<input type="text" name="no[]"><br> 3<input type="text" name="no[]"><br> <input type="submit" value="送信"> </form>

kiseki777
質問者

お礼

ありがとうございます。 さっそく試してみましたが、ちゃんと動きませんでした。 ページを開いても真っ白な画面のままになってしまいます。 while($key_no = key($_POST[no])+1)は、 参考書を参考にしてやってみたのですが正しいでしょうか。 inputのvalueは空の場合は省略してもよいのですね。

関連するQ&A

専門家に質問してみよう