【问题标题】:Alternative for mysql_num_rows using PDO使用 PDO 替代 mysql_num_rows
【发布时间】:2012-07-03 05:56:19
【问题描述】:

现在我有一个 PHP 文件,它执行 MYSQL 查询,然后像这样计算行数:

$count=mysql_num_rows($result);


if ($count == 1) {
    $message = array('status' => 'ok');
} else {
    $message = array('status' => 'error');
}

这很好,但我正在尝试更改我的所有 PHP 文件以使用 PDO。那么如何用 PDO 做到这一点呢?

【问题讨论】:

标签: php mysql pdo


【解决方案1】:
$res = $DB->query('SELECT COUNT(*) FROM table');
$num_rows = $res->fetchColumn();

$res = $DB->prepare('SELECT COUNT(*) FROM table');
$res->execute();
$num_rows = $res->fetchColumn();

您也可以使用它来询问数据是否存在或被选中:

$res = $DB->query('SELECT COUNT(*) FROM table');
$data_exists = ($res->fetchColumn() > 0) ? true : false;

或者用你的变量:

$res = $DB->query('SELECT COUNT(*) FROM table');
$message = ($res->fetchColumn() > 0) ? array('status' => 'ok') : array('status' => 'error');

【讨论】:

  • 我错了,否则你只会得到“下一行的第一列”uk3.php.net/manual/en/pdostatement.fetchcolumn.php
  • 如果 fetchColumn 中没有参数,您将获得所选行的第一列。但我们只得到 1 个结果,这就是计数。下一行意味着,当您没有获取行或列时,您将从第一行结果开始。再次调用 fetchColumn 后,会得到下一行的内容。
  • 是的,fetchcolumn() 返回行的第一列,相反,你需要使用rowCount()
【解决方案2】:
$stmt = $db->query('SELECT * FROM table');  
$row_count = $stmt->rowCount();  
echo $row_count.' rows selected';

【讨论】:

  • php.net/manual/en/pdostatement.rowcount.php 说:如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都可以保证这种行为,并且不应依赖于可移植应用程序
【解决方案3】:

也许您可以使用 PDO 的“fetchAll”方法,该方法返回一个包含所有 SELECT 结果的数组。 然后使用“count”方法统计数组的行数。

例如:

$rows = $stmt->fetchAll();
$num_rows = count($rows);

【讨论】:

  • 如果您只需要知道结果的数量,这在大型数据集上可能会很昂贵。
  • @QuinnComendant,rowCount() 函数仅在您获取所有行之后才会返回准确的计数。
  • @BillKarwin,你是说mysql_num_rows()吗? PDO 的 rowCount() 方法“返回受最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数”——不是一回事。
  • @QuinnComendant,检查 ext/pdo_mysql/mysql_statement.c 中的代码,在函数 pdo_mysql_fill_stmt_from_result() 中。至少在 MySQL 驱动程序中,PDOStatement::rowCount() 适用于受影响的行和结果集行。
【解决方案4】:

如果你没有使用准备好的语句,那么试试:

$find = $dbh->query('SELECT count(*) from table');
if ($find->fetchColumn() > 0){
    echo 'found';
}

但是,如果您选择我强烈推荐的准备好的语句,那么:

$find = $dbh->prepare('SELECT count(*) from table');
$find->execute();
if ($find->fetchColumn() > 0){
    echo 'found';
}

【讨论】:

    【解决方案5】:

    可以这样……

    $numRows = $conn->query("SELECT COUNT(*) FROM yourtable")->fetchColumn();
    echo $numRows; 
    

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多