5

次のような変数でlatの変換基準を使用して、6つの基準を持つhtmlフォームを使用し$_POSTます。

ケース1-すべての基準がデフォルトです
$core = null; $mhz = null; $ram = null; $cam = null; $mAh = null $screen = null
正しいSQLクエリは次のとおりです:
$sql = "SELECT * FROM $tbl_name ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";

ケース2-基準が1つだけ設定され
$core = null; $mhz = "performanta_cpu=1400"; $ram = null; $cam = null; $mAh = null $screen = null
ているコアクトクエリは次のとおりです。
$sql = "SELECT * FROM $tbl_name WHERE $mhzz ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";

ケース3-ここに問題がありますすべてまたは複数の基準が設定されています:
$core = 2; $mhz = "performanta_cpu=1400"; $ram = "performanta_rami=1024"; $cam = "camera_spate=3.2"; $mAh = "baterie_mAh=2250"; $screen = "densitate=441";

私はWHERE、変数が設定されたときに「」を動的で表示できるようにする必要があることを理解しています。また、「AND」も動的に次のようにする必要があります。

$sql = "SELECT * FROM $tbl_name WHERE $core AND $mhzz ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";
私はこれで一週間ストレスを感じています、そして私は助けなしでは前進することができません...

前もって感謝します

4

5 に答える 5

2

免責事項:これはひどいコードであり、これを行うためのより良い方法は無数にありますが、これは最も簡単な説明です。

$parameters = array();
if(!empty($core)){
$parameters['core'] = $core;
}
if(!empty($mhz)){
$parameters['mhz'] = $mhz;
}
if(!empty($ram)){
$parameters['ram'] = $ram;
}
if(!empty($cam)){
$parameters['cam'] = $cam;
}
if(!empty($mAh)){
$parameters['mAh'] = $mAh;
}
if(!empty($screen)){
$parameters['screen'] = $screen;
}

$sql = "SELECT * FROM $tbl_name WHERE 1=1 ";
foreach($parameters as $k=>$v){
 $sql .= " AND ".$k."='".$v."'";
}
$sql .=  " ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";

// All of those parameters should be sanitized to prevent SQL injection.
// mysql_* is deprecated, use mysqli_* or PDO.
于 2013-03-08T22:32:41.210 に答える
2

見事にフォーマットされた質問..よくやった。

質問を誤解しているかもしれませんが、クエリを動的に作成する方法を質問していると思います。おそらく、文字列を連結していることに気づいていませんか?

例えば。

if ($core != null) {$query.= 'AND core ='.$core;}

これがあなたを正しい方向に導いてくれることを願っています。

于 2013-03-08T22:33:31.080 に答える
2
$parameters = array();
if(!empty($core)){
    $parameters[] = "core = '$core'";
}
if(!empty($mhz)){
    $parameters[] = "mhz = '$mhz'";
}
if(!empty($ram)){
    $parameters[] = "ran = '$ram'";
}
if(!empty($cam)){
    $parameters[] = "cam = '$cam'";
}
if(!empty($mAh)){
    $parameters[] = "mAh = '$mAh'";
}
if(!empty($screen)){
    $parameters[] = "screen = $screen";
}

if (empty($parameters)) {
   $whereclause = "";
} else {
   $whereclause = "WHERE " . join(' AND ', $parameters);
}

$sql = "SELECT * FROM $tbl_name $whereclause ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";
于 2013-03-08T22:42:34.467 に答える
2

クエリの最初から開始し、コマンドの作成を容易にするために、「常に真」の WHERE 条件を追加します。

$sql = "SELECT * FROM $tbl_name WHERE 1=1";

次に、変数を調べて、必要に応じて WHERE 条件に追加します (AND の前のスペースは非常に重要です)。

if ($core) $sql .= " AND performanta_cpu_core = '$core'";
if ($mhz) $sql .= " AND whatever = '$mhz'";
... and so on for the other four variables

次に、ORDER BY と LIMIT を追加して完了です (ORDER BY の前のスペースは非常に重要です)。

$sql .= " ORDER BY performanta_cpu_core DESC, performanta_cpu DESC, performanta_rami DESC LIMIT $start, $limit";

また、Mahmut が指摘したように、 を持つことはできませWHERE $mhzWHERE your-column-name = $mhz

まず、MySQL コマンド ラインまたは WorkBench からクエリを試してみてください。これは、どの列を一重引用符で囲む必要があるか、どの列が必要でないかなど、構文を理解するのに役立ちます。

これはクエリを組み立てる理想的な方法ではありませんが、動作します。また、PHP/MySQL を使い始めたばかりのように見えるので、一度にたくさんのことを投げかける必要はありません。

于 2013-03-08T22:41:10.430 に答える
2

array_filterandを使用して句implodeを作成できますwhere

$conditions = array_filter(array($core, $mhz, $ram, $cam, $mAh, $screen));
$clause = implode(' and ', $conditions);

これにより、すべての非 null 要素が として保持され$conditions、これらが で連結されandます。これを次のように使用できます

'... where ' . $clause . '...'
于 2013-03-08T22:47:19.903 に答える