2011-08-12 13 views
7

Aktualnie aktualizuję aplikację, przełączając się na PDO. Mam następujący kod:Konwersja PHP przy użyciu pętli do korzystania z PDO

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

var $ productidLst jest 1,2 po powyższym kodzie Chciałbym skorzystać z PDO odpowiednik tego:

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

próbowałem liczne kombinacje, ale nie odniosło sukces, więc każda pomoc w tym zakresie byłaby doceniona (w drugim bloku kodu $ res był sql). Po drugie ustawiłem parametr $ productidLst na INT, czy jest to poprawne czy powinno być ciągiem?

-------------------- AKTUALIZACJA 1 ------------------------ ----------------------------

próbowałem następujący kod:

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

która zwraca: Nieprawidłowy argument dostarczony dla foreach() błąd

+1

W tym momencie nie można powiązać [wartości listy z parametrem zapytania] (http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to- an-in-condition). – outis

+2

+1 za przejście do PDO :) –

+0

'PDOStatement :: execute()' zwraca wartość logiczną, która nie jest odpowiednia do użycia w 'foreach' – Phil

Odpowiedz

15

Standardowa dokumentacja w podręczniku PHP jest zazwyczaj bardzo pomocna. Istnieje przykład wykonania pętli for z PDO w podręczniku 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"; 
    } 
} 

Po wprowadzeniu kilku zmian można posłużyć się przykładowym przygotowanym wyciągiem.

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"; 
    } 
} 

Można również użyć while pętlę i PDOStatement::fetch aby każdy wiersz.

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"; 
    } 
} 

Podręcznik PHP pozostaje bardzo pomocny w dostarczaniu wszystkich informacji niezbędnych do utworzenia dwóch ostatnich wersji.

Wyjaśnienie ostatniej wersji: zakładając, że $conn jest prawidłowym obiektem PDO. $conn->prepare($sql) zwraca obiekt PDOStatement po pomyślnym wykonaniu, false po niepowodzeniu LUB wyjątek oparty na obsłudze błędów. Zakładając sukces, chcielibyśmy uzyskać dane z obiektu. Możemy użyć $query->fetch() w pętli lub $query->fetchAll(), aby dane były zależne od Twojej aplikacji. Przejście w stałej klasy PDO::FETCH_ASSOC zwróci, jak się domyślacie, asocjacyjną tablicę danych.

Funkcjonalnie implementacje foreach i while są równoważne. Koncepcyjnie bardziej odpowiednie jest ustawienie foreach, ponieważ pętla while ma konotacje pętli, podczas gdy statyczny warunek zachowuje się, natomiast pętle nad elementami kolekcji. Przeczytaj "Differences between a while loop and a for loop in PHP?" dla części historii.

Koniecznie przeczytać php.net reference on PDO

+0

Cześć dzięki za odpowiedzi, Nadal walczę, ciągle otrzymuję: Nieważne argument dostarczony dla foreach() :. Zobacz orginalny wpis w dziale aktualizacja 1 dla kodu, którego używam. (Uwaga: Uproszczono nieco kod w pętli while w celu ułatwienia czytania) – Dino

+0

@Charles: jak aktualizacja? – outis

+0

@outis Właśnie edytowałem to sam z odpowiednimi zmianami kodu i wyjaśnieniem. – cspray

1

należy używać PDOStatement::fetch() aby pobrać wiersz. Pobiera (domyślnie) zarówno numerycznie, jak i asocjacyjnie. Możesz to również zmienić.

z kodem:

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

Manual Reference.

Powiązane problemy