mysql where 条件中的 Null 或 Not Null 值

Null or Not Null value in mysql where condition

我正在 php 代码中编写小型 mysql select 查询,在 select 查询中它具有三个不同的 where 条件,例如

SELECT * FROM table1 WHERE pid = $pid AND qid = $qid AND text="$text" ; 

它会动态地改变变量,有时其中一个变量会变为 null,那时我的情况看起来像

SELECT * FROM table1 WHERE pid = $pid AND text="$text" ;

text 和 pid 也可以一样,我该怎么做,有没有解决方案,或者我是否应该在 php 中使用 if/switch 条件 ..

您可以使用 ifs 创建查询并执行 PDO 准备语句 (http://php.net/manual/en/pdo.prepare.php)。

<?php
$query = "SELECT * FROM table1 WHERE 1 = 1";
$params = array();

if(null !== $pid) {
    $query .= ' AND pid = :pid';
    $params[':pid'] = $pid;
}
if(null !== $qid ) {
    $query .= ' AND qid = :qid';
    $params[':qid'] = $qid;
}
if(null !== $text) {
    $query .= ' AND text = :text';
    $params[':text'] = $text;
}

$sth = $dbh->prepare($query);
$sth->execute($params);
$result = $sth->fetchAll();

您可以将其包含在 SQL 中,如下所示:

SELECT * 
FROM table1 
WHERE ("$pid" = "" OR pid = "$pid") 
AND ("$qid" = "" OR qid = "$qid") 
AND ("$text" = "" OR text="$text") ;

MySql-服务器将看到 ... WHERE ("" = "" OR pid = "") 并通过删除此部分在执行之前优化查询。

这是另一个 mysql 变体:

SELECT *
FROM tbl
WHERE
    IF($pid > 0, pid = $pid, 1 = 1)
AND IF($qid > 0, qid = $qid, 1 = 1)
AND IF($text > '', `text` = $text, 1 = 1)
;

但这里是硬编码值。并且您不能 select pid 或 qid 正好等于 0 或 text 等于 ''(空字符串)的行。
并且您可以收到 select 您 table 中所有行的查询,我想这会很糟糕...

Php:

<?php

$dbh = new PDO('mysql:dbname=test;host=127.0.0.1', 'root');
$pid = 1;
$qid = 2;
$text = '3';
$sql = 'SELECT * FROM tbl WHERE 1 = 1';
$params = [];
if (isset($pid)) {
    $sql .= ' AND pid = :pid';
    $params[':pid'] = $pid;
}
if (isset($qid)) {
    $sql .= ' AND qid = :qid';
    $params[':qid'] = $qid;
}
if (isset($text)) {
    $sql .= ' AND `text` = :text';
    $params[':text'] = $text;
}
$sth = $dbh->prepare($sql);
$sth->execute($params);
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
var_export($result);