2017-12-07 8 views
1

PHP PDO 데이터베이스 클래스에서 "="에서 "IS"로 연산자를 변경하는 표준 또는 최선의 방법이 있습니까? 전달할 NULL 또는 아닙니다. 내가 의미하는 바의 예가 여기있다.변수 연산자가 필요한 MySQL 쿼리 작성하기 PHP PDO

두 변수가 있습니다. 일치하는 결과의 수가 필요합니다. 때로는 하나 또는 둘 모두의 변수가 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(); 

그래서 논리 연산자 변화 또는 아무것도를 포함하여 구현 될 수있는 어떤 이상이 조건이다.