繁体   English   中英

将NULL传递给php mysql where子句

[英]pass NULL to php mysql where clause

表中的列之一已设置为NULL ,将包含或不包含值。 现在,如果用户输入为NULL则选择所有包含null行。 如果是非空输入,则进行相应选择。

WHERE student.section = NULL // tried like '', 'NULL'

但是我发现这不是有效的方法

因此,我遵循以下逻辑,但我认为它的结构不合理,我认为可以缩短以防止重复的代码。

如果section为null

if(empty($_POST['section'])){
    $result=$con->prepare(
        "SELECT
        ...
        FROM student
        WHERE student.class=:cid AND student.section IS NULL"
    )
    $result->bindParam(':cid',$_POST['class']);
    $result->execute();
} else {
    $result=$con->prepare(
        "SELECT
        ...
        FROM student
        WHERE student.class=:cid AND student.section=:sid"
    )
    $result->bindParam(':cid',$_POST['class']);
    $result->bindParam(':sid',$_POST['section']);
    $result->execute();
}

删除表的表用法。 如果没有联接,则无需再次加入,这会使它“更短”,但保持相同的逻辑。

SELECT
    ...
    FROM student
    WHERE class=:cid AND section=:sid

在那里,我为您节省了大约14次击键和0<14因此它被“减少了”。

我知道我在评论中说IS NOT NULL ,但是从逻辑上说

  AND student.section=:sid

  AND student.section IS NOT NULL

如果student.section = 10:sid为20,您将不会获得记录,但是如果将其更改为IS NOT NULL则您会因为10当然不为null,但也不是20,因此逻辑被改变了。 在一种情况下,您不会获得另一种记录。

更新

这是我唯一能想到的

$sql = 'SELECT
    ...
    FROM student
    WHERE class=:cid AND section';

if(empty($_POST['section']))
    $sql .= ' IS NULL';
else
    $sql .= ' = :sid';

$result=$con->prepare($sql);
$result->bindParam(':cid',$_POST['class']); //this is wrong
$result->execute();

更新1

但是,您也不应该这样做。

$result=$con->prepare($sql); //this is PDOStatment not a result
$result->bindParam(':cid',$_POST['class']); //this is wrong
$result->execute(); //your not setting a result variable

同样,很难有条件地绑定到stmt (PDOStatment object)因为在构造查询时您还没有它。 您可以prepare 2x并绑定到cid 2x。 您可以执行条件2x,然后在第二个条件中进行绑定。 但是,我们正在缩短它,幸运的是,我们可以将参数作为数组传递给execute

所以我将其更改为使用参数数组

$sql = 'SELECT
    ...
    FROM student
    WHERE class=:cid AND section';

$param = [':cid' => $_POST['class']];

if(empty($_POST['section'])){
    $sql .= ' IS NULL';
}else{
    $sql .= ' = :sid';
    $param[':sid'] = $_POST['section'];
}

$stmt=$con->prepare($sql);
$result = $stmt->execute($param);

$data = $result->fetchAll(PDO::FETCH_ALL);

您对问题的措辞很难理解。 基本上,这只是DRY(不要重复自己)原则,这很好。 不像WET(两次写入所有内容)...大声笑。 因此,当有人说您的编码全是WET时,您就知道他们的意思了。 :)

实际上,我很困惑,几乎错过了$result问题。

干杯!

选择NULL值时,不应使用equal语句。 您应该使用IS语句,如下所示:

对于空值

SELECT foo
FROM bar
WHERE status IS NULL;

或非空值

SELECT foo
FROM bar 
WHERE status IS NOT NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM