【问题标题】:Php PDO wrong row countphp PDO 错误的行数
【发布时间】:2013-04-17 22:37:56
【问题描述】:

当我回显 $rows_affected 变量时,有人可以解释一下,为什么根据我的数据库记录我应该得到 2 时我只得到 1?半个多小时试图弄清楚这一点,但仍然无法解决它.. 仍然是 PDO 上的菜鸟。

欢迎任何其他建议。

$sql1 = "SELECT title FROM page WHERE id=?";
        $stm = $db->prepare($sql1);
        $stm->execute(array($id));
        $row1 = $stm->fetch(PDO::FETCH_ASSOC);

        $sql2 = "SELECT id,title,pg_title FROM page WHERE title=? ORDER BY id ASC";
        $stm = $db->prepare($sql2);
        $stm->execute(array($row1['title']));

        $rows_affected = $stm->fetchColumn();

        if (count($rows_affected) > 0) {
            for($i=0; $i <= $rows_affected; $i++) {

                $row2 = $stm->fetch(PDO::FETCH_ASSOC);

                if($row2['id']==$id){
                    echo '<a href="javascript: void(0)"><b>'.$row2['pg_title'].'</b></a>&nbsp;&nbsp;';
                }else{
                    echo '<a href="page.php?id='.$row2['id'].'';?><?php if(isset($_GET['edit']) && $_GET['edit']==1){ echo '&edit=1';}?><?php echo'">'.$row2['pg_title'].'</a>&nbsp;&nbsp;';

                }
            }
        }

【问题讨论】:

  • fetchColumn() 会从第二个查询的第一个结果中得到id 列的值,它与找到的记录数无关。你的意思是rowCount()?请注意,rowCount() 方法仅适用于 MySQL。另请注意,$rows_affected 将是一个标量值,因此count() 与它结合使用毫无意义。
  • 谢谢,一开始就奏效了!愚蠢的错误..当您说 rowCount() 仅适用于 mysql 时,您的意思是它仅在我在 mysql 中编码时才有效? P.s:我的英语不是很好对不起
  • @miguelfsf 听起来不错 :)
  • @miguelfsf 是的,rowCount() 对于所有数据库驱动程序的SELECT 语句不能保证按预期工作。据我所知,MySQL 是唯一一个本机支持的驱动程序,它 保证可以工作。有关更多(尽管不多)信息,请参阅链接的手册页。还有stackoverflow.com/a/15888467/889949

标签: php pdo count row prepared-statement


【解决方案1】:

fetchColumn():

从结果集的下一行返回单列,如果没有更多行,则返回 FALSE。

我想你想使用fetchAll()。如果您只想要第一列,请使用PDO::FETCH_COLUMN 作为$fetch_style。例如

$rows_affected = $stm->fetchAll(PDO::FETCH_COLUMN, 0);

【讨论】:

    【解决方案2】:

    如果你使用的是 MySql,你可以使用rowCount 方法。

    或者直接迭代更好:

    $stm->execute(array($row1['title']));
    $stm->setFetchMode(\PDO::FETCH_ASSOC);
    foreach ($stm as $row2) {
        if($row2['id']==$id){
            // do your stuff
        }
    }
    

    【讨论】:

      【解决方案3】:

      某些数据库可能会返回 SELECT 语句返回的行数。但是,这种行为并不能保证适用于所有数据库,并且不应依赖于 .Manual 您可以使用 COUNT(*)fetchColumn() 来模拟 rowCount(),如下查询所示。

          $sql2 = "SELECT COUNT(*) FROM page WHERE title=?";
          $stm = $db->prepare($sql2);
          $stm->execute(array($row1['title']));
      
      // Check the number of rows that match the SELECT statement 
      if($sql2->fetchColumn() == 0) {
          echo "No records found";//For Testing
       }else{
           $sql3 = "SELECT id,title,pg_title FROM page WHERE title=? ORDER BY id ASC";
           //Etc
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-29
        • 2015-07-31
        • 1970-01-01
        • 2015-04-06
        • 2017-06-30
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多