通过mysql上的变量发送“null”不会删除该行

时间:2014-12-16 14:06:27

标签: php mysql pdo

我有这个代码/查询:

if ($a == $b) {
    $type = 1;
} else {
    $type = null;
}

$this->query(
    'DELETE FROM users WHERE userid = ? AND type = ?',
    array($userid, $type)
);

购买mysql并不理解第二种情况,如果$typenull,则不会删除该行。

我知道在查询中定义null的正确方法是使用IS NULL,但就我而言,它不适合。

我能以某种方式通过变量传递null吗?

2 个答案:

答案 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)
    );
}