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

解決済みの質問

フォームのボタンが表示されない

PHP初心者です。
下のコードは「お友だちリスト」を表示させ、リストの中から「お友だちの詳細を見る」または「メールを送信する」を選択させようというものです。
「お友だちの詳細を見る」では、「詳細(GET)コンボ」をクリックし、GETでIDを次画面に渡します。
「メールを送信する」では、Form内の「このお友だちを選択」ボタンをクリックさせて、次画面にPOSTでIDを送ろうというものです。
ところが、「このお友だちを選択」ボタンが画面に表示されません。
コード上のどこに問題があるのか教えて下さい。
また、このケースでは、操作する人の判断によって遷移する次画面を選択するわけですが、GETとPOSTを使い分けることによって実現しようと考えましたが、他にもよい方法があったら教えて下さい。
よろしくお願いします。

while($row = mysql_fetch_array($res)){
echo("<tr>");
echo("<td>".$row["customer_id"]."</td>");
echo("<td>".$row["customer_name"]."</td>");
echo("<td>".$row["customer_nicname"]."</td>");
echo("<td>".$row["phone"]."</td>");
echo("<td>".$row["mail_1"]."</td>");
echo("<td>".$row["status"]."</td>");

echo("<td><a href=\"indicate_detail.php?id=" .$id."\">詳細(GET)コンボ</a></td>");

echo '<form action="mail_message.php" method="post">';
echo '<input type="hidden" name="customer_id" value="' .$id.' />';
echo '<td><input type="submit" name="choice" value="このお友だちを選択" /></td>';

echo '</form">';

echo("</tr>\n");

}

投稿日時 - 2010-03-18 05:11:52

QNo.5760673

困ってます

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

> echo '<input type="hidden" name="customer_id" value="' .$id.' />';

これ、俺もよくやっちゃうんですけど、$id の 後ろをよく見てください。
ダブルクォートが足りません。
その為、それ以降のタグをブラウザが認識していません。


あと、$id が 提示されてあるスクリプトの中には、どこにも代入してあるところが見当たりません。


> GETとPOSTを使い分けることによって実現しようと考えましたが、

これは <a>タグ と <form>タグの使い分けと脳内変換しました。


あと #2 さんへのツッコみ。

> 上記のform部分がtdに囲まれていないため、HTMLとして不正なものである事が原因だと思います。

実は これは よくやるワザのようなものです。
<td><form>~</form></td> という書き方をすると、その枠の中に 妙な改行が入ってしまうのです。
cssとかで なんやかんやすれば なんとかなるのかもしれませんが。
俺が使ってるブラウザ(IE,Sleipnir,FireFox,Safari,Opera いずれもwindows版)では
<form><td>~</td></form> の書き方でも ちゃんと動作してくれたりします。

投稿日時 - 2010-03-18 14:51:21

お礼

ご連絡しそびれて申し訳ありません。ばかばかしいミスでしたが、キチッとていねいにやらなければいけない、と思いました。ありがとうございました。

投稿日時 - 2010-04-16 08:33:56

ANo.3

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

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

回答(5)

ANo.5

#3様
>ダブルクォートが足りません。
なるほど、見落としてました。

ツッコミどうも^^
上記見落としたうえで、原因追究した結果(しかもHTML書いて確認したりはしなかったので)、HTMLとして不正な個所に目を付けました。
基本プログラマあがりなので、仕様や規格にこだわってしまうのが良い点でもあり、悪い点でもあり。

それでは、原因判明したということでHTML構文の確認に便利な小技(という程ではないが)を。

実行した結果、表示がうまくできない場合。
その出力結果の画面で、右クリックでソースの表示とすると出力結果のHTMLが表示されます。
そのHTMLをHTMLエディタにコピペすると、HTML要素等がハイライト表示されて確認しやすい。(※私はソースの表示の段階でハイライト表示してくれるFireFoxが大好きになりました)
私はさらにDreamWeaverに貼りつけてバリデート(構文解析/確認)、PHPソースからたどるより簡単便利。
PHPソースそのままでは使えない、W3Cのチェックツールもこの方法なら使えます。

投稿日時 - 2010-03-18 15:35:14

ANo.4

連投すみません。

> その為、それ以降のタグをブラウザが認識していません。
語弊があったので、言い直します。

それ以降のタグは、次の ダブルクォートが来るまでの間を、value の内容として認識してしまいます。
今回の場合、↓みたいな状態。

"/><td><input type="

ちゃんと検証したわけではないんですけど、多分 こんな感じだと思います。

投稿日時 - 2010-03-18 14:55:52

ANo.2

>echo '<form action="mail_message.php" method="post">';
>echo '<input type="hidden" name="customer_id" value="' .$id.' />';
>echo '<td><input type="submit" name="choice" value="このお友だちを選択" /></td>';
>echo '</form">';
上記のform部分がtdに囲まれていないため、HTMLとして不正なものである事が原因だと思います。
おそらく、各ブラウザによって表示結果が異なるのではないかという気がしますが。

form等はデフォルトでは画面表示されない(ように見える※)事は事実ですが、画面表示されないからといってHTMLとして不正な形に組んでしまうと、レンダリングエンジンがパニックをおこしてしまいます。
(※実際にはCSSで背景色等を指定すれば判りますが、画面表示もされてますし)

ちなみに、name="choice" は不要に見えますね。
別に大したことではありませんが、無意味に毎回、$_POST['choice']("このお友だちを選択")が送信されていると思います。

GETとPOSTで使い分け、ってのがちょっと意味が判りませんが。
indicate_detail.php
mail_message.php
と、遷移先が異なってますから。
仮に、共通の遷移先だと仮定して、GETで送られた場合とPOSTで送られた場合とで、全然別の処理ってのはあまりしませんね。
どちらかと言えば、引数Action="hogehoge" / "fugafuga" / "gonyogonyo" を付加して動作が変わるという方が多いかと思います。

投稿日時 - 2010-03-18 10:46:27

原因は、同じ名前のformやsubmitボタンが大量にできているからです。
下記のようにすれば改善するはずです。

----------------------------------------
echo '<form action="mail_message.php" method="post">';
while($row = mysql_fetch_array($res)){
echo("<tr>");
echo("<td>".$row["customer_id"]."</td>");
echo("<td>".$row["customer_name"]."</td>");
echo("<td>".$row["customer_nicname"]."</td>");
echo("<td>".$row["phone"]."</td>");
echo("<td>".$row["mail_1"]."</td>");
echo("<td>".$row["status"]."</td>");

echo("<td><a href=\"indicate_detail.php?id=" .$id."\">詳細(GET)コンボ</a></td>");
echo '<input type="hidden" name="customer_id[' . $row["customer_id"] . ']" value="' .$id.' />';
echo '<td><input type="submit" name="choice[' . $row["customer_id"] . ']" value="このお友だちを選択" /></td>';
echo("</tr>\n");
}
echo '</form">';

投稿日時 - 2010-03-18 07:09:36

あなたにオススメの質問