如何使用PDO检查数据库中是否存在一行数据?

36

我希望有一个条件,当行不存在时执行某些操作。

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

尝试过 if (count($row) == 0)if($stmt->rowCount() < 0) ,但它们都不起作用。


1
$stmt->rowCount() 应该是你需要的,但检查它是否小于 0 是没有帮助的 - 它将等于 0 或小于 1 - DaveRandom
2
@DaveRandom文档说明并非所有的驱动程序都会导致SELECT返回rowCount。显然,您应该实际使用columnCount - Waleed Khan
1
@arxanas 说得很有道理,但老实说,按照手册建议运行两个查询只是一个糟糕的解决方案。即使 $rowCount = count($rows = $stmt->fetchAll()),我觉得也比那个好 - 如果没有行,它仍然会得出 0 - DaveRandom
3个回答

87

您可以直接检查返回值。

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if( ! $row)
{
    echo 'nothing found';
}

/*
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // Same here
if( ! $rows)
{
    echo 'nothing found';
}
*/

如果您想要在不获取数据的情况下进行检查,那么只需让MySQL返回1(或使用COUNT()命令)即可。

$sql = 'SELECT 1 from table WHERE id = ? LIMIT 1';
//$sql = 'SELECT COUNT(*) from table WHERE param = ?'; // for checking >1 records
$stmt = $conn->prepare($sql);
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();

if($stmt->fetchColumn()) echo 'found';

10
你的解决方案可行,但 PDOStatement::fetch 返回的不是数组,而是返回下一个结果或者如果没有更多行则返回 false。这就是为什么当结果集为空时 $row 会是 false - matthias.p
@matthias.p,感谢您的纠正。我从未使用过fetch(),所以我关于空数组的说法是来自于fetchAll() - Xeoncross
谢谢!这就是我想要的。既然我知道结果是以数组返回的,我认为检查变量可能是比使用函数或执行另一个SQL查询更好的方法。 - xperator
我可以在if条件中使用rowCount()代替fetchColumn()吗? - Shafizadeh
@Sajad,手册上说没有:"返回最后一条SQL语句所影响的行数"。 - Xeoncross
我不知道当前版本是否有所不同。但是执行以下操作:$row = $stmt->fetch(PDO::FETCH_ASSOC); 会读取第一行。所以当我稍后读取行时,我会错过第一行。 - undefined

12
if($stmt->rowCount() == 0) 

应该可以正常工作,因为在任何情况下行数都不可能小于零。

来自手册:

  

对于大多数数据库,PDOStatement::rowCount() 不会返回 SELECT 语句影响的行数。而是使用 PDO::query() 发送一个带有与您想要的 SELECT 语句相同谓词的 SELECT COUNT(*) 语句,然后使用 PDOStatement::fetchColumn() 检索将返回的行数。然后您的应用程序可以执行正确的操作。

我建议您在这里阅读更多信息 here


1
正如arxanas所说,您不应该使用rowCount来检测select语句返回的行数。 - matthias.p
如果你正在使用MySQL,那就不会有问题,但如果不是的话,你完全是正确的。 - DannyCruzeira
2
哦,那我使用了错误的符号。我以为如果它存在时更大,我应该将其反转为小于0!哈哈 - xperator

0
这是我在对象类中使用的代码:
function exists_by_id () {
    // check if object exists by id
    $stm = DB::$pdo->prepare('select count(*) from `table` where `column`=:column');
    $stm->bindParam(':column', $this->column);
    $stm->execute();
    $res = $stm->fetchColumn();

    if ($res > 0) {
        return true;
    }
    else {
        return false;
    }
}

有趣的函数。 - TuralAsgar
返回 (bool)$stm->fetchColumn(); 以减少一半大小。 - Your Common Sense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接