[英]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.