mysql_fetch_arrayを何度も使いたい
phpとmysqlを使っています。
配列$valuesがあります。
その値は一部だけmysqlのフィールドdの中に格納しています。
両方の値を比較してもし一致すればチェックボックスを作るという処理をしています。
また、同時に一致した数もそれぞれ取得したいと考えています。
イメージ的には、□はチェックボックスとして()には、その配列の値とフィールドdの値に一致する数が入ります。
□(33) □(13) □(1) □(22) □(3)
□(16) □(15) □(9) □(23) □(32)
□(4) □(16) □(7) □(6) □(11)
□(5) □(21) □(1) □(4) □(15)
□(13) □(10) □(3) □(19) □(8)
□(0)のとき非表示になるようにしています。
<?php
$m = mysql_connect('localhost','root',password);
$mm = "SELECT * FROM tableA";
mysql_set_charset('utf8');
$mmm = mysql_query($mm,$m);
$values=array(
"chk1"=>array("a1","a2","a3","a4","a5","a6","a7","a8","a9","a10")
,"chk2"=>array("b1","b2","b3","b4","b5","b6","b7","b8","b9","b10")
,"chk3"=>array("c1","c2","c3","c4","c5","c6","c7","c8","c9","c10")
);
foreach($values as $key=>$array){
foreach($array as $val){
$checked=(isset($_REQUEST[$key]) and in_array($val,$_REQUEST[$key]))?" checked":"";
$count = "";
while($r = mysql_fetch_array($mmm)){
if($val === $r['d']){$count++:}
}
if($count>0 && !$count==""){
$h = $h.htmlspecialchars($val, ENT_QUOTES, 'UTF-8').'<input type="checkbox" name="'.$key.'[]" value="'.$val.'"'.$checked.'/>('.$count.') '."\n";
}
}
}
print "<br />\n";
}
?>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form method="get" action="checkbox2.php">
<?php echo $h; ?>
<input type="submit" value="送信" />
</form>
</body>
</html>
これではmysql_fetch_arrayが一度しか使えないので、配列の値a2以降が進みません。
こういうときはどのようにするべきでしょうか。
また、if($val === $r['d']){$count++:}でカウントしていますが、もっといい方法はありますか。
その他変な箇所があれば指摘して頂けると嬉しいです。
お願いします。
お礼
$_REQUEST[$key]があるだけ、それに合わせた処理をさせて、 必要なだけSQL文を組み立てていきたいです。 指摘してもらった(1)と(2)はこちらでオッケーですか? $lll = array( "getA"=>"mysql_colum_name_A", "getB"=>"mysql_colum_name_B", "getC"=>"mysql_colum_name_C", "getD"=>"mysql_colum_name_D", "getE"=>"mysql_colum_name_E" ); $yyy = 'SELECT * FROM table WHERE 1'; foreach($lll as $key=>$val){ if(!isset($_REQUEST[$key]) or $_REQUEST[$key]==='') {$_REQUEST[$key]="";} switch($key){ case "getA": $ga = explode("+", $_REQUEST[$key]); $yyy .= ' AND {$r[0]} <= {$val} AND {$val} < {$r[1]}'; break; case "getB": $yyy .= 'AND {$val} BETWEEN CURDATE() - INTERVAL {$_REQUEST[$key]} YEAR AND CURDATE() - INTERVAL 1 DAY'; break; case "getC": case "getD": case "getE": $yyy .= ' AND {$_REQUEST[$key]} <= {$val}'; break; ~ 他のcaseが続く ~ } } $ddd = new PDO($host,$user,$pass); $sss = $ddd->prepare($qqq); $rrr = $sss->fetchAll(PDO::FETCH_ASSOC);