0

考虑以下代码:

$conn = new PDO("connection string", "user name", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT `id` FROM `users` WHERE `displayname` = :displayname";
$parms = array(':displayname' => 'Test');
$stmt = $conn->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$stmt->execute($parms);

$res = $stmt->fetch();
echo $res == null;

更具体地考虑这一行:echo ($res == null);

如果数据库中没有与 匹配的行,则echo显示值1-as expected -因为$resis in fact null。但是,如果有结果返回,$stmt->fetch();echo 什么也不会产生。但是,我原以为它会产生 a 0,因为 的值$res是一个数组。

如何始终如一地简洁地比较结果以简单地确定是否有结果?

4

1 回答 1

2

当没有结果时,它不会返回null。它返回false(好吧,假设PDO::FETCH_BOTH-- 要查看完整列表,请阅读文档)。此外,false转换为字符串是一个空字符串。这就是为什么你没有得到任何输出。

echo false; //Outputs nothing

$s = (string) false;
var_dump($s === ""); //true 

至于确定是否有结果,你可以做一个简单的隐式检查:

$res = $stmt->fetch();
if ($res) { 
    echo 'Got a row!';
} else {
    echo 'No row :(';
}

这是因为有一些隐式强制转换。考虑fetch将要返回的内容:非空数组或false. (bool) $arr === true只有当count($arr) > 0. 从这里,您应该能够看到为什么会这样。

(注意:理论上,结果集确实可能是一个空行。这将导致fetch返回一个空数组。这会破坏隐式比较,因为它会被认为是错误的。我无法想象这实际上会发生.我想不出一个语句会返回一个没有列的行的结果集。)

于 2013-05-04T07:42:52.020 回答