• 締切済み

PHP foreachのループの中でPOST送信

現在掲示板を作っています。 <?php foreach ($result as $record){ $id = $record ["id"]; $title = $record ["title"]; ?> <form method="post" name="form1" action="contents.php"> <input type="hidden" name="id" value="<?php echo $id; ?>"> <a href="javascript:form1.submit()" ><?php echo $title; ?></a> </form> <?php } $dbInfo = null; ?> </form> テーブルのidとtitleをすべて取り出しています。 titleを一覧表示で全件表示させリンクを貼り、移動先にidをPOSTで送信し投稿内容がみられるようにしたいのですが、リンクを貼れても飛べなかったり、移動できてもなにも送信していない状態(ただ移動しただけ)だったり。 2つ目のphp直後の「}」を1つ目の中で閉じるとPOST送信しつつ移動できるのですが、1件しか表示されなくなってしまいます。 <form method="POST" name="con-id"> <input type="hidden" name="id" value="<?php echo $id; ?>"> <a href='contents.php'><?php echo $title; ?></a> </form> などもしてみましたが、POST送信はされませんでした。 なにか方法はありませんでしょうか? ここをこうした方がいい、など教えて頂きたいです。 よろしくお願いいたします。

みんなの回答

回答No.2

> 2つ目のphp直後の「}」を1つ目の中で閉じるとPOST送信しつつ移動できるのですが、1件しか表示されなくなってしまいます。 複数の <form >~</form>を生成させていたのを  foreachのループの外に出したのですから、当然そうなるでしょう。 (ループの最後の$idと$titleのみのformになるでしょう) ここは元に戻すとして、 PHPで生成されたHTMLソースを確認してみてください。 記事が2件あれば <form method="post" name="form1" action="contents.php"> <input type="hidden" name="id" value="1件目のID"> <a href="javascript:form1.submit()" >1件目のTITLE</a> </form> <form method="post" name="form1" action="contents.php"> <input type="hidden" name="id" value="2件目のID"> <a href="javascript:form1.submit()" >2件目のTITLE</a> </form> となってしまっていて、name="form1"や href="javascript:form1.submit()" が重複していませんか。

すると、全ての回答が全文表示されます。
回答No.1

>2つ目のphp直後の「}」を1つ目の中で閉じるとPOST送信しつつ移動できるのですが、1件しか表示されなくなってしまいます。 確認ですが。 アンカータグは、FORMのパーツではないので、正しくない事と <input type="submit" value="送信する"> などを記載すれば、正しくは出ると思います。 ただ「1件しか」が気になってます。 正確に10個リンクができても、どれか1つを押せば次の "contents.php"に飛ぶわけなので、常に「1件」だけ 表示されるのが普通かと。 考え方を逆にしないと、同時にn件を表示は できないと思います。 というのは、どれか一つの、リンク先である"contents.php"を 開いた時点で今開いてるページではなくなる =他のリンクは消滅する =動くわけがない! なので、今のページを維持したまま、次のコンテンツを 今表示しているHTMLに追加する概念にしないと 行けなくないですかね。。 ↑これは、今表示しているページに追加したいのが目的の場合。 単に次のページに移動して今のページがなくなっていいなら。 SUBMITを使えばいいだけです。 どちらかだと思います。 どんな風が理想でしょうか? <?php echo $id; ?> これですが、長いので <?= $id ?> でもいいですよ。 テストでしょうが、"?>"の後に、余計な"</form>"があるので、 これも削除にて(直接の問題とは無関係ですが) インナー取り込みなら、XHRや、AJAXを使えば 今見ているページそのものに他のコンテンツを結合できますよ。 ただ、それ自体をPHPで書いているので、だったら contents.phpをrequireにして。 中身に「コンテンツを送り出してもらう関数」を配置して function hogehoge($id) { // コンテンツを送り出す } を元々のforeachで回した方が、すっきりするとは 思いますが。(内部完結させるなら) という、3種類くらいのやり方がありますが。 どうでしょうか?

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

専門家に質問してみよう