PDO dblib over freetds сбрасывает выборку запроса на SQL Server 2000, если в цикле выборки выдается другой запрос

Итак, у нас есть новый сервер с

  • Debian Wheezy 32BIT
  • PHP 5.5.18
  • FreeTDS 0,91

Это PHP-приложение должно общаться со старым сервером SQL Server 2000. Мы использовали старый код с нашего предыдущего сервера (PHP 5.2 и более ранние версии FreeTDS — не могу получить версию).
Мы подключаемся к SQL Server 2000 через PDO, используя драйвер dblib.

У нас странное поведение с функцией извлечения. В основном, если мы выдадим запрос во время цикла выборки для того же объекта подключения pdo, основной запрос будет сброшен, и следующий вызов выборки вернет false, даже если еще есть записи, которые нужно извлечь.

// PSEUDO CODE
// Here the main query
$q = $sql7->query("SELECT TOP 5 * FROM News ORDER BY Data Desc");
while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
// Looping through the results
echo "<h1>Main query</h1>";
print_r($row);

// Issue a query on the same pdo connection
$subq = $sql7->query("SELECT TOP 1 * FROM News WHERE IDNews = " . $row['IDNews'] . " ");
while ($subResult = $subq->fetch(PDO::FETCH_ASSOC)) {
echo "<h1>Inner query</h1>";
print_r($subResult);
}

// Here the main query $q->fetch(PDO::FETCH_ASSOC) will answer false on the next iteration
// if we remove the subq, the main query loops just fine
echo "<hr>";
}

Тот же код на Windows PHP с драйвером pdo_sqlserver работает просто отлично.

Не имеет значения тип выборки, который мы передаем в качестве аргумента функции выборки.

PHP не выдает никаких предупреждений или ошибок.

Я действительно не знаю, что здесь происходит.

5

Решение

По состоянию на: ссылка (PHP BUG SITE)

Это поведение MSSQL (TDS), DBLIB и FreeTDS. Одно утверждение
за правило соединения. Если вы инициируете другое утверждение, предыдущий
Заявление отменено.

Предыдущие версии буферизовали весь набор результатов в памяти
ошибки OOM на больших наборах результатов.

Таким образом, кажется, что предыдущие версии PHP (5.3 и предыдущие) не соответствовали поведению TDS.
Тогда нам нужно провести рефакторинг кода.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]