Я использую следующие настройки для доступа к базе данных MS-SQL из PHP приложенияИспользуя набранные связанные параметры с PHP PDO-ODBC, UnixODBC и FreeTDS
- RedHat Enterprise Linux 5
- PHP 5.2. 14 с ПДО и PDO_ODBC
- UnixODBC 2.2.11
- FreeTDS 0.82.1.dev.20100810
Unparametrized запросы работают отлично. Единственная проблема заключается в том, чтобы закрыть курсор на отдельных операторах результата (с помощью PDOStatment :: closeCursor), чтобы избежать ошибок «0 [FreeTDS] [SQL Server]« Неверное состояние курсора (SQLSTATE = 24000) ».
Но у меня проблема с типизированным параметром. При использовании такого кода:
$stmt = $PDO->prepare('INSERT INTO table (column1, column2) VALUES (:foo, :bar');
$stmt->bindValue(':foo', 21, PDO::PARAM_INT);
$stmt->bindValue(':bar', 42, PDO::PARAM_INT);
$stmt->execute():
if (!$stmt->execute()) {
var_dump($stmt->errorInfo();
}
Если оба столбца INT. Я получаю столкновение типа Операнда «206 [FreeTDS] [SQL Server]: текст несовместим с ошибкой int [SQLSTATE = 22018]».
В журнале UnixODBC, я получаю что-то вроде
[ODBC][26251][SQLDescribeParam.c][175]
Entry:
Statement = 0x2b73c849fb80
Parameter Number = 1
SQL Type = 0x7fff9c89e15e
Param Def = 0x7fff9c89e154
Scale = 0x7fff9c89e15c
Nullable = 0x7fff9c89e15a
[ODBC][26251][SQLDescribeParam.c][276]Error: IM001
[ODBC][26251][SQLBindParameter.c][193]
Entry:
Statement = 0x2b73c849fb80
Param Number = 1
Param Type = 1
C Type = 1 SQL_C_CHAR
SQL Type = -1 SQL_LONGVARCHAR
Col Def = 4000
Scale = 5
Rgb Value = 0x2b73c941f890
Value Max = 0
StrLen Or Ind = 0x2b73c93fa1b0
[ODBC][26251][SQLBindParameter.c][339]
Exit:[SQL_SUCCESS]
Моего понимания журнала является то, что UnixODBC пытается связать параметры с помощью правильного типа. Но FreeTDS не поддерживает функцию (IM001 «Driver не поддерживает эту функцию»). Таким образом, unixODBC продолжается без правильного ввода.
Может кто-нибудь подтвердить этот диагноз или, лучше, известную проблему с типизированным связанным параметром в FreeTDS? Если да, они работают с использованием PHP PDO и hwo, я могу настроить его?
Пока кто-то не сможет дать вам реальное (конкретное) решение, вы можете попробовать '$ PDO-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, true);' как обходной путь, чтобы вы могли хотя бы продолжить разработку ;-) – VolkerK
Печально , при использовании $ PDO-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, true) я получаю еще одну приятную ошибку: «SQLSTATE [IM001]: драйвер не поддерживает эту функцию: драйвер не поддерживает атрибуты установки». –