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

に一致する行がデータベースにない場合、 -as expected -because のecho値が実際に表示されます。ただし、 から返された結果がある場合は、何も生成されません。しかし、の値が配列であるため、 が生成されると予想していました。1$resnull$stmt->fetch();echo 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の配列が返されます。それは false と見なされるため、暗黙的な比較が壊れます。これが実際に起こるとは想像できませんが、列を持たない行を含む結果セットを返すステートメントは考えられません。)

于 2013-05-04T07:42:52.020 に答える