重置PDO结果中的数组指针

use*_*866 19 php mysql mysqli

我无法从mysql SELECT方法转移到PDO方法.我想迭代两次获取的数组,两次从第0行开始.在mysql中我会使用:

mysql_data_seek($result,0);
Run Code Online (Sandbox Code Playgroud)

使用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]
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Mar*_*lln 25

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

$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
}
Run Code Online (Sandbox Code Playgroud)

  • 在处理大型结果集时,这不是一个好主意。所有数据将存储在数组中。 (2认同)

Ced*_*iga 6

根据php手册,也可以多次发出查询,如果使用PDO :: prepare()准备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]
}
Run Code Online (Sandbox Code Playgroud)

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