Преобразование PHP в цикл для использования PDO

В настоящее время я обновляю свое приложение, переключаясь на PDO. У меня есть следующий код:

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

Параметр var $ productidLst равен 1,2 после указанного выше кода, который я хотел бы использовать эквивалент PDO:

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

Я пробовал множество комбинаций, но не был успешным, поэтому любая помощь с этим была бы оценена (во втором блоке кода $ res был sql). Во-вторых, я задал параметр $ productidLst для INT, это правильно или это строка?

——————– ОБНОВЛЕНИЕ 1 —————————- ————————

Я пробовал следующий код:

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

Который возвращает: неверный аргумент, предоставленный для ошибки foreach ()

Стандартная документация в руководстве по PHP обычно очень полезна. Пример выполнения цикла for с PDO в руководстве 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"; } } 

С некоторыми изменениями можно привести пример использования подготовленного оператора.

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

Вы можете также использовать цикл while и PDOStatement::fetch для получения каждой строки.

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

Руководство по PHP остается весьма полезным при предоставлении всей необходимой информации для создания последних двух версий.

Объяснение последней версии: предполагается, что $conn является допустимым объектом PDO. $conn->prepare($sql) возвращает объект PDOStatement случае успеха, false при ошибке или исключение, основанное на обработке ошибок. Итак, при условии успеха мы хотели бы получить данные от объекта. Мы можем использовать $query->fetch() в цикле или $query->fetchAll() чтобы получить данные, зависящие от вашего приложения. Передача в константе класса PDO::FETCH_ASSOC вернет, как вы догадались, ассоциативный массив данных.

Функционально реализация foreach и while эквивалентна. Концептуально, foreach более уместен, поскольку цикл while имеет коннотации цикла, пока выполняется статическое условие, тогда как foreach петли над элементами коллекции. Прочитайте « Различия между циклом while и циклом for в PHP? » Для части истории.

Обязательно прочитайте ссылку php.net на PDO

Вы должны использовать PDOStatement::fetch() для извлечения строки. Он извлекает (по умолчанию) как численно, так и ассоциативно. Вы можете это изменить.

С кодом:

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

Справочное руководство .