Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

'PDOException' con messaggio 'SQLSTATE[22001]:dati stringa, troncati a destra:0

Purtroppo,

È un PDO_ODBC Problema di incompatibilità a 64 bit (#61777 , #64824 ) e senza dubbio sei su una build a 64 bit che non ti permette di associare parametri.

Fortunatamente,

Ha una patch che è stato incluso per la prima volta nella versione 5.6:

Cosa c'è che non va nel PDO_ODBC spedito del tuo PHP ?

Osservando una di quelle patch consigliate:

diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c
index 8b0ccf3..1d275cd 100644
--- a/ext/pdo_odbc/odbc_stmt.c
+++ b/ext/pdo_odbc/odbc_stmt.c
@@ -551,7 +551,7 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
    struct pdo_column_data *col = &stmt->columns[colno];
    RETCODE rc;
    SWORD   colnamelen;
-   SDWORD  colsize;
+   SQLULEN colsize;
    SQLLEN displaysize;

Vediamo che l'unica cosa che è cambiata è SDWORD (intero con segno a 16 bit) che viene sostituito con il nuovo tipo ODBC SQLULEN ovvero 64 bit in un'applicazione ODBC a 64 bit e 32 bit in un'applicazione ODBC a 32 bit .

Credo che il committente non fosse a conoscenza di colsize tipo di dati solo poiché nella riga successiva SQLLEN è definito correttamente.

Cosa devo fare adesso?

  1. Aggiorna alla versione PHP>=5.6
  2. Rimani con odbc_* funziona come una soluzione di lavoro.
  3. Compila un PHP v5.5.9 con le patch fornite.
  4. Costruisci il tuo wrapper PDO come consigliato da @GordonM