Php 我如何简单地确定是否有(没有)来自PDO语句获取的结果?

Php 我如何简单地确定是否有(没有)来自PDO语句获取的结果?,php,pdo,Php,Pdo,考虑以下代码: $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

考虑以下代码:

$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;

并且更具体地考虑这一行:ECHA$RES=NULL; 如果数据库中没有与echo匹配的行,则会显示值1(如预期的那样),因为$res实际上为null。但是,如果有从$stmt->fetch返回的结果;回声不产生任何东西。但是,我希望它会产生一个0,因为$res的值是一个数组


我如何能够一致而简洁地比较结果,以简单地确定是否有结果?

如果没有结果,它不会返回null。它返回false well,假设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 :(';
}
这是因为存在一些隐式强制转换。考虑获取将返回的内容:非空数组或false。bool$arr===只有当count$arr>0时才为真。从这里,你应该可以看到为什么这是可行的


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

当您将布尔类型转换为$res==null时会发生什么情况。。原因$stmt->fetch如果未返回数据,则返回false。。所以如果你得到一个可能是布尔值的数组,你可以得到1或true。。不过我不确定……这是一个非常好的答案,也是我一直在寻找的答案——谢谢你为我详细介绍一下——我是PHP新手@MichaelPerrenoud很高兴我能帮上忙。你可能想看看类型规则。有些PHP强制转换相当于wtf?!有时会像false指向空字符串,而true指向1。您的意思是,如果表没有列,则SELECT*FROM tableName将返回空行吗?@RoyalBg这将取决于数据库,但理论上,这是一种可能性。我无法想象什么样的RDBMS会允许你创建一个无列的表。@Corbin,我不得不同意,为什么错误的结果不会是0?但是,嘿,当你知道规则时,这没什么大不了的,只是奇怪而已!