2012-02-24 32 views
15

Tôi gặp sự cố khi chuyển từ phương thức SELECT mysql sang phương thức PDO. Tôi muốn lặp qua một mảng được tìm nạp hai lần, cả hai lần bắt đầu bằng hàng số không. Trong mysql, tôi sẽ sử dụng:Đặt lại con trỏ mảng trong kết quả PDO

mysql_data_seek($result,0); 

Sử dụng phương thức PDO, tôi không chắc chắn cách thực hiện tương tự. Mã dưới đây là cách tôi đang cố gắng làm điều này. Vòng lặp đầu tiên hoạt động tốt nhưng vòng lặp thứ hai trong khi không trả về gì cả. Ai đó có thể cho tôi biết tôi đang đi sai không?

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

Cảm ơn sự giúp đỡ của bạn.

Trả lời

23

Lưu kết quả của bạn vào một mảng và sau đó lặp lại mảng đó hai lần.

$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

Wow! Điều đó có vẻ hiển nhiên. Không biết tại sao tôi bị mắc kẹt khi sử dụng vòng lặp while. Cảm ơn cú đá vào đầu! – user1028866

+0

Vì bạn đã bỏ qua [tài liệu] (http://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query). – AnrDaemon

+0

Đây không phải là ý tưởng hay khi làm việc với tập hợp kết quả lớn. Tất cả dữ liệu sẽ được lưu trữ trong mảng. –

2
fetch — Fetches the next row from a result set 

nên khi nó ra khỏi đầu tiên trong khi nó đã đến để yếu tố cuối cùng của ResultSet bạn đó là lý do thứ hai, trong khi lợi nhuận không có gì.

sử dụng fetchAll để lưu trữ tất cả kết quả của bạn, sau đó đi qua chúng.

+0

Cảm ơn mọi người. Nó hoạt động tốt ngay bây giờ. – user1028866

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

Bạn có thể giải thích bằng văn bản trả lời không? –

+0

OP muốn lặp qua một mảng đã tìm nạp hai lần. Tôi chỉ có thể thấy một vòng lặp trong mã của bạn. Vì vậy, trong bao xa là mã của bạn một giải pháp cho vấn đề của OP? – honk

2

đôi khi lưu trữ kết quả của fetchAll() không phải là một tùy chọn. Thay vào đó bạn có thể chỉ cần nhân bản đối tượng pdo trước khi gọi hàm fetchAll() như thế này.

$pdo_copy = clone $pdo; 

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

Bây giờ tôi vẫn có thể sử dụng đối tượng pdo để thực hiện các câu lệnh như fetchObject();

1

Theo hướng dẫn sử dụng php, bạn có thể tạo truy vấn nhiều lần, nếu bạn chuẩn bị đối tượng PDOStatement bằng PDO :: prepare(), bạn có thể đưa ra câu lệnh với nhiều cuộc gọi đến PDOStatement :: execute(). Vì vậy, mã của bạn sẽ trông như thế.

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

nguồn: http://php.net/manual/en/pdo.query.php

+0

Tôi đã cho bạn +1 của tôi, đây là câu trả lời chính xác, chúng tôi không muốn fetchAll() một vài nghìn hàng nhưng câu hỏi là "Đặt lại con trỏ mảng trong kết quả PDO": điều này thực sự đặt lại con trỏ đến hàng đầu tiên, cảm ơn bạn . – Robert

Các vấn đề liên quan