2016-02-18 2 views
1

У меня есть проект PHP, работающий на моем Gentoo Linux, который использует FreeTDS & UnixODBC для подключения к базе данных MSSQL на сервере Windows. У меня был этот проект, работающий с этим точным кодом уже много лет, но недавно мне пришлось обновлять PHP, когда Gentoo больше не имел ebuild версии 5.3 в portage и других системных обновлениях.Контекст типа ODBC_CONNECT конфликтует с SQLGetData в PHP с помощью freeTDS и unixODBC

текущей версии различного программного обеспечения используется в:
PHP является версией 5.6.17
FreeTDS является версией 0,91
UnixODBC является версия 2.3.2-r1

Но теперь некоторые из те же самые запросы, которые отлично работают, возвращают эту ошибку.

PHP Warning: odbc_fetch_object(): SQL error: [unixODBC][Driver Manager]SQLGetData is not allowed on a forward only (non-buffered) cursor, SQL state SL008 in SQLGetData in /home/XXXXX/XXXX.php on line Y

Не все запросы возвращают эту ошибку, только некоторые, но одни и те же запросы последовательно возвращают ту же ошибку.

Простой PHP программа, которая будет возвращать эту ошибку следующим образом:

$con = odbc_connect(DBNAME,UNAME,PW,SQL_CUR_USE_ODBC) 
$query = "SELECT * FROM SomeTable" 
$Output = odbc_exec($con,$query); 
$return_array = array(); 
while($row = odbc_fetch_object($Output)){ 
# 
     foreach($row as &$value){ 
       $value = mb_convert_encoding($value, "UTF-8", "Windows-1252"); 
     } 
     unset($value); 
     $return_array[] = $row; 
} 
echo json_encode($return_array,JSON_UNESCAPED_UNICODE); 
odbc_close($con); 
?> 

Теперь это, безусловно, связано с 4-го параметра, подаваемого odbc_connect при использовании SQL_CUR_USE_ODBC, ошибка, как я сказал, выше. При этом изменяется на SQL_CUR_USE_IF_NEEDED возвращает ошибку:

Warning: odbc_fetch_object(): No tuples available at this result index in /home/XXXXX/XXXX.php on line Y []

С одинаковым результатом в течение SQL_CUR_USE_DRIVER, или если он остается пустым.

Опять же, два дня назад это был весь функциональный код по всем запросам. Так что что-то изменилось с PHP 5.3 на любую версию php> 5.3. Каждая версия PHP была проверена с 5.4 до 7.0 (в portage есть ebuild PHP 7), и все они вызывают те же ошибки.

Любая помощь или направление в этом вопросе были бы весьма полезными.

+0

Я знаю, что это год, но я вижу то же самое с очень похожей конфигурацией, и заметил, что только когда выбран текстовый тип данных, и данные все еще выбраны, но есть php WARNING для каждый вызов 'odbc_result' в столбце« Тип данных ». Вы когда-нибудь находили более постоянное решение для предупреждений? –

+0

Я на самом деле никогда особо не делал. Я как бы забыл об этом вопросе честно. Я чувствую, что я должен был просто переключить версии PHP! Но я приветствую всех, кто знает, что происходит с этим, давая понять всем остальным! – dynamphorous

ответ

0

После тщательного тестирования решение этой проблемы состояло в том, чтобы заметить, что это только предупреждения, а не ошибки. Их нужно было бросить, но затем также выполнить SQL.

Однако некоторые сбои в одной из этих библиотек ODBC или TDS вызывают предупреждения для предотвращения выполнения SQL. Это не БОЛЬШОЕ решение, но в том числе SET ANSI_WARNINGS OFF в начале запроса отключает предупреждения, и теперь код выполняется точно так же, как и раньше.

$query = 'SET ANSI_WARNINGS OFF 
      SELECT * FROM SomeTable'; 

Эта строка запроса выглядит как сейчас. Не идеальный, но он работает.

2

Первым основным намеком, который я обнаружил, было то, что это произошло только тогда, когда мы сделали SELECT с текстовым столбцом вместе с другими столбцами. Использование SELECT в текстовом столбце само по себе не вызывало ошибки. И выбор каждого другого столбца, за исключением текстового столбца, не выдавал ошибку. Мы только что перешли с SQL Server 2000 на 2008, поэтому я был более чем готов попробовать VARCHAR (MAX) в пользу текстового столбца, который мы должны были использовать в 2000 году.

ALTER TABLE tbl_name ALTER COLUMN col_name VARCHAR(MAX) [NOT] NULL исправлено все эти сообщения об ошибках для нас. Он передает VARCHAR (MAX) просто отлично, даже если было возвращено несколько КБ текста. Старая реализация Text оставила размер столбца в 2 ГБ, поэтому я предполагаю, что FreeTSD 0.91 имеет ограничение по размеру.

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