2012-09-20 3 views
5

Ich soll eine App von MSSQL-Funktionen auf PDO verschieben. Alles lief reibungslos, bis ich einen netten kleinen Fehler fand, den ich nicht umgehen kann.HY104 Sql Server Fehler beim Binden einer leeren Zeichenfolge an eine PDO vorbereitete Abfrage

Hier ist meine vorbereitete Anfrage:

$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() 
)"; 

und meine Bindungen:

$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); 

Das Problem ist, wenn einer meiner PHP-Variablen geschieht aus einer automatisierten CSV-Datei eine leere Zeichenfolge (kommt zu sein es passiert tatsächlich viel) SQL-Server gibt einen Fehler HY104 (Ungültige Genauigkeit) zurück.

Alle meine Felder sind NULL autorisiert, so dass ich das PDO::ATTR_ORACLE_NULLS Attribut zu PDO::NULL_EMPTY_STRING umwandelte, um leere Zeichenfolgen in NULL zu konvertieren, aber das Verhalten ist genau das gleiche.

Die einzige Abhilfe, die ich gefunden ist zu prüfen, ob mein Variable leer ist es festzulegen, bevor die Bindung es null PHP:

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

Das tatsächlich funktioniert, aber ich fühle mich wie PDO NULL_EMPTY_STRING Attribut sollte es für mich tun und ich habe Tonnen von Abfrage zu aktualisieren und ich möchte nicht alles mit diesem Tweek schützen.

Hat jemand eine Idee über das Warum des Problems und das Wie der Lösung?

FYI: PHP 5.3.1 auf Linux, pdo_sqlsrv 3.0 und SQL Server 2000

+0

Ich weiß, das ist alt, aber hast du versucht zu tun: $ prep_req_action-> bindValue (": email", trimmen ($ email), PDO :: PARAM_STR); um sicherzustellen, dass es keine Leerzeichen gibt, die Dinge verwirren. – FreudianSlip

+0

Hallo, danke für die Idee. Leider habe ich nicht daran gedacht, die Variablen vor dem Binden zu trimmen. Ich habe alle meine Bindungen mit dem Tweak geschützt, den ich erwähnt habe. Aber als ich meine App von der Entwicklerplattform auf die Produktion umstellte, verschwand das Problem. Ich hatte keine Zeit, um den Konfigurationsunterschied zwischen diesen beiden Umgebungen herauszufinden. Meine Wette wäre ein Versions-Kompatibilitätsfehler in meiner Entwicklungsumgebung. – C0chett0

Antwort

0

Es klingt wie Sie eine Größe festgelegt auf der String-Spalte und Ihre Datenbank haben wahrscheinlich erfordert, dass es zum Zeitpunkt des Einsetzens angegeben wird .

Versuchen Sie es mit ...

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

Auf dem Feld, das Sie den Fehler gibt, wobei $ Länge die Größe des Feldes ist, wie in der Datenbank angegeben. Es ist ein Schmerz, dies zu tun, aber ich erinnere mich, dass ich vor einiger Zeit mit dem ODBC-Treiber auf dieses Problem gestoßen bin.