Как получить атрибут [Key] в коде c #, сгенерированном codeDOM

Клиентский протокол MySQL не позволяет выполнять более одного запроса. То есть вы выполнили запрос, и вы получили некоторые результаты, но не все, - тогда вы попытаетесь выполнить второй запрос. Если в первом запросе все еще есть строки для возврата, второй запрос получает ошибку.

Библиотеки клиентов обходятся этим путем выборки всех строк первого запроса неявно при первой выборке, а затем последующие выборки просто перебирают результаты внутри кэширования. Это дает им возможность закрыть курсор (насколько это касается сервера MySQL). Это «буферизованный запрос». Это работает так же, как и с использованием fetchAll (), поскольку оба случая должны выделять достаточно памяти в PHP-клиенте для хранения полного набора результатов.

Разница в том, что буферизованный запрос содержит результат в клиенте MySQL библиотеки, поэтому PHP не может получить доступ к строкам, пока вы не выберете () каждую строку последовательно. В то время как fetchAll () немедленно заполняет массив PHP для всех результатов, позволяя вам получить доступ к любой случайной строке.

Основная причина not использовать fetchAll () заключается в том, что результат может быть слишком большой, чтобы вписаться в ваш PHP memory_limit. Но кажется, что ваши результаты запроса имеют только одну строку, так что это не должно быть проблемой.

Вы можете закрытьCursor (), чтобы «отказаться» от результата, прежде чем вы выберете последнюю строку. Сервер MySQL получает уведомление о том, что он может отменить этот результат на стороне сервера, а затем вы можете выполнить другой запрос. Вы не должны закрыватьCursor (), пока не закончите заданный результирующий набор.

Также: я замечаю, что вы выполняете свой $ stmt2 снова и снова внутри цикла, но он вернет тот же результат каждый раз. По принципу перемещения цикла-инвариантного кода из цикла вы должны выполнить это один раз перед запуском цикла и сохранить результат в переменной PHP. Поэтому, независимо от использования буферизованных запросов или fetchAll (), вам не нужно вставлять ваши запросы.

Поэтому я бы рекомендовал написать ваш код таким образом:

$sql ='SELECT temp_id FROM temp1';
$stmt2 = db::db()->prepare($sql);
$stmt2->execute();
$rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$stmt2->closeCursor();

$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes 
      WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id';
$stmt1 = db::db()->prepare($sql);

foreach($data AS $row)
{
    try
    {
        $stmt1->execute($row);
        $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
        $stmt1->closeCursor();
        syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand());
        syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand());
    }
    catch(PDOException $e){echo(sql_error($e));}            
}

Примечание I также используют именованные параметры вместо позиционных параметров, что упрощает передачу $ row в качестве массива значений параметров. Если ключи массива соответствуют именам параметров, вы можете просто передать массив. В старых версиях PHP вам нужно было включить префикс : в ключи массива, но вам это больше не нужно.

В любом случае вы должны использовать mysqlnd. Он имеет больше возможностей, он более эффективен с точки зрения памяти, а его лицензия совместима с PHP.

0
задан Priya 17 January 2019 в 05:08
поделиться