2012-02-24 22 views
15

我無法從mysql SELECT方法移動到PDO方法。我想遍歷一個獲取的數組兩次,兩次從第零行開始。在MySQL中,我會使用:在PDO結果中重置數組指針

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] 
} 

感謝您的幫助。

回答

23

將結果保存到數組,然後循環該數組兩次。

$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 
} 
+0

哇!這似乎很明顯。不知道爲什麼我被困在使用while循環。謝謝你的頭踢! – user1028866 2012-02-24 20:06:10

+0

因爲您忽略了[文檔](http://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query)。 – AnrDaemon 2016-05-31 18:44:14

+0

在處理大型結果集時,這不是個好主意。所有數據將被存儲在數組中。 – 2017-09-27 14:14:24

2
fetch — Fetches the next row from a result set 

所以當它退出第一,同時它已經趕到這是你的resultSet 的最後一個元素,爲什麼第二,而回報什麼。

使用fetchAll存儲所有結果,然後通過它們。

+0

謝謝大家。現在工作正常。 – user1028866 2012-02-24 20:23:47

-3
if($stmt->fetchColumn() >= 0) 
{ 
    $stmt->execute(); //Reset cursor 
    while($rs = $stmt->fetchObject()) 
    { 
     echo "Data: ".$rs->data; 
    } 
} 
else 
{ 
    echo '0'; 
} 
+0

你能解釋答案的文字嗎? – 2014-09-19 17:02:52

+0

OP想要遍歷一個獲取的數組兩次。我只能在代碼中看到一個循環。那麼,您的代碼在多大程度上解決了OP的問題? – honk 2014-09-19 17:04:39

2

有時存儲fetchAll()的結果不是一個選項。相反,你可以在調用fetchAll()之前克隆pdo對象。

$pdo_copy = clone $pdo; 

$num_rows = count($pdo_copy->fetchAll()); 

現在我仍然可以使用pdo對象來執行像fetchObject()這樣的語句;

1

根據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] 
} 

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

+0

我給你我的+1,這是正確的答案,我們不希望fetchAll()有一千行但問題是「重置PDO結果中的數組指針」:這真的會將光標重置爲第一行,謝謝。 – Robert 2017-08-24 20:31:56