※ ChatGPTを利用し、要約された質問です(原文:いろいろな処理をさせてSQL文を効率的に作りたい)
SQL文での効率的な処理方法とは?
このQ&Aのポイント
PHPでSQL文を効率的に作成する方法についての質問です。質問者は、複数の$_REQUESTの値をMYSQLのSQL文に組み込んで処理したいと考えています。具体的には、$lllという配列に$_REQUESTのキーとMYSQLのカラム名を対応させて、foreachとswitch文で処理を分けながら$qqqというSQL文に組み込んでいます。また、キーごとに処理を分けるための条件分岐も記述しています。
質問者のコードでは、$_REQUESTの各値をキーごとに$lllと対応させて、処理を分けながら$qqqのSQL文に組み込んでいます。具体的には、GETパラメータ「getA」の場合は配列に分割し、getBの場合はそのまま、getCの場合はそのままの値を使用しています。また、WHERE句の条件もキーごとに分岐して記述しています。
以上の処理で、質問者は$_REQUESTの値を効率的にMYSQLのSQL文に組み込めていると考えています。なお、$qqqのSQL文では、指定された条件でテーブルのデータを取得し、指定の並び順で結果を返すようになっています。また、取得するデータの数にも制限をかけています。
$_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);
お礼
$_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);