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
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
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