Итак, у нас есть новый сервер с
Это 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 не выдает никаких предупреждений или ошибок.
Я действительно не знаю, что здесь происходит.
По состоянию на: ссылка (PHP BUG SITE)
Это поведение MSSQL (TDS), DBLIB и FreeTDS. Одно утверждение
за правило соединения. Если вы инициируете другое утверждение, предыдущий
Заявление отменено.Предыдущие версии буферизовали весь набор результатов в памяти
ошибки OOM на больших наборах результатов.
Таким образом, кажется, что предыдущие версии PHP (5.3 и предыдущие) не соответствовали поведению TDS.
Тогда нам нужно провести рефакторинг кода.
Других решений пока нет …