プロが教える店舗&オフィスのセキュリティ対策術

$_REQUEST['getA']、$_REQUEST['getB']、$_REQUEST['getC'] ・・・ とあり、
これらをMYSQLのSQL文に効率的に組み込んでいきたいです。
mysqlのデータと$_REQUESTのキー名と対応させた$lllを
foreachでそれぞれをswitchで処理を分けて、
$qqqのSQL文に組み込んでいるつもりです。
よろしくお願いします。

$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"
);

foreach($lll as $key=>$val){
if(!isset($_REQUEST[$key]) or $_REQUEST[$key]==='') continue;
switch($key){
case "getA":
$ga = explode("+", $_REQUEST[$key]);
$val_A = $val;
break;
case "getB":
$gb = $_REQUEST[$key];
$val_B = $val;
break;
case "getC":
$gc = $_REQUEST[$key];
$val_C = $val;
break;
case "getD":
$gd = $_REQUEST[$key];
$val_D = $val;
break;

他のcaseが続く

}
}

$qqq =<<<__SSS__
SELECT * FROM table WHERE 1
AND ga0 <= val_A AND val_A < ga1
AND `colum_B` BETWEEN CURDATE() - INTERVAL gb YEAR AND CURDATE() - INTERVAL 1 DAY
AND gc <= val_C
AND gd <= val_D
AND val_E IN(ge)
ORDER BY field deskORasc LIMIT L1,L2;
__SSS__;

$sss = $ddd->prepare($qqq);
$sss->execute(array(
':ga0'=>$ga[0], ':ga1'=>$ga[1], ':val_A'=>$val_A,
':gb'=>$gb, ':val_B'=>$val_B,
':gc'=>$gc, ':val_C'=>$val_C,
':gd'=>$gd, ':val_D'=>$val_D,
':ge'=>$ge, ':val_E'=>$val_E,
~いろいろなものが続く~
':field'=>$field, ':deskORasc'=>$deskORasc, ':L1'=>0, ':L2'=>50
));
$rrr = $sss->fetchAll(PDO::FETCH_ASSOC);

A 回答 (1件)

質問は何でしょうか?



ざっと見たところでは、

(1)
$_RESUEST[$key]が空文字列だったら処理をスキップしているのにそれを考慮してステートメントを組み立てていない
(2)
プレースホルダの記述がおかしい(プレースホルダになっていない)。

という点が気にはなりますが、いずれにしても$qqqやそれに引き渡す値をprintしてみればわかることだとは思います(それがデバッグですから)。
    • good
    • 0
この回答へのお礼

$_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);

お礼日時:2012/12/12 10:14

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