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
}
我收回这句话,看起来您可以使用光标方向控件来选择结果。。。示例代码即将发布。。。我没有试过这个,所以你可能需要玩一点。这也是基于这样的假设,即aPDO::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排序,但现在它显示为升序