3

私はPHPとコーディング全般にかなり慣れていません。

一連の条件が設定されているかどうかをテストする必要があります。$option1、$option2、$option3 です。

if (isset($option1)){
    if (isset($option2)){
        if (isset($option3)){
            $query = "SELECT *
                               FROM Group
                               WHERE FirstOption = '$option1' AND SecondOption = '$option2' AND ThirdOption = '$option3'";
        }
        else {
            $query = "SELECT *
                               FROM Group
                               WHERE FirstOption = '$option1' AND SecondOption = '$option2";
        }
    }
    else {
        $query = "SELECT *
                           FROM Group
                           WHERE FirstOption = '$option1' AND ThirdOption = '$option3";
    }
}
else {
    // .. snip, much more duplicated code ..
}

したがって、ここでの問題は、条件が設定されているかどうかに基づいて、mysql に対して一意のクエリが必要なことです。しかし、それらはお互いに大きな関係にあり、実際には 7 ロットのオプションがあるため、分岐は絶対に大規模です! 混乱しそうになった後、3でやめました。

これを書くにはもっと優れた方法があるに違いありません - 誰か私がよりよく理解するのを手伝ってくれませんか?

4

5 に答える 5

4

動的な SQL 構築は必要ありません。ロジックを使用するだけです。

SELECT *
  FROM Group
 WHERE (FirstOption = '$option1' or '$option1' = '') 
   AND (SecondOption = '$option2' or '$option2' = '')
   AND (ThirdOption = '$option3' or '$option3' = '')

理想的には、プレースホルダーと準備されたステートメントを使用しますが、上記は説明目的で最も明確です。

誰かが興味を持っている場合 - これには大きなクエリ オーバーヘッドはありません。最新のデータベース エンジンは、'$option1' = ''式を定数値に最適化し、一度だけブール値に評価します。

于 2013-01-16T05:09:09.973 に答える
3

私の通常の方法:

$cond=array();
$bind=array();
if(isset($option1))
{
    $cond[]="FirstOption=?";
    $bind[]=$option1;
}
if(isset($option2))
{
    $cond[]="SecondOption=?";
    $bind[]=$option2;
}
if(isset($option3))
{
    $cond[]="ThirdOption=?";
    $bind[]=$option3;
}
$sql="SELECT * FROM `group`";
if(count($cond)>0) $sql.=" WHERE ".implode(" AND ",$cond);
$stmt=$mysqli->prepare($sql);
if(count($bind)>0)
{
    foreach($bind as $idx=>$val)
    {
        $stmt->bind_param("s",$bind[$idx]);
    }
}
于 2013-01-16T05:03:34.447 に答える
3
$baseSQL = "SELECT * FROM Group";

if(isset($option1)){
    sprintf("%s world. Day number %u",$str,$number);
    $whereSQL[] = sprintf("FirstOption = '%s'",mysqli_real_escape_string($mysqli,$option1));
}
if(isset($option2)){
    $whereSQL[] = sprintf("SecondOption = '%s'",mysqli_real_escape_string($mysqli,$option2));
}
if(isset($option3)){
    $whereSQL[] = sprintf("ThirdOption = '%s'",mysqli_real_escape_string($mysqli,$option3));
}

if(isset($whereSQL)){
    $query = $baseSQL ." WHERE " . implode(" AND ",$whereSQL);
}
于 2013-01-16T05:01:50.707 に答える
1

これを試して

$sql = "Select * from Group where 1=1 ";
$whr = "";

if(isset($option1)){
$whr .= " and FirstOption = $option1";
}
if(isset($option2)){
$whr .= " and SecondOption = $option2";
}
if(isset($option3)){
$whr .= " and ThirdOption = $option3";
}
// nth element ...

if(isset($optionN)){
$whr .= " and nTHOption = $optionN";
}

$sql .= $whr;

このようにして、where 条件のクエリに任意の数のオプションを追加できます。

于 2013-01-16T05:15:44.817 に答える
0
if(isset($option1)||isset($option2)||isset($option3)){
$sqlToAdd = (isset($option1)?" FirstOption=$option1":"");
$sqlToAdd .= ($sqlToAdd==""?"":" AND ").(isset($option2)?" SecondOption=$option2":"");
$sqlToAdd .= ($sqlToAdd==""?"":" AND ").(isset($option3)?" ThirdOption=$option3":"");
$sql = "SELECT *
                               FROM Group
                               WHERE $sqlToAdd";
}
于 2013-01-16T04:58:36.677 に答える