PDO/PHP - 检查行是不是存在

Posted

技术标签:

【中文标题】PDO/PHP - 检查行是不是存在【英文标题】:How to check if a row exist in the database using PDO?PDO/PHP - 检查行是否存在 【发布时间】:2012-08-12 01:28:54 【问题描述】:

我想要一个条件,以防该行根本不存在。

$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),但它们都不起作用。

【问题讨论】:

$stmt->rowCount() 应该是您需要的,但检查它是否小于 0 无济于事 - 它会等于 0小于 1 @DaveRandom 文档指出,并非所有驱动程序都会导致SELECT 给出rowCount。显然你实际上应该使用columnCount @arxanas 一个公平的观点,但坦率地说,运行两个查询只是为了获得行数(如手册所示)是一个糟糕的解决方案。即使$rowCount = count($rows = $stmt->fetchAll()) 是比这更好的解决方案,我觉得 - 如果没有行,它仍然会导致0 【参考方案1】:

你可以直接查看返回值。

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

【讨论】:

你的解决方案会起作用,但PDOStatement::fetch返回一个数组是不正确的;它返回下一个结果或 false 如果不再有行。这就是为什么当结果集为空时$row 为假的原因。 @matthias.p,感谢您的更正。我从不使用fetch(),所以我关于空数组的声明来自fetchAll() 谢谢!这就是我一直在寻找的。由于我知道结果是在数组中返回,所以我认为这可能是检查变量而不是使用函数或执行另一个 sql 查询的最佳方法。 我可以在if 条件中使用rowCount() 代替fetchColumn() 吗? @Sajad manual says no: "返回最后一条 SQL 语句影响的行数"【参考方案2】:
if($stmt->rowCount() == 0) 

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

来自手册:

对于大多数数据库,PDOStatement::rowCount() 不返回 受SELECT 语句影响的行数。相反,使用 PDO::query() 发出 SELECT COUNT(*) 相同的声明 谓词作为您预期的SELECT 语句,然后使用 PDOStatement::fetchColumn() 检索将要显示的行数 被退回。然后,您的应用程序可以执行正确的操作。

我建议阅读here。

【讨论】:

正如 arxanas 已经说过的,您不应该使用 rowCount 来检测 select 语句返回的行。 如果你使用 MySQL 应该没问题,否则你是完全正确的。 哦,那我用错了标志。我想如果它在更大的时候确实存在,我应该把它反转到小于 0 !大声笑【参考方案3】:

这是我在对象类中使用的:

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;
    

【讨论】:

有趣的功能。 返回(bool)$stm->fetchColumn(); 将大小减半

以上是关于PDO/PHP - 检查行是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Room:如何检查行是不是存在

检查行是不是已存在如果不存在则插入行否则显示消息

检查值是不是存在于数据库行之一中

在 PostgreSQL 中检查行是不是存在非常慢

Flask-SQLAlchemy 检查表中是不是存在行

Mysql - 检查行是不是存在