dポイントプレゼントキャンペーン実施中!

POSTしたデータがリストボックスに反映されません。
ホームページ制作初心者です。
同一ファイル内で、リストボックスから値を選択し、その値に従って別のリストボックスの内容を絞り込みたいと思っています。
POSTは正常に行われていますが、データを受けた後、リストボックスが空欄のままです。
根本的にやろうとしている方法が間違っているのだと思います。

丁度、Okwaveのカテゴリ選択の様な、階層で絞り込んでいくようなものを作りたいです。

良い方法ありましたらご教授願います。
よろしくお願いいたします。



<FORM action="" method="post">
<?php
$db = new PDO("mysql:host=localhost;dbname=DBNAME", "ROOT", "PASS");
$db->query("SET NAMES 'utf8'");
//品番
$rs = $db->query("SELECT * FROM m20mm");
?>

<h4>品番指定</h4>
<select name="hinban" size="5" multiple="multiple" onchange="submit(this.form)" size="18">
<?php
foreach($rs as $name1=>$hinban){
echo "<option value={$hinban[0]} selected>{$hinban[1]}</option>";
}
?>
</select>
</FORM>

//ここから正常に動作していないと思われる。

<FORM>
<?php
$db2 = new PDO("mysql:host=localhost;dbname=DBNAME", "ROOT", "PASS");
$db2->query("SET NAMES 'utf8'");
//品目
$sql =<<<HINMOKU
SELECT *
FROM dfw_m40m
WHERE dfw_m40m.分類C3 = :hinban
HINMOKU;

$hinban = $_POST['hinban'];
$bs2 = $db2->prepare($sql);
$bs2->bindparam(":hinban",$hinban);
$bs2->execute();
$bs2->setFetchMode(PDO::FETCH_OBJ);
?>

<h4>品目指定</h4>
<select name="hinmoku" size="5" multiple="multiple" size="18">
<?php
foreach($bs2 as $name1=>$hinmoku){
echo "<option value={$hinmoku[0]}>{$hinmoku[2]}</option>";
}
?>
</select>
<br>
<br>
</FORM>

A 回答 (7件)

一回コレでやってみてください


$hinban = $_POST['hinban'];
$bs2 = $db2->prepare($sql);
$bs2->bindparam(":hinban",$hinban);
$bs2->execute();
?>

<h4>品目指定</h4>
<select name="hinmoku" size="5">
<?php
while($hinmoku = $bs2->fetch(PDO::FETCH_BOTH)){
echo "<option value={$hinmoku[0]}>{$hinmoku[2]}</option>";
}
?>
</select>

hinbanの方のselectもmultipleは不要と思います。
また、
echo "<option value={$hinban[0]} selected>{$hinban[1]}</option>";
これですとPOST後はすべて選択状態になると思います。
POSTされたhinbanとvalueが同じものだけselectedをつけるようにしないとまずいと思います。

他、気がついていない点もあるかもしれませんがキリがないので処理の順に一個一個片付けていってください。私は処理がこんがらがってきたら一回全部コメントアウトして処理する順番にコメントアウトをはずしてどこまで処理が正確に動いているか一個一個確かめてます。時間がかかるように思えますがあてずっぽうにやるよりは遥かに早いし確実です。
    • good
    • 0
この回答へのお礼

いまも分からないままですが・・・・・
ajaxで解決しました。ありがとうございました。

お礼日時:2010/10/08 08:55

適当だから、抜けがあったら適当に修正して。



JavaScript なんて使いたい人が使えばいい。使いたければ後からでもどうにでもなる。

あ~それから、、、眠いから寝る。
    • good
    • 0
この回答へのお礼

書いて頂いたコードがわかりませんでしたので、JavaScriptでやっと解決して、覚えられました。
ありがとうございました。

お礼日時:2010/10/08 08:53

[code language="JavaScript" title="get_articles.js"]


/*@cc_on@*/
var get_articles = (function(req) {
return req ? (function () {
var Handlers = {
'readystatechange' : function (e) {
if (4 != req.readyState) return;
clearTimeout(timerId);
if (200 != req.status) return;

// あと自分で書いて。
// TODO : req.responseXML ...
},

'timeout' : function () {
req.abort();
clearTimeout (timerId);
},

'unload' : function (e) {
Unobserver.call (self, 'unload');
req.onreadystatechange = function() { ; };
doc = req = null;
}
};

var Listener = function (e) {
return Handlers.call [e.type] (this, e);
};

var Observer = function (e, type) {
return e./*@if(1)attachEvent('on'+/*@else@*/addEventListener(type, Listener, false);
};

var Unobserver = function (e, type) {
return e./*@if(1)dettachEvent('on'+/*@else@*/removeEventListener(type, Listener, false);
}

reutrn (function () {
req.onreadystatechange = Handlers ['readystatechange'];

return function () {
try {
var form = this.form;
var value = this.value;
var uri = form.action+'?'+encodeURIComponent(this.name)+'='+encodeURIComponent(value);

timerId = setTimeout (Handlers ['timeout'], timeout);

req.abort();
req.open('GET', uri, true);
req.send('');
} catch (e) {
}
};

}) ();
}) () : function () { ; };
}) (
(function (){
/*@if (5 < @_jscript_version)
try {
return new ActiveXObject('Msxml2.XMLHTTP.6.0');
} catch (e2) {
try {
return new XMLHttpRequest;
} catch (e3) {
return new ActiveXObject('Msxml2.XMLHTTP.3.0');
}
}
@else@*/
return new XMLHttpRequest;
/*@end@*/
}) ();
);
[/code]
    • good
    • 0

