使用准备好的PDO语句

时间:2016-08-23 17:02:35

标签: php html mysql sql pdo

我正在使用PDO预处理语句MySQL db运行查询。当我运行查询时,我还没有找到方法来了解受影响的行数(如果有的话),我已经尝试了rowCount()但仍无济于事。

$stmt1 = $db->prepare("SELECT * FROM publications WHERE pub_journal = '$j' AND pub_issue = 'CURRENT'");
$stmt1->execute();

如何找到受影响的行数?

2 个答案:

答案 0 :(得分:1)

如果您的数据库是MySQL,

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将保留行数。