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

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

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

formに入力した値をPOSTを配列として送信し、 そのキーと値の一覧表を作ってみようとしたのですが、 思うように動いてくれません。何が間違っているのでしょうか。 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>POSTを配列で送信して取得する</title> </head> <body> <?php if($_SERVER[REQUEST_METHOD]=="POST"){ if(isset($_POST["submit_no"])){ echo "<table border=\"1\"><tr><td>番号</td><td>内用</td><tr>"; while($key_no = key($_POST[no])+1){ //+1は番号を1から表示させるため $values = htmlspecialchars($_POST[no],ENT_QUOTES); echo <<< EOS <tr> <td>$key_no</td> <td>$values</td> </tr> EOS; } echo "</table>"; } } ?> <form action="post_hairetu.php" method="POST" enctype="multipart/form-data"> 1<input type="text" name="no[]" value="" /><br /> 2<input type="text" name="no[]" value="" /><br /> 3<input type="text" name="no[]" value="" /><br /> <input type="submit" name="submit_no" value="送信" /> </form> </body> </html>

  • PHP
  • 回答数5
  • ありがとう数4

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

  • ベストアンサー
回答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

  • Servletへフォームから配列を送信できますか?

    PHPでは、下記のようにHTMLを記述することで、 フォーム内容を配列で送信及び取得できるのですが、 Servletで同じ事をするにはどうすれば良いでしょうか? <HTML><title>一括更新</title><BODY> <form action=./test.php method=post> <table> <tr><td> <input type=input name=a[0] value="1"> <input type=input name=b[0] value="2"> </td></tr> <tr><td> <input type=input name=a[1] value="1"> <input type=input name=b[1] value="2"> </td></tr> </table> <input type="submit" value="更新"> </form></BODY></HTML>

  • submitボタンにvalue属性の値でないラベルを表示したい

    submitボタンを複数設置し,全てのラベルに「これを修正する」と表示したいのですが, 下記のように押下されたsubmitボタン別に,POSTする値をそれぞれ1,2,3と分けたいです. (page.phpは,$_POST["PageNumber"]として1か2か3を受け取る) ですが,value属性の値がボタンのラベルとしてボタン表面に記されてしまい,困っています. 何とかならないでしょうか? <form method="post" action="page.php"> <input type="submit" name="PageNumber" value="1"></td></tr> <input type="submit" name="PageNumber" value="2"></td></tr> <input type="submit" name="PageNumber" value="3"></td></tr> </form>

    • ベストアンサー
    • HTML
  • forで作成したフォームの値を更にPHPへ渡して表示する方法

    初心者です。 現在、PHPでforを利用し、繰り返しフォームを表示 させた後、その表示されたフォームへ入力をし、更に 違うPHPで入力された値を出力させようとしているのですが、 最終の出力が出来ずに悩んでおります。 繰り返しでフォームを作成するまでは出来たのですが、 どなたか御助力頂けたら助かります。 ---------------------------------------------------- <form.html> <html> <head> <title>it1</title> </head> <body> <form name="form" action="./it.php" method="POST"> <b>ラジオ選択<br> <input name="machine" type="radio" value="24">24<br> <input name="machine" type="radio" value="48">48<br> <input name="machine" type="radio" value="24">50</b><br><br> </body> <input type="submit" name="Submit" value="設定"> </form> </html> ------------------------------------------------------ <it.php> <?php $a = $_REQUEST["machine"]; ?> <html> <body> <p>入力テキストボックス表示</p> <?php for ($c=0; $c<$a; $c++){ $var[$c] += $var[$c]; $dest[$c] += $dest[$c]; $no[$c] += $c+1; } ?> <table> <tr> <td><center> <form name="form" action="./it2.php" method="POST"> <td> <center> <b>vlan</b><br> <?php for ($i=0; $i<count($var); $i++) { "<form name="form" action="./it2.php" method="POST">" print("fa0/${no[$i]}<input type=\"text\" name=\"${var[$i]}\" size=\"3\" maxlength=\"3\"><br>\n"); } ?> </td> <td> <b>description</b><br> <?php for ($i=0; $i<count($dest); $i++) { print("<input type=\"text\" name=\"${dest[$i]}\" size=\"15\" maxlength=\"15\"><br>\n"); } ?> </td> </tr> </table> <input type="submit" name="Submit" value="設定"> </form> </body> </html> -------------------------------------------------------- 以降の出力ソースに関して、難儀中。

    • ベストアンサー
    • PHP
  • JSPで個人データを入力、出力

    <html> <head><title>Costomer</head></title> <body bgcolor="white"> <div align="center"> <%@ include file="header.html"%> <form method="POST"action="customer.jsp"> <TABLE> <TR> <TD>Name</TD> <TD><input type="text" name="name"></TD> </TR><br> <TR> <TD>Mail Address</TD> <TD><input type="text" name="mail address"></TD> </TR><br> <TR> <TD>TEL No</TD> <TD><input type="text" name="tel no"></TD> </TR><br> </TABLE> <br> <input type="submit"value="Submit"> <input type="reset"value="Cancel"> </form> <jsp:include page="post-response.jsp" flush ="true" /> <%@ include file="copyright.html"%> </div> </body> </html> …………………………………………………………………………………… <html> <head><title>Post-Response</head></title> <body bgcolor="white"> <div align="center"> <TABLE BORDER="1"> <TR> <TD>Name</TD> <TD></TD> </TR><br> <TR> <TD>Mail Address</TD> <TD></TD> </TR><br> <TR> <TD>TEL No</TD> <TD></TD> </TR><br> </TABLE> <form method="GET"action="customer.jsp"> <input type="reset"value="Clear"> <br> </form> </div> </body> </html> …………………………………………………………………………………… 上のcustomer.jspにName,Mail Adress,Tel no,を入力し、打ち込んだものを下のpost-response.jspに出力したいのですがどのように出力したらよいのかわかりません!何度やってもエラーが出てしまいます。 教えてください!!お願いします! ・上のcustomer.jsp内の<%@ include file="header.html"%>と<%@ include file="copyright.html"%>無視してください!

  • 複数のsubmitボタンを使い値を送信する

    <form action="/サーブレットへ" method="post"> <input type ="TEXT" NAME="text1"> <input type ="TEXT" NAME="text2"><br> <textarea name="zzzz" cols="100" rows="10"> </textarea> <input type="hidden" name="a1" value="3"> <input type="submit" name="a1" value="作成"> <input type="hidden" name="a1" value="2"> <input type="submit" name="a1" value="修正"> </form> 複数のsubmitを使用してそれぞれ違う、値又は変数を渡し処理をしたいのですが、わかりません。 分かる方がいましたら教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • PHPでのメールフォームにつてい。下記のソースで送信・受信できますか?

    それから、何処に、送信先のアドレスを入れればいいでしょうか?? <html lang="ja"> <head> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>mail</title> </head> <body> <br> <h3>Mail Form</h3> <!-- error --> <?PHPif ($error) { echo $error; }else{?><!-- form --> <form enctype="multipart/form-data" action="<?PHP echo EXE; ?>" method="post"> <table> <tr> <td>題名</td> <td><input type="text" name="subj" size="34" value="題名"></td> </tr> <tr> <td>アドレス</td> <td><input type="text" name="mail" size="34" value="あなたのアドレス"></td> </tr> <tr> <td>名前</td> <td><input type="text" name="name" size="34" value="ここに名前"</td> </tr> <tr> <td>内容</td> <td> <textarea name="???" cols="50" rows="10" wrap="soft"> ここに内容</textarea> </td> </tr> <tr> <td> File </td><td><input type="file" name="file" size="28"> <input type="submit" value="送信"> </td></tr> </table> <br> </body></html>

    • ベストアンサー
    • PHP
  • POSTすると配列の数がおかしくなる

    matとquaとhowtoをそれぞれ4つPOSTしているのですが、POSTされたデータを受け取るとmat4つ、qua5つ、howto5つと数がおかしくなります。 なぜかわかりません。とくにインクリメントしていないのに増えます。 教えて下さい。 <script type="text/javascript"> function myAdd(obj){ var max=15; var c=count("mat"); if(c>=max) return false; var oTR=document.createElement("tr"); var names=["mat","qua"]; for(var i in names){ var oTD = document.createElement("td"); var oTag = document.createElement("input"); oTag.setAttribute("type", "text"); oTag.setAttribute("name", names[i] + (c+1).toString()); oTD.appendChild(oTag); oTR.appendChild(oTD); } document.getElementById("t0").getElementsByTagName("tbody")[0].appendChild(oTR); if(c>=max-1) obj.disabled=true; } function count(name){ var tags=document.getElementsByTagName("input"); var ta=document.getElementsByTagName("textarea"); var c=0; var reg=RegExp("^"+name+"[0-9]+$"); if(tags){ for(var i=0;i<tags.length;i++){ if(tags[i].name.match(reg)){ c++; } } } if(ta){ for(var i=0;i<ta.length;i++){ if(ta[i].name.match(reg)){ c++; } } } return c; } function myTextAreaAdd(obj){ var max=15; var c=count("howto"); if(c>=max) return false; var oTag = document.createElement("textarea"); oTag.setAttribute("name", "howto" + tag_num++); var oDiv = document.getElementById("area"); oDiv.appendChild(oTag); if(c>=max-1) obj.disabled=true; } </script> </head> <body> <form method="post" enctype="multipart/form-data" action="check.php"> <textarea name="explain"></textarea> <table id="t0" border> <tbody> <tr> <td><input type="text" name="mat1" /></td> <td><input type="text" name="qua1" /></td> </tr> <tr> <td><input type="text" name="mat2" /></td> <td><input type="text" name="qua2" /></td> </tr> <tr> <td><input type="text" name="mat3" /></td> <td><input type="text" name="qua3" /></td> </tr> <tr> <td><input type="text" name="mat4" /></td> <td><input type="text" name="qua4" /></td> </tr> </tbody> </table> <input type="button" value="追加する" onClick="myAdd(this)"> <br /> <span id="area"> <textarea name="howto1"></textarea> <textarea name="howto2"></textarea> <textarea name="howto3"></textarea> <textarea name="howto4"></textarea> </span><br /> <input type="button" value="追加する" onClick="myTextAreaAdd(this)"> <input type="submit" value="送る"> </form>

  • Yes/No型を使ってアップロード

    はじめまして。 下記にhtmlを書かせていただいてますが、このhtmlの『アップロード』のボタンを押すと 1. データベース『mdb』のYes/No型にチェックが入る 2. Yes/No型にチェックが入ったものはアップロードされる ようにすることはできるでしょうか?また、何か参考になるサイト様などがあれば 教えていただきたいのです。 おわかりになる方、よろしくお願いします。 下記のような↓フォームです。 ---------------------- <table> <TR> <TD> <INPUT type='hidden' NAME='UPDATE_ID' VALUE='1'> <center><INPUT TYPE='submit' VALUE=' アップロード '><br><center> <p></p> </TD> <TD>登録ファイル1</TD></FORM> <FORM ACTION='' METHOD='POST'> <TR> <TD> <INPUT type='hidden' NAME='UPDATE_ID' VALUE='2'> <center><INPUT TYPE='submit' VALUE=' アップロード '><br><center> <p></p> </TD> <TD>登録ファイル2</TD></FORM> <FORM ACTION='' METHOD='POST'> <INPUT type='hidden' NAME='UPDATE_ID' VALUE='3'> <TR> <TR> </FORM> <TR> </table>

  • ボタンクリックでフォーカス移動

    JavaScript超ビギナーなので方法がよくわかりません。 フォームにテキストボックス(配列)4個あり ボタンを押すたびに未記入のテキストボックスにカーソルを移動したいのですが。どのようにしたらいいでしょうか。 <form name="form1" method="post"> <table width="200" border="1"> <tr><td ><input type="submit" name="Submit" value="送信"></td></tr> <tr><td ><input type="text" name="name1"></td></tr> <tr><td><input type="text" name="name1"></td></tr> <tr><td><input type="text" name="name1"></td></tr> <tr><td><input type="text" name="name1"></td></tr> </table> </form>

  • javascriptの変数の渡し方

    ラジオボタンで選択した値によって表示するテーブルを変えるフォームを作っています。 AAAは入力ボックスが1つ BBBは入力ボックスが2つ 同じphpへ送信して、入力ボックスへデータは入るのですが、javascriptの値を渡すことが出来ません。 BBBでsubmit後、BBBの入力ボックスを表示することは出来ますでしょうか。 <? echo "<form method=post action=?>"; echo "<input type=radio name='user' onclick='change_user(this.value)' uid='user' value=1"; if($user==1){ echo " checked"; } echo ">AAA"; echo "<input type=radio name='user' onclick='change_user(this.value)' uid='user' value=2"; if($user==2){ echo " checked"; } echo ">BBB"; echo "<br>"; echo "<span id=inner>"; echo "<table>"; echo "<tr>"; echo "<td>AAAのフォーム</td>"; echo "<td><input name=form1 type=text value=$form1></td>"; echo "</tr>"; echo "</table>"; echo "</span>"; echo "<span id=outer>"; echo "<table>"; echo "<tr>"; echo "<td>BBBのフォーム</td>"; echo "<td><input name=form1 type=text value=$form1></td>"; echo "<td><input name=form2 type=text value=$form2></td>"; echo "</tr>"; echo "</table>"; echo "</span>"; echo "<br>"; echo "<input type=submit value=submit>"; echo "</form>"; ?> <script language='javascript'> var inner = document.getElementById('inner'); var outer = document.getElementById('outer'); function change_user (uid) { if (uid == '2') { inner.style.display = 'none'; outer.style.display = ''; } else { inner.style.display = ''; outer.style.display = 'none'; } } change_user(document.getElementById('user').value); </script>

    • ベストアンサー
    • PHP

専門家に質問してみよう