スレッド表示 | フラット表示〕 全トピック 920 件中 147 番目 次≫ ≪前

また、躓いてしまいました

created: 2007-01-27 12:40 | modified: 2007-01-29 00:49 | reply: 12

[3547] また、躓いてしまいました

user: どりっぷ | created: 2007-01-27 12:40
また書き込みさせていただきます。
DBからコンボボックスのアイテムをselectし、
コンボボックスを作成しております。

コンボボックスのアイテムは正常に取得できておるの
ですが、value値が正常に取得できなくて困っています。

コードは下記のようになります。

$shubetsu = $_POST['shubetsu'];


/* コンボボックス初期値設定定義・・・開始 */
$idx = (integer)$_POST['shubetsu'];
$checked = array($idx => 'selected="selected"');
/* コンボボックス初期値設定定義・・・終了 */
$shubetsu_count = 1;
/* コンボボックスの設定・・・開始 */
print('<select name="shubetsu" style="position:absolute;top:60px;left:600px;">');
while ($row = mysql_fetch_array($result)) {
print('<option value="'.$row[CODE_NO] .'" '. $checked[$shubetsu_count]. '>'.$row[CODE_NAME_RYAKU] );
$shubetsu_count = $shubetsu_count + 1;
}
print('</select>');
/* コンボボックスの設定・・・終了 */




ここで、value値に設定している項目が正常に取得
できず、なにを選択しても空白になってしまいます。
原因がさっぱり検討つきません。
よろしければご教授いただけないでしょうか。
reply: 3548 返信 編集 削除

[3548] var_dump でデバッグ

user: ゆうじ | created: 2007-01-27 17:22
受け取る側のスクリプトの冒頭で
var_dump($_REQUEST); として、
フォームで送信された値が想定してたものか確認してください。

正しく得られていれば、受け取る側のスクリプト側が原因で
得られてなければ、送信フォームに原因があると思います。

いずれにしてもブラウザの表示ではなく
ページのHTMLソースを見て原因を探してください。
Parent: 3547  reply: 3549 返信 編集 削除

[3549] 項目名がでてきませんでした

user: どりっぷ | created: 2007-01-27 18:34
お返事ありがとうございます。
教えていただいた方法で試したところ、項目名が
表示されませんでした・・・。

これはコンボボックス自体は表示されているけども、送信されていないということですか。
いまコンボボックスにつけてある名前等確認したのですが、
可笑しいところはありませんでした。
Parent: 3548  reply: 3550 返信 編集 削除

[3550] Re.項目名がでてきませんでした

user: ゆうじ | created: 2007-01-27 18:46
値が得られないのなら、原因はフォーム側です。

ブラウザの表示ではなく、
表示されたページのHTMLソースを見れば、
フォームがHTMLとして正しいか判断できるでしょう。

フォームが正しければ何かしらの値は得られます。
Parent: 3549  reply: 3551 返信 編集 削除

[3551] FORMが原因でした。

user: どりっぷ | created: 2007-01-27 21:52
原因がわかりました。
PHPにてコンボボックスを作成する際に、
<form>

</form>
の外にあったことが原因でした。

var_dump という機能は初めてしりました。
大変参考になったのでこれからも利用させていただきます。
ゆうじさん、ありがとうございました。

