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 - 检查行是不是存在的主要内容,如果未能解决你的问题,请参考以下文章