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 条件 ..
您可以使用 if
s 创建查询并执行 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);
我正在 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 条件 ..
您可以使用 if
s 创建查询并执行 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);