2017-05-12 7 views
0

2つの検索選択のうち、訪問者が1つだけを選択した場合、検索結果はありません。以下は私のSQLクエリです:2つの列のうち1つがヌルの行を選択する

$sql = "SELECT * FROM table WHERE column1='$column1' AND column2 ='$column2' ORDER BY id DESC 

私は 'OR'を使用するかそうでなければ私は間違ったページング結果を得ました。訪問者が検索基準を1つだけ選択した場合、最初と次のページに結果が表示されます。 PHPで

+1

変数$ column1と$ column2をバインドして、SQLインジェクションを行わないようにすることをお勧めします。 – Axcel

+0

したがって、coulmn1またはcolumn2がnullでなければならない結果のみを選択しますか? –

+0

1つは '$ column1'か' $ column2'です。それは常に '$ column1'ですか? –

答えて

2

yourクエリを作成:

$where = []; 
$params = []; 

if (!empty($column1)) { 
    $where[] = 'column1 = :column1'; 
    $params[':column1'] = $column1; 
} else { 
    $where[] = 'column1 IS NULL'; 
} 

if (!empty($column2)) { 
    $where[] = 'column2 = :column2'; 
    $params[':column2'] = $column2; 
} else { 
    $where[] = 'column2 IS NULL'; 
} 

if (!empty($where)) { 
    $pdo 
     ->prepare("SELECT * FROM table WHERE ".implode(' AND ', $where)) 
     ->execute($params); 
} 

あなたは1列のみで選択の範囲を許可する場合は、else部品

を削除
+0

私はそれがうまくいくと思います。ありがとう。 – rns

0

高速なソリューションは、変数checking intoフィルタを置くことができるということです$ column1または$ column2の値が入力された後にSELECT節に追加されます。

$where_column = 'WHERE '; 
if ($column1 != false) 
    $where_column .= "column1='$column1'"; 

if ($column2 != false) { 
    if ($where_column != 'WHERE') { 
     $where_column .= "AND column2='$column2'"; 
    else 
     $where_column = "column2='$column2'"; 
    } 
} 

$sql = "SELECT * FROM table $where_column ORDER BY id DESC 
+1

* pro-tip *配列に部分を追加し、後で 'implode( 'AND')'を少なくするif {} else {} ' – Justinas

+0

あなたの投稿を見ました、Justinas。これはスケーラビリティに優れた解決策ですが、パフォーマンス/シンプルさのために、ビジネスルールを本当に必要とせずにコードにインプット実装を使用しないことをお勧めします。 コードに2列しか必要ない場合は、よりシンプルで高速です。あなたのものよりもスケーラビリティではありません。 ありがとう! – calexandre

関連する問題