2017-12-07 15 views
1

PHP PDOデータベースクラスには、値がわからないときに演算子を "="から "IS"に変更する標準または最良の方法がありますか渡すかどうかはNULLかどうか。ここに私が意味するものの例があります。変数演算子を必要とするMySQLクエリの構築PHP PDO

私には2つの変数があります。私は一致する結果の数が欲しいです。場合によっては、変数の一方または両方がNULLになることがあります。しかし、MySQLはNULLを見つけるために別の演算子を必要とします(IS NULL)。

私は現在、ちょうどオペレータのために別の変数を作成していると私は、クエリを構築するとき、私はそれはようにして注入:

// First create a variable "=" or "is" depending on whether var1 and var2 are NULL or not 
    if($var1 == NULL) $var1_operator = "IS"; 
    else $var1_operator = "="; 
    if($var2 == NULL) $var2_operator = "IS"; 
    else $var2_operator = "="; 

    // Build the query 
    $query = 'SELECT count(*) as count FROM table 
    WHERE var1 '.$var1_operator.' :var1 AND var2 '.$var2_operator.' :var2'; 

    // Conduct the query 
    $prepare = $db_connection->prepare($query); 
    $prepare->bindValue(':var1', $var1, PDO::PARAM_STR); 
    $prepare->bindValue(':var2', $var2, PDO::PARAM_STR); 
    $prepare->execute(); 
    $results = $prepare->fetch(); 

これを行うための別の方法はありますか?これは、値がNULLで実際は文字列でなくても、PARAM_STRを使用してbindValueに作用します。クエリは正しい値のカウントを返します。それを行うためのより良いプラクティスがあるかどうかは分かりません。

+0

これは、PDO – Gunaseelan

答えて

2

MySQLを使用しているとして、あなたはそのspaceship operator<=>を使用することができます。

$query = 'SELECT count(*) FROM table WHERE var1 <=> ? AND var2 <=> ?'; 
$prepare = $db_connection->prepare($query); 
$prepare->execute([$var1, $var2]); 
$count = $prepare->fetchColumn(); 

しかし、あなたは、変数の演算子や他のクエリの部品が必要な場合は、一般的に、このような条件付きクエリの建物が唯一の方法です。

より一般的な解決策は、私の記事How to create a WHERE clause for PDO dynamicallyで見つけることができます:

// always initialize a variable before use! 
$conditions = []; 
$parameters = []; 

// conditional statements 
if (!empty($_GET['name'])) 
{ 
    // here we are using LIKE with wildcard search 
    // use it ONLY if really need it 
    $conditions[] = 'name LIKE ?'; 
    $parameters[] = '%'.$_GET['name']."%"; 
} 
if (!empty($_GET['sex'])) 
{ 
    // here we are using equality 
    $conditions[] = 'sex = ?'; 
    $parameters[] = $_GET['sex']; 
} 
if (!empty($_GET['car'])) 
{ 
    // here we are using not equality 
    $conditions[] = 'car != ?'; 
    $parameters[] = $_GET['car']; 
} 
// the main query 
$sql = "SELECT * FROM users"; 
// a smart code to add all conditions, if any 
if ($conditions) 
{ 
    $sql .= " WHERE ".implode(" AND ", $conditions); 
} 
// the usual prepare/execute/fetch routine 
$stmt = $pdo->prepare($sql); 
$stmt->execute($parameters); 
$data = $stmt->fetchAll(); 

ので、これらの条件におけるオペレータの変更か何かを含め、実現可能なロジックを全ての上。