请考虑以下代码:
$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
- 预期的值 - 因为$res
实际上是null
。但是,如果从$stmt->fetch();
返回结果,则echo
不产生任何内容。但是,我原本预计它会产生0
,因为$res
是一个数组。
我如何能够始终如一地简洁地将结果与简单地确定是否有结果进行比较?
答案 0 :(得分:2)
如果没有结果,则不会返回null
。它会返回false
(假设为PDO::FETCH_BOTH
- 以查看完整列表read the doc)。此外,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
返回一个emtpy数组。这会打破隐式比较,因为它会被认为是假的。我无法想象这实际上会发生过。我想不出一个声明会返回一个没有列的行的结果集。)