我正在使用PDO预处理语句MySQL db运行查询。当我运行查询时,我还没有找到方法来了解受影响的行数(如果有的话),我已经尝试了rowCount()
但仍无济于事。
$stmt1 = $db->prepare("SELECT * FROM publications WHERE pub_journal = '$j' AND pub_issue = 'CURRENT'");
$stmt1->execute();
如何找到受影响的行数?
答案 0 :(得分:1)
rowCount
应该可以工作。它没有为您工作的事实表明您的查询可能失败,或者它没有返回您期望它的行数。
PDO documentation建议使用以下方法查找行数:
对于大多数数据库,PDOStatement :: rowCount()不返回受SELECT语句影响的行数。相反,使用PDO :: query()发出SELECT COUNT(*)语句,其语句与预期的SELECT语句相同,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。
这应该与准备好的陈述以及PDO::query()
一起使用。
您可以修改原始SQL以用作模板,以便它可以采用COUNT(*)
或*
(甚至更好,您需要的特定列的列表)。
$sql = "SELECT %s FROM publications WHERE pub_journal = ? AND pub_issue = 'CURRENT'";
注意SQL中的?
。这是一个占位符,当$j
执行语句时,execute([$j]);
变量将被绑定到该占位符。当您将变量连接到SQL字符串(如...WHERE pub_journal = '$j'...
)时,您实际上并没有获得预准备语句的大部分好处。
通过这种方式,您可以准备并执行计数查询:
$count_stmt = $db->prepare(sprintf($sql, 'COUNT(*)'));
$count_stmt->execute([$j]);
然后通过以下方式获得计数:
$count = $count_stmt->fetchColumn();
在对计数执行任何操作后,可以通过指定所需的列而不是COUNT(*)
来执行实际的SELECT查询。
$select_stmt = $db->prepare(sprintf($sql, '*'));
$select_stmt->execute([$j]);
答案 1 :(得分:0)
rowcount()
应仅使用for DELETE, INSERT, or UPDATE statements,但在某些情况下它可能适用于SELECT。你能做的就是:
$res = $stmt->fetchAll();
$count = count($res);
$count
将保留行数。