estoy usando la siguiente configuración para acceder a una base de datos MS-SQL desde una aplicación PHPEl uso de parámetros con destino mecanografiadas con PHP DOP-ODBC, unixODBC y FreeTDS
- RedHat Enterprise Linux 5
- PHP 5.2. 14 con DOP y PDO_ODBC
- unixODBC 2.2.11
- FreeTDS 0.82.1.dev.20100810
consultas Unparametrized funcionan bien. El único problema es forzarlo a cerrar el cursor en sentencias de resultados individuales (con PDOStatment :: closeCursor) para evitar los errores "0 [FreeTDS] [SQL Server] Estado del cursor no válido (SQLSTATE = 24000)".
Pero estoy teniendo un problema importante con el parámetro vinculado escrito. Al usar código como este:
$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();
}
Donde ambas columnas son INT. Obtengo el tipo "206 [FreeTDS] [SQL Server] Choque del tipo de operando: el texto no es compatible con el error int [SQLSTATE = 22018]".
En el registro de unixODBC, me sale algo así como
[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]
Mi comprensión del registro es que unixODBC está tratando de obligar a los parámetros utilizando el tipo correcto. Pero el FreeTDS no admite la función (IM001 es 'El controlador no admite esta función'). Entonces unixODBC continúa sin tipear correctamente.
¿Alguien puede confirmar este diagnóstico o, mejor, un problema conocido con el parámetro enlazado escrito en FreeTDS? En caso afirmativo, ¿funcionan con PHP PDO y puedo configurarlo?
Hasta que alguien pueda darle una solución real (específica), puede intentar '$ PDO-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, true);' como solución alternativa para que al menos pueda continuar desarrollando ;-) – VolkerK
Lamentablemente , cuando uso $ PDO-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, true), aparece otro bonito error: "SQLSTATE [IM001]: el controlador no admite esta función: el controlador no admite atributos de configuración". –