別件で質問させてもらってもよろしいでしょうか。
select文で結果が1件しかこないことがあらかじめ分かっている場合でも、
while ($row = mysql_fetch_array($result)) {


にて処理を回す必要があるのでしょうか?
私の認識では、上記のコードは結果が2件以上ある場合に、
while文にて回して結果を使用するというものであり、
したがってあらかじめ1件しか帰ってこないとわかっている場合は、
while文にて回さなくてもよいかと思います。

どうなのでしょうか?
Parent: 3550  reply: 3554 返信 編集 削除

[3554] ループの必要

user: ゆうじ | created: 2007-01-27 22:49
レコードが1件しかないとわかってるとか
1件目だけ取り出せば良いのなら
ループを回す必然性はありませんね。

将来レコードが増え可能性があるとか、
設計次第ってところですね。
Parent: 3551  reply: 3555 返信 編集 削除

[3555] また元に・・・

user: どりっぷ | created: 2007-01-28 04:36
やはり、ループをさせる必要性はなかったのですね。
色々なサイトを見て回ったのですが、どのサンプルも
ループを使用しており、必要性があるのかなと思っていました。

何度もお尋ねして大変もうしわけないのですが、
コンボボックスの初期位置がまた記憶されなくなって
しまいました_/ ̄|○



if(!$result=mysql_query("SELECT * FROM CODE WHERE SHUBETSU_NO = '01' AND CODE_NO <> '00' ORDER BY CODE_NO")){
print "失敗 コード1=".mysql_errno()."<BR>";
print "失敗 順序1=".$order."<BR>";
exit;
}
/* 取得したレコードを全て書き出し */

/* コンボボックス初期値設定定義・・・開始 */
$idx = (integer)$_POST['SHUBETSU'];
$checked = array($idx => 'selected="selected"');
/* コンボボックス初期値設定定義・・・終了 */
$shubetsu_count = 0;
/* コンボボックスの設定・・・開始 */
print('<select name="SHUBETSU" style="position:absolute;top:70px;left:550px;">');
//print('<option value="00" '. $checked[0]. '>全体');
while ($row = mysql_fetch_array($result)) {
print('<option value="'.$row[CODE_NAME_RYAKU] .'" '. $checked[$shubetsu_count]. '>'.$row[CODE_NAME_RYAKU] );
$shubetsu_count = $shubetsu_count + 1;
}
print('</select>');
/* コンボボックスの設定・・・終了 */

調べていくと、select文が
"SELECT * FROM CODE WHERE SHUBETSU_NO = '01' AND CODE_NO <> '00' ORDER BY CODE_NO"(抽出結果9個)
だとできないのですが、
"SELECT * FROM CODE WHERE CODE_NO = '00'"(抽出結果2個)
だとできます。
違いがここしかみつけられないのですが、何度も見直しても、他に悪いところが見つけることができません。
抽出結果の個数によってできる、できないとかあるのでしょうか。
それと、コンボボックスアイテムのvalue値なのですが、
ここに設定しようとしている[CODE_NAME_RYAKU]は
ローマ字名が入るようにしてあります。
ここは数値でなければならないということはあるのでしょうか?
Parent: 3554  reply: 3556 返信 編集 削除

[3556] Re. また元に・・・

user: ゆうじ | created: 2007-01-28 15:17
$shubetsu_count は 0 から始まり
レコードが1つ増えるごとに1つカウントアップしてますね。
これに対し $row[CODE_NAME_RYAKU] は
そのレコードを唯一特定する為のキーだと思いますので
どのような場合も連番で獲得されるとは限りませんよね。

これが矛盾を生む要因になりますので、
抽出結果の個数によって挙動が違うのはこのためだと思います。

$shubetsu_count の代わりに、
獲得したレコードのキーを使うといいと思います。

print('<option value="'.$row[CODE_NAME_RYAKU] .'" '. $checked[$row[CODE_NAME_RYAKU]]'>'.$row[CODE_NAME_RYAKU] );
Parent: 3555  reply: 3557 返信 編集 削除

[3557] コンボボックスの最上段のアイテムが表示されてしまいます

user: どりっぷ | created: 2007-01-28 16:23
お返事ありがとうございます。


お返事いただいたとおりにやってみたのですが、
submitをすると、一番上の項目が選択されている状態に
もどってしまいます。
私の認識では、 $checkedは配列であり、引数には
数値を使うのが一般的だと思っていたのですが、
PHPでは違うのでしょうか?
何度もお聞きしてしまい、申し訳ありません_/ ̄|○

ちなみに$row[CODE_NAME_RYAKU]には
apple
tea
というような品目名が格納されています。
Parent: 3556  reply: 3558 返信 編集 削除

[3558] このプログラムの仕様?

user: ゆうじ | created: 2007-01-28 17:37
selectタグの name="SHUBETSU と
$_POST['SHUBETSU'] は同じ値を示してると思っていましたが
$row[CODE_NAME_RYAKU] が数字でないとすると違うってことですね。
このプログラムの仕様がすっかりわからなくなってしまいました。

私ならこうした値は全てレコードのプライマリーキーに統一して、
name="" の値もテーブルのフィールド名にします。

カラーテーブル color
colorId : 数値、プライマリーキー
colorName : 文字列
 
colorId | colorName
---------+-----------
1 | white
---------+-----------
2 | black
---------+-----------
3 | red

 
<?php
:
$color_selected = array($_POST['colorId'] => ' selected="selected"');
:
?>
<select name="colorId">
<?php while ($row = mysql_fetch_assoc($result)) { ?>
<option value="<?php echo $row['colorId'] ?>"<?php echo $color_selected[$row['colorId']] ?>><?php echo $row['colorName'] ?></option>
<?php } ?>
</select>



尚、配列の添え字は正の整数でも文字列でもかまいません。
どうぞマニュアルをご覧下さい。
http://jp.php.net/manual/ja/language.types.array.php
Parent: 3557  reply: 3559 返信 編集 削除

[3559] お手数をおかけします

user: どりっぷ | created: 2007-01-28 18:20
ゆうじさん、大変もうしわけありません。
SELECT文で発光された結果の、
$row[CODE_NAME_RYAKU]
は、ローマ字の文字列です。(例:apple,tea,bread等・・)
で、やりたいことは、SELECTされてきた$row[CODE_NAME_RYAKU]をアイテムとしてコンボボックスを作成し、
さらにSUBMITが発生した場合でも、直前に選択されている
アイテムを表示させたまま再表示させたいのです。

コンボボックスを作成する処理の後に、このコンボボックスで
選択された名前をDBに登録する処理があるため、
value値も$row[CODE_NAME_RYAKU]を設定するように
なっております。

従って、配列作成の、

/* コンボボックス初期値設定定義・・・開始 */
$idx = (integer)$_POST['shubetsu'];
$checked = array($idx => 'selected="selected"');
/* コンボボックス初期値設定定義・・・終了 */

のkeyとなる$idxに、appleとかの文字列が入ることになります。
また、
$_POST['SHUBETSU'] とselectタグの name="SHUBETSU には
同じ値がはいります。(apple,tea等)
ただ、数値ではありません。
ここは数値ではないとまずいのでしょうか?
$_POST['SHUBETSU'] はkeyとなる$idxに格納されることに
なりますが、マニュアルではkeyは文字列か非負の整数
であれば大丈夫との記述があったのですが、
どうなのでしょうか。

何度お手数をおかけして大変申し訳ありません。
Parent: 3558  reply: 3560 返信 編集 削除

[3560] 型キャストがいりません

user: ゆうじ | created: 2007-01-28 22:05
そういうことでしたか。
$_POST['SHUBETSU'] や selectタグの name="" が
数値でなければならないわけではありません。
レコードを一意に特定できる値ならどちらでもかまいません。

さて、少し仕様がわかったところで先のコードを訂正しまと、
$_POST['SHUBETSU'] の型キャストを削除しなくてはね。
それでループの中の $checked の添え字を
$row[CODE_NAME_RYAKU] にすれば思うようになりませんか。

/* コンボボックス初期値設定定義・・・開始 */
$idx = $_POST['SHUBETSU'];
$checked = array($idx => 'selected="selected"');

/* コンボボックスの設定・・・開始 */
print('<select name="SHUBETSU" style="position:absolute;top:70px;left:550px;">');
//print('<option value="00" '. $checked[0]. '>全体');
while ($row = mysql_fetch_array($result)) {
print('<option value="'.$row[CODE_NAME_RYAKU] .'" '. $checked[$row[CODE_NAME_RYAKU]]. '>'.$row[CODE_NAME_RYAKU] );
$shubetsu_count = $shubetsu_count + 1;
}
print('</select>');
Parent: 3559  reply: 3561 返信 編集 削除

[3561] できましたー

user: どりっぷ | created: 2007-01-29 00:49
なるほど、ここで型を定義していたのですね。
全然こちらに目がいっていませんでした。

思ったとおりにうまくいくようになりました。
ゆうじさん、何時間も付き合っていただいて、本当にありがとうございました。
Parent: 3560  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 147 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