こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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>

大変申し訳ございませんが、この投稿に添付された画像や動画などは、「BIGLOBEなんでも相談室」ではご覧いただくことができません。 OKWAVEよりご覧ください。

マルチメディア機能とは?

投稿日時 - 2012-05-06 02:23:17

QNo.7460242

すぐに回答ほしいです

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

>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)

としてやるのが良いですし、一般的です。

投稿日時 - 2012-05-06 08:40:18

お礼

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

投稿日時 - 2012-05-06 21:13:47

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

追加で、

$values = htmlspecialchars($_POST["no"][$key_no],ENT_QUOTES);

の部分、すでに$key_noを+1した値が入ってるとだめなので、
やはり+1は表示する直前か、表示用の別の変数を用意してやってください。

投稿日時 - 2012-05-06 08:43:49

ANo.3

>このコードを書いたphpファイルのパスを
>ブラウザのURL欄に入力してEnterを押しても何も表示されず、
>表示される画面は真っ白な状態です。
>ちなみに、試しにphpの部分を全て削除すればformの部分が表示されます。

思うようにどころか、それは動いてませんね。
ちなみに、phpの動作確認自体はとれてますか?

サーバーのエラー文がでないということはphpのエラーかもしれません。
単純にテスト環境であるなら、
php.iniの

display_errors = Off

のところをOnに変えて見てください。
なにかしらエラー文がでるかもしれません。

投稿日時 - 2012-05-06 05:28:03

お礼

ありがとうございます。
再度試したところ、
Parse error: syntax error, unexpected $end in ××× on line 32
といったエラーが出てきました。

「解析エラー: 文法のエラー 予想外の$で終わっている。それは32列目で判断されました。」
という意味になるのでしょうか。32列目は</html>の列です。
$が抜けているか余分ということか見直してみたのですが、見つかりませんでした。

投稿日時 - 2012-05-06 06:08:06

ANo.2

まず、どういう風に動かないか、なるべく正確にお教えいただけますでしょうか。

添付の画像は問題を示しているものなのでしょうか?
添付の画像と質問文を見る限りでは、何が間違っていて、どう動かないのか見当がつきません。

投稿日時 - 2012-05-06 04:45:45

お礼

Apache/2.4.1 (Win32) PHP/5.2.17の環境で動かしています。

添付画像はイラストレーターで作ったもので実現したいイメージです。

このコードを書いたphpファイルのパスを
ブラウザのURL欄に入力してEnterを押しても何も表示されず、
表示される画面は真っ白な状態です。
ちなみに、試しにphpの部分を全て削除すればformの部分が表示されます。

投稿日時 - 2012-05-06 05:10:35

ANo.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>

投稿日時 - 2012-05-06 03:30:37

お礼

ありがとうございます。
さっそく試してみましたが、ちゃんと動きませんでした。
ページを開いても真っ白な画面のままになってしまいます。

while($key_no = key($_POST[no])+1)は、
参考書を参考にしてやってみたのですが正しいでしょうか。

inputのvalueは空の場合は省略してもよいのですね。

投稿日時 - 2012-05-06 04:09:53