【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

PHP初心者です。
教えて下さい。お願いします。

下記のようなプログラムを組んでいます。
セレクトメニューで選択されたメニューの結果を変数に入れたいのですが、入ってくれません。変数の中身は空でした。
MySQLのテーブルからデータを読み出し、それをループでオプションを作成しております。セレクトメニューには正常に表示されておりますが、その表示され選ばれた内容のデータが、変数に入っておりません。どこが間違っているのでしょうか。ご教授下さい。
宜しくお願い致します。
---------------------------------------------------------------
<?php

//MySQLの記述は殆ど割愛しています。


$sql = "SELECT chimei from tbltest";
$rst = mysql_query($sql);

$i=0;$cnt=0;
while($col = mysql_fetch_array($rst)) { //地名のデータを、MySQLより読み込んでおります。
$arychimei[$i] = $col[chimei]; //テーブル(配列)に格納しております。
$i++;
}

//この画面で確認するためのフォームです。
$body .= "<FORM name = 'selectform' action = '$PHP_SELF' method='POST'>"; 

$body .="地 名 
<SELECT name = 'chimei'>";
$body .= "<option selected> ";
for ($cunt=0;$cunt<=$i;$cunt++){
$body .= $option[$cunt] = '<OPTION>'.$arychimei[$cunt];
}

$body .= "</SELECT><BR>
<BR>
<BR>";

$body .= "<INPUT type = 'hidden' name = 'chimei' value = '$chimei'>";

$body .= "<INPUT type = 'submit' value = '検索'>

</FORM>
print "地名は".$chimei."です。<br>";
print $body;
?>

A 回答 (5件)

こんばんは。



簡単に、改善のポイントだけ書きますね。

(1)値をとりたい<select>タグは、<form>~</form>の間にあることが必要
(2)<option>タグ中に value 属性が必要(の はず)
(3)submit ボタンをクリックしたときに<select>タグの内容を得るための
$chimei = $_REQUEST['chimei'];
という命令が、プログラム中で必要

です。参考にしてください。

この回答への補足

早速のご回答有り難う御座います。
(1)のFORMの件は、SELECTタグがFORMの間に入ってい   ますので大丈夫ですね。
(2)はVALUEが無い場合は、OPTIONの値がそのままわたさ   れますね。それで、このままでOKですね。
(3)試して見ましたが、駄目でした。

しかし、OPTIONの値を、ダイレクトに設定すると、問題なく値が渡されます。FOR文で値を入れると駄目なのです。
例えば、

$body .="地 名 
<SELECT name = 'chimei'>";
$body .= "<option selected> ";
$body .= "<option> 東京
$body .= "<option> 名古屋";
$body .= $option[$cunt] = '<OPTION>'.$arychimei[$cunt];

これなら旨く値が渡されます。

補足日時:2007/03/19 13:16
    • good
    • 0
この回答へのお礼

$body .="地 名 
<SELECT name = 'chimei'>";
$body .= "<option selected> ";
$body .= "<option> 東京
$body .= "<option> 名古屋";
</select>

補足で間違っておりました。
最後の一行は要りません。
上記が正解です。
すみません。

お礼日時:2007/03/19 13:36

レスありがとうございます。

まず、回答しますね。

$_REQUEST['~~']  は、プログラムのできるだけ先頭のほうに、入れてあげてください。そうすればプログラムのどこででも、その値を参照できるようになりますからね。

 いや~、良かったですー robotanmarch さん! これで私も安心しました。今回のご質問によって、PHPに関して大きく進歩されたことと思います。
 わからないことは遠慮しないで、ご自身の納得できるまで尋ねようとする姿勢には、感服です。robotanmarch さんは、きっと良いエンジニアになられることでしょう。
 あと私の回答の中でけっこうキツい表現の部分があったこと、ひらにご容赦ください。

 また何かありましたら、このコーナーでお尋ねになってみてください。もし私が見つけたら、わかる範囲でお答えしたいと思いますので。
 では、頑張ってくださいね!
    • good
    • 0
この回答へのお礼

色々お世話になり有り難う御座いました。
これからも、少しずつですが勉強しながら頑張って行きたいと思います。非常に参考になりましたご指導を有り難う御座いました。
まだまだ道のりは遠いですけれど頑張ります。
有り難う御座いました。

お礼日時:2007/03/20 21:09

レスありがとうございます。



>下記の記述の件ですが、「$body .=」は、イコールではなく、$bodyの変数に、HTMLのタグの文字列を加えて、PHPでのHTMLを表示するためのテクニックなのです。

それは分かりますが、私の申し上げたいのは、同式内の2番目の「=」、すなわち「 $option[$cunt] = 」の「=」がなぜ必要か、ということなのです。

>それと、name = ’chime’は、同名で無ければ次に変数を渡すことが出来ません。

