【问题标题】:PHP PDO - incremental for loop that fetches the next array row with each loopPHP PDO - 增量 for 循环,每次循环获取下一个数组行
【发布时间】:2015-07-06 12:19:27
【问题描述】:

我正在将旧的 mysql 数据库技术更新为准备好的 pdo 语句。我对 while 循环 while($row = $result->fetch()) 很满意,但是如何使用 PDO 准备好的语句执行以下操作?

$sql = "SELECT * FROM table WHERE id=".$id;
$result = mysql_query($sql) or die(mysql_error());
$loop_count = mysql_num_rows($result);

for($row=0;$row<7 && $loop_count-->0;$row++)
{
    // Get next row
    $loop_row = mysql_fetch_array($result);

    echo $loop_row['field'];
}

我试过了,但没有任何乐趣:

$result = $conn->prepare("SELECT * FROM table WHERE id= ?");
$result->execute(array($id));
$loop_count = $result->rowCount();

for($row=0;$row<7 && $loop_count-->0;$row++)
{
    // Get next row
    $loop_row = $result->fetch();

    echo $loop_row['field'];
}

谢谢!

更新:使用 for 循环而不是 while 循环的原因是能够对结果进行分页,否则我只会将 LIMIT 7 放在 SQL 查询的末尾。

【问题讨论】:

  • 在执行 select 语句时,rowCount 可能不适用于某些数据库。
  • 如果你只想要 7 条记录,为什么不限制 7 条呢?然后获取行并输出您想要的值。
  • 每页7页
  • 问题是你构建你的代码期望:1)每页固定数量的项目和2)它总是有那么多条目。但是,如果在您的 for loop 中,“循环终止测试”包含 and more data rows 测试,那么您的代码将需要进行微小的更改并正常工作。
  • @RyanVincent 您能否在答案中给出一个代码示例,以便我尝试一下?谢谢!

标签: php pdo


【解决方案1】:

要使用 PDO 正确计算行数,您必须这样做 -

$result = $conn->prepare("SELECT * FROM table WHERE id= ?");
$result->execute(array($id));    
$rows = $result->fetch(PDO::FETCH_NUM);
echo $rows[0];

但如果您只想获得静态数量的结果,最好在查询中使用LIMIT

除了你让你的循环过于复杂,没有必要测试 for 条件中的范围只需设置静态数字除非你正在做一些奇怪的事情,比如可能是分页。

【讨论】:

  • 是的,分页是目标,因此循环中的
  • 在这里使用带有偏移量的LIMIT 仍然更好。
  • mysql 手册说[LIMIT {[offset,] row_count | row_count OFFSET offset}] 这意味着你可以为你的限制指定一个偏移量(例如我会使用LIMIT 7 OFFSET 7*$numpage 当然参数化到一个准备好的语句中。)
  • @STTLCU 你能把它放到我给我的例子中吗?干杯!
【解决方案2】:

你可以这样试试:

$result = $conn->prepare("SELECT * FROM table WHERE id= ?");
$result->execute(array($id));
$loop_rows = $result->fetchAll();
$loop_count = count($loop_rows);

for($row=0;$row<7 && $loop_count-->0;$row++)
{
    // Get next row
    echo $loop_rows[$row]['field'];
}

【讨论】:

    【解决方案3】:

    根据 OP 的要求,这里有一个使用 LIMIT 和 OFFSET 用于分页目的的 PDO 准备语句示例。请注意,我更喜欢使用 bindValue() 而不是将参数传递给 execute(),但这是个人喜好。

    $pagesize = 7; //put this into a configuration file
    $pagenumber = 3; // NOTE: ZERO BASED. First page is nr. 0. 
                     //You get this from the $_REQUEST (aka: GET or POST)
    $result = $conn->prepare("SELECT * 
                              FROM table 
                              WHERE id= :id 
                              LIMIT :pagesize 
                              OFFSET :offset");
    $result->bindValue(':id', $id);
    $result->bindValue(':pagesize', $pagesize);
    $result->bindValue(':offset', $pagesize * $pagenumber);
    $result->execute();    
    $rows = $result->fetchAll(PDO::FETCH_ASSOC);
    

    这为您提供了完整的行结果集,仅限于您所需的页面。当然,您需要另一个查询来计算总行数。

    【讨论】:

      【解决方案4】:

      你可以尝试的是:

          //Get your page number for example 2
          $pagenum = 2;
      
          //Calculate the offset
          $offset = 7 * $pagenum; 
      
          //Create array     
          $data = array();
      
          $result = $conn->prepare("SELECT * FROM table WHERE id= ? LIMIT 7 OFFSET ?");
          $result->bind_param("ii", $id,$offset);
          $result->execute();
      
          $resultSet = $result->get_result();
          while ($item = $resultSet->fetch_assoc())
          {
              $data[] = $item;
          }
      
          $result->close();
      
          //echo resultSet you want
          var_dump($data);
      

      【讨论】:

      • OP 正在尝试转换为 PDO 而不是 mysqli 语句。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多