簡體   English   中英

使用 PHP PDO 准備好的語句和 MySQL 選擇字段為空的行

[英]Selecting rows where a field is null using PHP PDO prepared statements and MySQL

我一直在將應用程序轉換為使用 PDO 准備好的語句而不是 mysqli,但我遇到了一個奇怪的問題。 我在數據庫中有一些記錄,預計字段將為空。 不是 'null'(字符串)或 ''(空字符串),而是 NULL。 我動態地構建我的查詢,所以過去當我在一個對象中遇到一個空變量時,我會像這樣構建查詢:

WHERE fieldName is null;

並且在該字段為空時會得到預期的結果。

現在使用 PDO,我的查詢不會返回任何結果,也不會出現任何錯誤。 它只是沒有返回我期望的記錄。 當我回顯構建的查詢並直接在 MySQL 中運行它們時,我得到了預期的結果,但在應用程序中沒有返回任何結果。

我嘗試過的一些事情包括構建如下所示的查詢:

WHERE fieldName is null;

或者

WHERE fieldName <=> null;

我還嘗試了以下標准准備好的聲明:

WHERE fieldName = :fieldName

然后綁定這些類型的語句:

$stmt->bindParam(":$field", $value);
$stmt->bindParam(":$field", $value, PDO::PARAM_NULL);
$stmt->bindParam(":$field", null, PDO::PARAM_NULL);
$stmt->bindValue(":$field", null, PDO::PARAM_NULL);
$stmt->bindValue(":$field", null, PDO::PARAM_INT);

對此的任何幫助將不勝感激。 我的 PHP 版本是 5.3.10,MySQL 是 5.5.22。 作為一個附帶問題,我仍然不清楚 bindParam 和 bindValue 之間的區別,所以如果在你的答案中包含它是有意義的,我真的很感激對這個主題的一些澄清......

既然已經寫了這個問題,mysql引入了一個宇宙飛船操作符,可以讓我們使用正則查詢來匹配一個空值

WHERE fieldName <=> :fieldName;

將匹配既是null或者沒有任何空值。

所以只需立即編寫您的查詢並照常執行

$stmt = $db->prepare('SELECT field FROM table WHERE fieldName <=> :fieldName;');
$stmt->execute(['fieldName' => null]);
$result = $stmt->fetchAll(); // whatever fetch method is suitable

對於動態構建的查詢,一切都是一樣的。

不同的問題,但所有 awnsers 都在這里: 如何使用 PDO 插入 NULL 值?

把它們加起來:

$stmt->bindValue(':param', null, PDO::PARAM_INT); 

應該可以。您還可以使用:

$stmt->execute( array(":param" => NULL));

對於 bindparam,您必須在變量(不是常量)中給出值,bindvalue 可以使用常量等。

在 MySql 中,您可以使用查詢

select * from atable where isnull(column_name); 

檢查空值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM