В настоящее время я обновляю свое приложение, переключаясь на 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; }
Справочное руководство .