重置 PDO 结果中的数组指针

2022-08-30 17:10:14

我在从MySQL SELECT方法移动到PDO方法时遇到问题。我想循环访问两次获取的数组,两次都从行零开始。在MySQL中,我会使用:

mysql_data_seek($result,0);

使用PDO方法,我不确定如何完成同样的事情。下面的代码是我尝试如何执行此操作的。第一个 while 循环工作正常,但第二个 while 循环不返回任何内容。

$pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();

while($row = $stmt->fetch())
{
    //do something starting with row[0]
}
while($row = $stmt->fetch())
{
    //do something else starting with row[0]
}

答案 1

将结果保存到数组,然后循环该数组两次。

$pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC');
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();

$rows = $stmt->fetchAll();

foreach ($rows as $r) {
    // first run
}

foreach ($rows as $r) {
    // seconds run
}

答案 2

根据php手册,你可以多次发出查询,如果你使用PDO::p repare()准备一个PDOStatement对象,你可以发出对PDOStatement::execute()的多次调用的语句。所以你的代码会看起来像这样。

$stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC');
$stmt->setFetchMode(PDO::FETCH_ASSOC);

//First execute
$stmt->execute();
while($row = $stmt->fetch())
{
    //do something starting with row[0]
}

//Second execute
$stmt->execute();
while($row = $stmt->fetch())
{
    //do something else starting with row[0]
}

来源:http://php.net/manual/en/pdo.query.php


推荐