我正在使用 PDO 准备语句、MySQL 数据库运行查询。当我运行查询时,我还没有找到一种方法来了解受影响的行数(如果有的话),我尝试了 rowCount()
但仍然无济于事。
$stmt1 = $db->prepare("SELECT * FROM publications WHERE pub_journal = '$j' AND pub_issue = 'CURRENT'");
$stmt1->execute();
如何找到受影响的行数?
最佳答案
如果您的数据库是 MySQL,
rowCount
应该可以工作。它对您不起作用的事实表明您的查询可能失败,或者它没有返回您期望的行数。
PDO documentation建议使用以下方法查找行数:
For most databases, PDOStatement::rowCount() does not return the number of rows affected by a SELECT statement. Instead, use PDO::query() to issue a SELECT COUNT(*) statement with the same predicates as your intended SELECT statement, then use PDOStatement::fetchColumn() to retrieve the number of rows that will be returned.
这应该与准备好的语句以及 PDO::query()
一起工作。
您可以修改原始 SQL 以用作模板,以便它可以使用 COUNT(*)
或 *
(或者更好的是,一个列表您需要的特定列)。
$sql = "SELECT %s FROM publications WHERE pub_journal = ? AND pub_issue = 'CURRENT'";
注意 SQL 中的 ?
。这是一个占位符,当使用 execute([$j]);
执行语句时,$j
变量将绑定(bind)到该占位符。当您将变量连接到 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]);
关于php - 使用准备好的 PDO 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106959/