2011-08-12 42 views
7

Tôi hiện đang cập nhật ứng dụng của mình bằng cách chuyển sang PDO. Tôi có đoạn mã sau:Chuyển đổi PHP khi vòng lặp để sử dụng PDO

$stmt = $db->prepare("select * from `product` where productid in (:productidLst)"); 
$stmt->bindParam(":productidLst",$productidLst, PDO::PARAM_INT); 
$stmt->execute(); 

Các var $ productidLst là 1,2 sau khi mã trên, chúng tôi muốn sử dụng tương đương với PDO điều này:

while($rs=mysql_fetch_assoc($res)){ 
    $rs['qty']=$_SESSION['basket'][$rs['productid']]; 
    $rs['total'] += $rs['qty']*$rs['price']; 
    $total += $rs['total']; 
    $a[] = $rs; 
} 

Tôi đã cố gắng rất nhiều nhưng không kết hợp đã thành công nên bất kỳ trợ giúp nào với điều này sẽ được đánh giá cao (trong khối mã thứ 2 là $ res là sql). Thứ hai tôi đã đặt tham số $ productidLst thành INT là đúng hay nó nên là một chuỗi?

-------------------- CẬP NHẬT 1 ------------------------ ----------------------------

tôi đã thử đoạn mã sau:

$stmt = $db->prepare("select * from `product` where productid in (:productidLst)"); 
foreach ($stmt->execute(array(':productidLst' => $productidLst)) as $row) 
{ 
    $total += $row['total']; 
} 

nào trả về: không hợp lệ đối số được cung cấp cho lỗi foreach()

+1

Tại thời điểm này, bạn không thể ràng buộc [giá trị danh sách thành thông số truy vấn] (http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to- an-in-condition). – outis

+2

+1 để chuyển sang PDO :) –

+0

'PDOStatement :: execute()' trả về một boolean không phù hợp để sử dụng trong 'foreach' – Phil

Trả lời

15

Tài liệu chuẩn trong hướng dẫn sử dụng PHP thường khá hữu ích. Có một ví dụ về việc thực hiện một vòng lặp for với PDO trong hướng dẫn sử dụng PHP, PDO Details.

function getFruit($conn) { 
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name'; 
    foreach ($conn->query($sql) as $row) { 
     print $row['name'] . "\t"; 
     print $row['color'] . "\t"; 
     print $row['calories'] . "\n"; 
    } 
} 

Với một vài thay đổi, ví dụ có thể được thực hiện để sử dụng câu lệnh đã chuẩn bị.

function getFruit($conn) { 
    $query = $conn->prepare('SELECT name, color, calories FROM fruit WHERE kind=:kind ORDER BY name'); 
    $query->execute(array(':kind' => 'drupe')); 
    // alternatively you could use PDOStatement::fetchAll() and get rid of the loop 
    // this is dependent upon the design of your app 
    foreach ($query as $row) { 
     print $row['name'] . "\t"; 
     print $row['color'] . "\t"; 
     print $row['calories'] . "\n"; 
    } 
} 

Bạn cũng có thể sử dụng một vòng lặp whilePDOStatement::fetch để có được mỗi hàng.

function getFruit($conn) { 
    $query = $conn->prepare('SELECT name, color, calories FROM fruit WHERE kind=:kind ORDER BY name'); 
    $query->execute(array(':kind' => 'drupe')); 
    // alternatively you could use PDOStatement::fetchAll() and get rid of the loop 
    // this is dependent upon the design of your app 
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) { 
     print $row['name'] . "\t"; 
     print $row['color'] . "\t"; 
     print $row['calories'] . "\n"; 
    } 
} 

Hướng dẫn sử dụng PHP vẫn hữu ích trong việc cung cấp tất cả thông tin cần thiết để tạo hai phiên bản sau.

Giải thích phiên bản cuối cùng: giả sử $conn là đối tượng PDO hợp lệ. $conn->prepare($sql) trả về đối tượng PDOStatement nếu thành công, false về lỗi HOẶC ngoại lệ dựa trên xử lý lỗi của bạn. Vì vậy, giả sử thành công, chúng tôi muốn thực sự lấy dữ liệu từ đối tượng. Chúng tôi có thể sử dụng $query->fetch() trong vòng lặp hoặc $query->fetchAll() để nhận dữ liệu phụ thuộc vào ứng dụng của bạn. Đi qua lớp hằng số PDO::FETCH_ASSOC sẽ trở lại, bạn đoán nó, một mảng kết hợp dữ liệu.

Chức năng, các triển khai foreachwhile tương đương. Về mặt khái niệm, foreach là phù hợp hơn, vì vòng lặp while có ý nghĩa về vòng lặp trong khi điều kiện tĩnh giữ trong khi các vòng lặp foreach trên các phần tử của bộ sưu tập. Đọc "Differences between a while loop and a for loop in PHP?" cho một phần của câu chuyện.

Hãy chắc chắn để đọc các php.net reference on PDO

+0

Xin cảm ơn vì phản hồi, Tôi vẫn đang vật lộn, tôi tiếp tục nhận được: Không hợp lệ đối số được cung cấp cho foreach() :. Vui lòng xem bài đăng gốc trong phần cập nhật 1 cho mã mà tôi đang sử dụng. (Lưu ý tôi hơi đơn giản hóa mã trong vòng lặp while để dễ đọc) – Dino

+0

@Charles: bản cập nhật thế nào? – outis

+0

@outis Tôi chỉ chỉnh sửa bản thân mình với các thay đổi mã thích hợp và giải thích. – cspray

1

Bạn nên sử dụng PDOStatement::fetch() để lấy hàng. Nó tìm nạp (theo mặc định) cả về mặt số và liên kết. Bạn cũng có thể thay đổi điều đó.

Với mã của bạn:

while($rs=$stmt->fetch()){ 
    $rs['qty']=$_SESSION['basket'][$rs['productid']]; 
    $rs['total'] += $rs['qty']*$rs['price']; 
    $total += $rs['total']; 
    $a[] = $rs; 
} 

Manual Reference.

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