2016-06-24 2 views
8

Я в процессе преобразования PHP-приложения из среды Windows в среду на основе Linux.PDO dblib nextRowset не работает

Он использует PDO для запуска хранимых процедур в базе данных Microsoft SQL Server.

Итак, я установил и настроил PHP 5.6.22, Apache, freetds и pdo dblib для облегчения приложения.

Выполнение большинства хранимых процедур отлично работает. Кроме тех, которые возвращают несколько наборов строк.

Когда я называю $pdo->nextRowset(), я получаю эту фатальную ошибку:

SQLSTATE[HY000]: General error: PDO_DBLIB: dbresults() returned FAIL 

Единственная ссылка, которую я могу найти, чтобы это была ошибка, сообщили в PHP 5.6.9, которая была исправлена.

Однако, я получаю ту же проблему в PHP 5.6.22.

Есть ли у кого-нибудь идеи, почему это происходит и как я могу это решить?

+0

Возможно, вы вернете более подробную ошибку, чем сбой, изменив настройку в 'php.ini' для многословности ошибок (извините, не трогали PHP за годы или я бы более конкретно). Если мы сможем получить фактическую ошибку FreeTDS, чтобы пузыриться на поверхности, это было бы намного легче диагностировать, так как вы, вероятно, замените драйвер SQL Server на Windows для FreeTDS в Linux. – FlipperPA

+0

PHP находится на высокой частоте и только показывает сообщение об ошибке в моем вопросе. – Jamesking56

+0

Просто проверьте, выполнили ли вы процедуру через fetchall? – Ctc

ответ

0

У меня была такая же проблема с PDO::nextRowset(), так как он возвращает true, даже больше нет доступных номеров, поэтому при вызове fetchAll() он вызывает исключение HY000.

Вы можете проделать простой трюк, проверив количество столбцов методом PDO::columnCount() перед тем, как выбрать набор строк. Если он отличен от нуля, у вас есть допустимый набор строк, и вы можете позвонить PDO::fetchAll().

Даже если PDO::nextRowset() сообщает об истинности, columnCount() сообщит количество столбцов, прежде чем перейти к следующему набору строк.

while ($pdo->columnCount()) { 
    $data[] = $pdo->fetchAll(PDO::FETCH_ASSOC); //or, $pdo->fetchAll() 
    $pdo->nextRowset(); 
} 

Кроме того, рекомендуется, чтобы все операции PDO в блоке Ьгу, в противном случае вы можете получить необработанное исключение.

3

Выбираете данные с PDO::fetch или PDO::fetchAll? Потому что, если вы используете метод «выборки» и не доходите до конца строк, PDO::nextRowset() потерпит неудачу (я не знаю, почему, это просто случилось со мной).

Итак, у меня работает в силы для сканирования всех строкдо PDO::fetch возвращает ложные, то PDO::nextRowset() будет выполняться в обычном режиме.

Это означает, что если у вас есть только одна строка в наборе строк, вы должны вызвать не менее двух раз PDO::fetch (1 для получения данных и 1 для возврата false), а затем перейти к следующему набору строк.

+0

Было бы неплохо, если бы это мусорное поведение было зарегистрировано где-то, например, на странице руководства для PDO :: nextRowset(). –

+0

Да, было бы очень приятно ... Я потратил часы на это поведение, пока не нашел эту «проблему» (или функцию ..) –

Смежные вопросы