Microsoft® ODBC Driver 11 для SQL Server® на RedHat Linux с PHP – дает ошибку, когда параметр привязки с PDO для хранимых процедур

Без каких-либо параметров он будет работать нормально, но когда есть параметры, появляется следующая ошибка:

SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 8018 [Microsoft] [драйвер ODBC 11 для SQL Server] [SQL Server] Недопустимый параметр 4 (''): Тип данных 0x23 – это устаревший большой объект или LOB, но отмечен как выходной параметр. Устаревшие типы не поддерживаются в качестве выходных параметров. Используйте текущий большой объект t (SQLExecute [8018] в /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)

Это работает на Centos 6, ODBC Driver 11 для SQL Server® – RedHat Linux, unixODBC-2.3.0, MSSQL Server 2008 R2

Строка подключения:

$con = new PDO("odbc:dsnName", 'sa','saa'); $con->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $con->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC); 

Используемая хранимая процедура:

  $stmt = $con->prepare( "SET NOCOUNT ON DECLARE @return_value int EXEC @return_value = [sp_insert_into_t_contact_test] @paravalue = ? SELECT 'returnV' = @return_value"); $stmt->bindParam(1, $v1 = 5, PDO::PARAM_STR, 100); $stmt->execute(); $return =$stmt->fetch(); echo $return['returnV']; 

Простая хранимая процедура для возврата «123»

  [dbo].[sp_insert_into_t_contact_test] @paravalue varchar(100) AS return 123 

Дополнительная информация –

Файл odbc.ini –

  [dsnName] Driver=SQL Server Native Client 11.0 Description=My Sample ODBC Database Connection Trace=Yes Server=192.168.2.60 Port=1433 Database=NSCDB_3 

odbcinst.ini

  [SQL Server Native Client 11.0] Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1 

Наконец, я нашел решение для этого, драйвер Microsoft разработан для приложений C или C ++, а привязка параметров PDO не работает должным образом. Если вы передаете параметры без использования PDO, все будет работать так, как ожидалось. Замените на @paravalue = N'".$v1."'

Пример для примера – нормальное связывание параметров – SQLBindParameter параметра PDO SQLBindParameter$stmt->bindParam(1, $v1 = 5, PDO::PARAM_STR, 100);

Исправленный фрагмент трески:

  $stmt = $con->prepare( "SET NOCOUNT ON DECLARE @return_value int EXEC @return_value = [sp_insert_into_t_contact_test] @paravalue = N'".$v1."' SELECT 'returnV' = @return_value"); $stmt->execute(); $return =$stmt->fetch(); echo $return['returnV'];