Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在MYSQL PDO中不使用FETCHALL获取2次_Php_Mysql_Pdo_While Loop_Fetch - Fatal编程技术网

Php 如何在MYSQL PDO中不使用FETCHALL获取2次

Php 如何在MYSQL PDO中不使用FETCHALL获取2次,php,mysql,pdo,while-loop,fetch,Php,Mysql,Pdo,While Loop,Fetch,我有一个示例查询: $STH = $DBH->query("SELECT id FROM table"); 我想获取第一行,然后循环并显示所有行。因此,我使用以下方法获得第一行: $STH->setFetchMode(PDO::FETCH_ASSOC); $first_row = $STH->fetch(); $first_row = $first_row['id']; 我使用while循环再次显示所有行: while ($list = $STH->fetch())

我有一个示例查询:

$STH = $DBH->query("SELECT id FROM table");
我想获取第一行,然后循环并显示所有行。因此,我使用以下方法获得第一行:

$STH->setFetchMode(PDO::FETCH_ASSOC);
$first_row = $STH->fetch();
$first_row = $first_row['id'];
我使用while循环再次显示所有行:

while ($list = $STH->fetch()) {      
$id = $list['id'];
echo $id;
}
现在while跳过第一行,我希望显示它。是否有一个与mysql\u data\u seek等效的方法将指针重新设置到第一行?我知道可以使用
fetchall
,但它的内存不好,而且浪费资源。我也可以运行查询并将其限制为1,但不建议这样做,因为我有一个连接多个表的查询,而且速度非常慢。还有其他解决办法吗


谢谢

你能用一个
do…while
循环来代替吗

$STH->setFetchMode(PDO::FETCH_ASSOC);
$list = $STH->fetch();
$first_id = $list['id'];

do {
  $id = $list['id'];
  echo $id;
} while ($list = $STH->fetch());

您可以获取所有结果,然后将其作为数组处理。因此,例如,您可以将第一个结果从前面移开,然后在任何其他行上循环:

<?php

$sql = "YOUR QUERY";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// get first row
$firstRow = array_shift($rows);

// loop over remaining rows
foreach ($rows as $row) {
    // do something
}

我收回这句话,看起来您可以使用光标方向控件来选择结果。。。示例代码即将发布。。。我没有试过这个,所以你可能需要玩一点。这也是基于这样的假设,即a
PDO::FETCH_ORI_FIRST
的作用类似于数据搜索,并将光标留在第一个位置,而不是返回到之前的位置

$stmt = $pdo->prepare('SELECT id FROM table', array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();

$first = $pdo->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_FIRST);
$first_row = $first['id'];

// other stuff

// first iteration we rewind to the first record;
$cursor = PDO::FETCH_ORI_FIRST;

while (false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC, $cursor))) {
   $id = $row['id'];
   // successive iterations we hit the "next" record
   $cursor = PDO::FETCH_ORI_NEXT; 
   echo $id;
}

我认为你不能倒带一份声明。。。假设这些块没有被一堆中间逻辑id隔离,只需在循环中执行即可

$STH->setFetchMode(PDO::FETCH_COLUMN); // no need to pull an array
$count = 0;
while ($id = $STH->fetch()) {      
  if($count === 0) {
   $first_row = $id;
  }
  echo $id;
  $count++;
}

我想他特别想要一个避免使用
fetchall
的答案,但是fetchall会浪费别人的记忆……谢谢:)@MichaelSamuel为什么?你有没有用基准测试的方式证明
fetchAll()
是“内存不足”和“浪费”的,或者你只是在继续你在别处读到的东西?我想一个
fetchAll()
比多个
fetch()好
s.没有亲自测试过它,但是这里的很多人报告说使用它时出现了内存问题,不能说我在3年多的时间里遇到了问题。我需要它在一个数组中才能使用所有的行,我还需要在使用前显示第一行,以便将其用于其他用途……谢谢:)这只是一个简单的查询,用于解释问题..查询比这大得多。提取循环中的下一行不会比提取所有行更会导致性能问题吗?这会导致性能问题吗?这基本上就是它通常做的。。。使用可滚动光标可能会稍微增加一些开销,但其开销可能可以忽略不计。在需要计算或查找过去的一组记录时,使用相对或绝对抓取可能会有问题,但即使这样,可能也不会太多,因为我认为所有这些都是在
C
端完成的。你为什么不试试看呢?由于到目前为止,您的答案都是关于完成您需要完成的任务的唯一方法,而且它们都有权衡……感谢@prodigitalson的帮助:)我将尝试另一种方法,即单独回显第一行,然后回显while结果……这种方法将把所有结果放在一起……第一个结果和所有结果其他..这不也有效吗?出于某种原因,这忽略了查询中的ORDER BY…谢谢:)@Michael-真的吗?我不知道这会对查询中的
排序产生什么影响……也不知道为什么会发生这种情况……我按desc排序,但现在它显示为升序