Конвертировать PHP в то время как цикл использовать PDO - PullRequest
7 голосов
/ 12 августа 2011

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

Я пыталсяМногочисленные комбинации, но не увенчались успехом, поэтому любая помощь в этом была бы признательна (во 2-м блоке кода $ 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 () error

Ответы [ 2 ]

16 голосов
/ 12 августа 2011

Стандартная документация в руководстве по PHP обычно довольно полезна. В руководстве по PHP приведен пример выполнения цикла for с PDO: Подробности PDO .

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

1 голос
/ 13 августа 2011

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

С вашим кодом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...