簡體   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