2012-09-20 12 views
5

Devo spostare un'app dalle funzioni mssql a PDO. Tutto è andato per il meglio fino a quando non mi sono trovato un bel bug che non riesco a risolvere.Errore del server Sql HY104 durante il binding di una stringa vuota a una query preparata con Pdo

Ecco mia richiesta preparato:

$req_action="INSERT INTO [".DB_SCHEMA."].[dbo].[".ACTION_TABLE."] 
([ID_CONTACT] 
,[ID_ADN] 
,[TYPE_ACTION] 
,[MOTIF_ENTRANT] 
,[COMMENTAIRES_APPEL] 
,[CODE_CAMPAGNE] 
,[EMAIL] 
,[SUJET] 
,[STATUT_EMAILING] 
,[DATE_ENVOI] 
,[DELAI_OUVERTURE] 
,[MAIL_CLIENT] 
,[DATE_OUVERTURE] 
,[LIEN_CLIQUE] 
,[DELAI_CLIC] 
,[DATE_CLIC] 
,[DATE_ACTION] 
,[USER_ID] 
,[LOGIN] 
,[DATE_CHARGEMENT] 
) 
VALUES 
('' 
,'' 
,'e-mailing' 
,'' 
,'' 
,'' 
,:email 
,:sujet 
,:statut 
,convert(datetime,:date_envoi,103) 
,:delai 
,:mail 
,convert(datetime,:date_ouverture,103) 
,:lien_clic 
,:delai_clic 
,convert(datetime,:date_clic,103) 
,convert(datetime,:date_action,103) 
,'1' 
,'AUTO' 
,getdate() 
)"; 

e le legature:

$prep_req_action->bindValue(":email",$email,PDO::PARAM_STR); 
$prep_req_action->bindValue(":sujet",$sujet,PDO::PARAM_STR); 
$prep_req_action->bindValue(":statut",$statut_emailing,PDO::PARAM_STR); 
$prep_req_action->bindValue(":date_envoi",$sql_date_envoi,PDO::PARAM_STR); 
$prep_req_action->bindValue(":delai",$delai_ouverture,PDO::PARAM_STR); 
$prep_req_action->bindValue(":mail",$mail_client,PDO::PARAM_STR); 
$prep_req_action->bindValue(":date_ouverture",$sql_date_ouverture,PDO::PARAM_STR); 
$prep_req_action->bindValue(":lien_clic",$lien_clique,PDO::PARAM_STR); 
$prep_req_action->bindValue(":delai_clic",$delai_clic,PDO::PARAM_STR); 
$prep_req_action->bindValue(":date_clic",$sql_date_clic,PDO::PARAM_STR); 
$prep_req_action->bindValue(":date_action",$sql_date_action,PDO::PARAM_STR); 

Il problema è ogni volta che uno dei miei variabile PHP sembra essere una stringa vuota (proveniente da un file csv automatizzato succede in realtà molto) SQL server restituisce un errore HY104 (precisione non valida).

Tutti i miei campi sono autorizzati NULL, quindi ho cambiato l'attributo PDO::ATTR_ORACLE_NULLS in PDO::NULL_EMPTY_STRING per convertire stringhe vuote in NULL ma il comportamento è esattamente lo stesso.

L'unica soluzione che ho trovato è quello di verificare se la mia variabile è vuota di impostarlo a PHP null prima legandolo:

$lien_clique = (empty($lien_clique)) ? null : $lien_clique; 

Questo funziona in realtà, ma mi sento come DOP attributo NULL_EMPTY_STRING dovrebbe farlo per me e ho un sacco di query da aggiornare e non voglio proteggere tutto con questo tweek.

Qualcuno ha qualche idea sul perché del problema e il come della soluzione?

FYI: PHP 5.3.1 su Linux, pdo_sqlsrv 3.0 e SQL Server 2000.

+0

So che questo è vecchio, ma avete provato a fare: $ prep_req_action-> bindValue (": email", trim ($ email), PDO :: PARAM_STR); per garantire che non ci siano caratteri bianchi che confondono le cose. – FreudianSlip

+0

Ciao, grazie per l'idea. Purtroppo no non ho pensato di ridimensionare le variabili prima di legarle. In realtà ho protetto tutti i miei attacchi con il tweak che ho menzionato. Ma quando ho spostato la mia app dalla piattaforma di sviluppo a quella di produzione, il problema è scomparso. Non ho avuto il tempo di scoprire la differenza di configurazione tra questi due ambienti. La mia scommessa sarebbe una glitch di compatibilità di versione sul mio ambiente di installazione di dev. – C0chett0

risposta

0

Suona come si dispone di una dimensione impostata sulla colonna di stringa e il database probabilmente richiede che venga specificato al momento dell'inserimento .

Provare a utilizzare ...

$stmt->bindValue(":field",$value,PDO::PARAM_STR,$length); 

Sul campo che ti dà l'errore, dove $ lunghezza è la dimensione del campo, come specificato nel database. È un problema doverlo fare, ma ricordo di aver incontrato questo problema con il driver ODBC un po 'di tempo fa.

Problemi correlati