Использование типизированных связанных параметров с PHP PDO-ODBC, unixODBC и FreeTDS

Я использую следующую настройку для доступа к базе данных MS-SQL из приложения PHP

  • RedHat Enterprise Linux 5
  • PHP 5.2.14 с PDO и PDO_ODBC
  • unixODBC 2.2.11
  • FreeTDS 0.82.1.dev.20100810

Непараметризованные запросы работают нормально. Единственная проблема заключается в принудительном закрытии курсора для отдельных операторов результата (с PDOStatment :: closeCursor), чтобы избежать ошибок «0 [FreeTDS] [SQL Server] Invalid cursor state (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] Operand type clash: text is несовместим с 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 - «Драйвер не поддерживает эту функцию»). Итак, unixODBC продолжит работу без правильного ввода.

Может ли кто-нибудь подтвердить этот диагноз или, лучше сказать, известную проблему с типизированным связанным параметром в FreeTDS? Если да, работают ли они с использованием PHP PDO, и могу ли я его настроить?

6
задан Pierre Buyle 30 September 2010 в 06:13
поделиться