[code language="PHP" title="get_articles.php"]


<?php
try {
//sanitize($_GET);

$db = new PDO('mysql:host=localhost;dbname=DBNAME', 'USER', 'PASS');
$db->exec("SET NAME 'utf8'");
$bs = $db->prepare('SELECT * FROM `dfw_m40m` WHERE `分類C3`=?');

$hinban = $bs->execute(array($_GET['hinban']));
unset($rs, $db);

if (preg_match('/(?:^|,\s*)(text|application)\/xml(?:\s*,|$)/', $_SERVER['HTTP_ACCEPT']), $m) {
$doc = DOMImplementation::createDocument('***', 'articles');

$root = $doc->documentElement;
if (is_array($hinban)) {
foreach ($hinban as $value) {
$item = $doc->createElemnet('item', $value[1]);
$item->setAttribute('id', $value[0]);
$root->appendChild($root);
}
}

$xml = $doc->saveXML();

header('Content-Type: {$m[0]}; charset=UTF-8');
header('Content-Length: '.strlen($xml));
echo $xml;
exit;
}
} catch (PDOException $e) {
echo $e->getMessage();
}
?>

<? header('Content-Type: text/html; charset=UTF-8'); ?>
<!DOCTYPE ...
...
<form action="****" method="****">
<h4>品番指定</h4>
<p>
<? if (is_array($hinmoku)) : ?>
<select name="hinmoku" size="5">
<? foreach ($hinmoku as $value) : ?>
<option value="<?=htmlentities($value[0])?>"<?=key(current($hinmoku)) ? '' : 'selected="selected"'?>><?=htmlentities($value[1])?></option>
<? endforeach; ?>
</select>
<? endif; ?>
</p>
</from>
[/code]
    • good
    • 0

<?php


try {
$db = new PDO('mysql:host=localhost;dbname=DBNAME', 'ROOT', 'PASS');
$db->exec("SET NAME 'utf8'");
$rs = $db->query('SELECT * FROM `m20mm`');

$hinban = $rs->fetchAll(PDO::FETCH_NUM);
unset($rs, $db);
} catch (PDOException $e) {
}
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE ...
...
<form action="get_articles.php" method="get">
<script type="text/javascript" src="get_articles.js"></script>
<h4>品番指定</h4>
<p>
<? if (is_array($hinban)) : ?>
<select name="hinban" size="5" onchange="get_articles.call (this);">
<? foreach ($hinban as $value) : ?>
<option value="<?=htmlentities($value[0])?>"<?= key(current($hinban)) ? '' : 'selected="selected"'?>><?=htmlentities($value[1])?></option>
<? endforeach; ?>
</select>
<? endif; ?>
</p>
</from>
<? endif; ?>
    • good
    • 0

> 丁度、Okwaveのカテゴリ選択の様な、階層で絞り込んでいくようなものを作りたいです。


階層ごとにリンクを張っておけばいい。

それだけでもまず不便は感じない。

> onchange="submit(this.form)"で、POSTするときにブラウザで更新が掛かるのですが、
それでSQLが機能していないように感じます。
このやり方は不可能なのでは。。。。。。という気がします。。泣

うすうす気づいてるかもしれないけど、やり方が根本的に間違っている。
とりあえず、PHP だけで組んではいかがだろうか。

# どうでもいいことだけど、POST と GET が保存先の違いくらいにしか認識されていないのが悲しい。
    • good
    • 0

$bs2にはカラムの順に0から始まる添え字で配列が設定されているでしょうか?


$ba2を出力して調べてみてください。

PDOは使ったことがないので確証はないですが
$bs2->setFetchMode(PDO::FETCH_OBJ);を削除すれば
$rsと同様に0,1,2・・・で値が設定されるかもしれません。
PDO::executeではfetchでしか値が取れない(PDO::queryと違う)
のであればfetch処理して<option>を出力するようにしてみてください。

予想大外れだったらごめんなさい。
    • good
    • 0
この回答へのお礼

配列を取得しようとしましたが、$bs2の配列とれませんでした。
WHERE句を外し、$db2->prepare($sql)を$db2->query($sql)に変更すれば取得できます。
(あたりまえですが。。。)
onchange="submit(this.form)"で、POSTするときにブラウザで更新が掛かるのですが、
それでSQLが機能していないように感じます。
このやり方は不可能なのでは。。。。。。という気がします。。泣

何か良い方法ありますでしょうか?
全く違うようなプログラムでもかまいません。(ただしデータベースは使います)
助けてください・・・お願いいたします。

お礼日時:2010/08/27 16:25

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