いや、名前が違っても「 $_REQUEST['~~']; 」の「~~」の部分を変更すれば大丈夫なのでは?

>FOR文を使った部分にのみ何か問題が有るのかを…

うん、一箇所、気がついた点がありました。それは for 文。いま「 for($cunt=0; $cunt<=$i; $cunt++){ 」になってますが、

「 ... $cunt<$i; ... 」

が正解じゃないかと。質問者さんのコードだと、$iが3のとき、ループを4回まわってしまうことになり、<OPTION> が ひとつ余計にできてしまうのでは?と思いました。

この回答への補足

hkd9001さん有り難う御座いました。
お陰様で旨く動きました。
有り難う御座いました。
本当はお礼の所でお礼を申し上げたかったのですが、先程続けて質問を書きましたのでふさがっており、補足内容に書いております。
本当に有り難う御座いました。
原因は、やはり「<FORM> ~ </FORM>」の挿入位置が悪かったのです。質問の記述は正しかったのですが、私自身の本当のプログラムが間違っておりました。よく見ればとんでもないところに入っておりました。恥ずかしいです。
FOR文も参考になり助かりました。

ちゃんと旨く変数の値渡しが出来ましたので喜んでおります。
私のような馬鹿な初心者に助言を戴きまして本当に有り難う御座いました。まだまだこれからも疑問点が出てくるかと思いますが、どうか宜しくお願い申し上げます。
hkd9001さん本当に有り難う御座いました。

robotanmarch

補足日時:2007/03/20 18:31
    • good
    • 0
この回答へのお礼

度々のレス、本当に有り難う御座います。

「私の申し上げたいのは、同式内の2番目の「=」、すなわち「 $option[$cunt] = 」の「=」がなぜ必要か、ということなのです。」
上記の件は理解致しました。そうですね。考えて見れば必要有りませんね。
さらに、配列変数に入れ組み立てようとしていました。必要の無いことを理解致しました。有り難う御座いました。

下記の件も有り難う御座いました。
余分に1回回っており、余分のOPTIONが出来ており、スペースが表示されておりました。
修正を致しました。有り難う御座いました。
「 ... $cunt<$i; ... 」

しかし、未だ根本的には解決しておりません。
「名前が違っても「 $_REQUEST['~~']; 」の「~~」の部分を変更すれば大丈夫なのでは?」
このアドバイスに従い挑戦してみます。
しかし、この記述をどこに入れれば良いのかが分かりません。
<INPUT ~ ~ > の値を渡す為のSUBMITの所でしょうか。余り、良く分からないので困っております。
どうか、宜しくお願い致します。

お礼日時:2007/03/20 17:46

レスありがとうございます。


まず、おわびです:
(1)の、<form>… の件は、私のカンちがいというか、見誤りでした.申し訳ないです。
(2)も… そうでした。お恥ずかしい!

さて本題ですが、for ループを使うと値がうまく取れない件。

$body .= $option[$cunt] = '<OPTION>'.$arychimei[$cunt];

の式なんですが、「=」が ふたつ入ってしまっていますねー。
ここは

$body .= $option[$cunt]."<OPTION>".$arychimei[$cunt]."</OPTION>"

と変更すれば、うまく行くのではないかな。
あと、#2 さんもおっしゃっていたけど、

$body .= "<INPUT type = 'hidden' name = 'chimei' value = '$chimei'>";

は名前を変更するか、これ自体を削除する必要があるでしょうね。
もし追加でご質問あれば、どうぞ。

この回答への補足

早速のレス有り難う御座います。
下記の記述の件ですが、「$body .=」は、イコールではなく、$bodyの変数に、HTMLのタグの文字列を加えて、PHPでのHTMLを表示するためのテクニックなのです。
$body .="<html>
<br><br>
<p><HR></html>";
このような使い方をします。PHPで簡単にHTMLの表示ができます。
この記述の最後で、「print $body;」でHTMLを表示させます。
ですから、これは、全く問題ありません。

$body .= $option[$cunt] = '<OPTION>'.$arychimei[$cunt];
print $body;

それと、name = ’chime’は、同名で無ければ次に変数を渡すことが出来ません。変数名を変更すれば、どの変数の中身を渡せばいいか、プログラムでは判断出来ないと思います。勿論受け取る側は同名でなくても良いでしょうけど。今送りタイのは、「'chimei'」なのです。
それと、ダイレクトにOPTIONを指定すると何も問題が全くないのです。この同じ記述方法でダイレクトにOPTIONを指定している部分だけ旨く変数渡しが行われています。それで、FOR文を使った部分にのみ何か問題が有るのかを教えて戴きたいと思っております。
お世話掛けますが宜しく御願い致します。

補足日時:2007/03/19 22:37
    • good
    • 0

selectとhiddenに同じchimeiという名前をつけているので


競合していますね。
そもそもhiddenで得る必要がないと思いますが・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!