0

入力した項目を取得してデータベースを検索するクエリを作成しようとしています。私はそれを何度か行った方法を知っていますが、このクエリは機能したくありません。

これはクエリです

$getcamp = $db->query("SELECT * FROM `campaigns` 
WHERE `requirements` LIKE '%$keyw%' OR `description` LIKE '%$keyw%' OR `name` 
LIKE '%$keyw%' OR `countries` LIKE '%$country%' OR `id` LIKE '%$camp%' OR `category` 
LIKE '%$cat%' AND `active` = '1' ORDER BY `added`") 

or die($db->error);

休憩がたくさんありOR、いくつかの異なるバリエーションで括弧で囲んでみましたが、クエリはまだ機能せず、エラーはありません。検索されたものではなく、テーブル内のすべてが表示されます。私は通常、1つか2つのアイテムを検索するためだけに書いているので、これらの種類のクエリには最適ではありません。これはたくさん検索しています。

そのステートメントの最初の3つだけを検索する場合は問題なく機能しますが、最初の3つを括弧で囲んでも、損益分岐点に追加し始めると、何をしているのかわかりません。間違い。

また、私のホストはmysqlndをサポートしていないため、プリペアドステートメントを使用していませんが、変数は事前にエスケープされています。

4

2 に答える 2

3

変数の1つが空の場合、すべての行が選択されます。

次のことを行う必要があります(これは基本的な例なので、アイデアを理解できます)。

$orArray = array();
$orQuery = "";
if (!empty($keyw) && strlen($keyw) > 2) { // and other SQL injection checks
    $orArray[] = "`requirements` LIKE '%{$keyw}%' ";
}

if (!empty($orArray())) {
    $orQuery = implode(' OR ', $orArray);
}

$query = "SELECT * FROM `campaigns` WHERE ( {$orQuery} ) AND active = 1 "; 
// You also should check if $orQuery is empty, if it is, you need to remove AND. 
// Well, in that case you wouldn't do the query at all.

このようなことを行う必要がありますが、すべての変数をチェックする必要があります。

PS:文字列検索の最小値を設定することをお勧めします(3が出発点として適しています)。

PS2:これは問題ではないかもしれませんが、スクリプトロジックの欠陥であるため、指摘しておきます。

于 2013-01-23T08:46:42.337 に答える
1

問題は実際には、「または」の後に「および」があることだと思います。すべての or を余分な括弧で囲む必要があります。

よりよく説明するために、次の php コードを検討してください。

<?php

var_dump(1 || 2 && 0);
var_dump((1 || 2 ) && 0);

そして出力:

xxx@www0 ~/sp $ php -q a.php 
bool(true)
bool(false)

注記||は or, &&is and

于 2013-01-23T08:58:50.657 に答える