我有这个代码/查询:
if ($a == $b) {
$type = 1;
} else {
$type = null;
}
$this->query(
'DELETE FROM users WHERE userid = ? AND type = ?',
array($userid, $type)
);
购买mysql并不理解第二种情况,如果$type
为null
,则不会删除该行。
我知道在查询中定义null的正确方法是使用IS NULL
,但就我而言,它不适合。
我能以某种方式通过变量传递null吗?
答案 0 :(得分:3)
当然可以让WHERE
子句本身知道在值和IS NULL
之间切换,但需要额外的条件和额外的占位符。在您的情况下,由于查询很简单,我会动态构建它并将参数附加到array()
以便执行。
// The basic query, with conditions common to either case:
$sql = 'DELETE FROM users WHERE userid = ? AND ';
// For bound parameters...
// $userid will always be present
$params = array($userid);
if ($a == $b) {
// Add an additional parameter for type
$params[] = 1;
// And add to the WHERE clause the type condition
$sql .= ' type = ?';
}
else
// Or the NULL type condition
$sql .= 'type IS NULL';
}
// Execute with the $params array, which has 1 or 2 elements.
$this->query($sql, $params);
为了将此内容填充到一个查询中,WHERE
子句必须检测type
变量是非空的OR
条件。一种方式(不是唯一的方式,也许不是最好的方式)看起来像这样:
DELETE
FROM users
WHERE
userid = ?
AND ((? = 1 AND type = ?) OR type IS NULL)
在这种情况下,$type
的值将传入两次,首先使条件1=1
为真,然后实际与type
列进行比较。但正如您所看到的,当使用占位符时,这会变得有些混乱。首先动态构建字符串更容易。
答案 1 :(得分:1)
MySQL不理解where columnname = null
。 MySQL确实理解where columnname is null
试试这个:
if ($a == $b) {
$this->query(
'DELETE FROM users WHERE userid = ? AND type = ?',
array($userid, 1)
);
} else {
$this->query(
'DELETE FROM users WHERE userid = ? AND type IS NULL',
array($userid)
);
}