mssql 함수에서 PDO로 응용 프로그램을 이동해야합니다. 내가 스스로 해결할 수없는 멋진 작은 버그를 찾을 때까지 모든 것이 순조롭게 돌아가고있었습니다.HY104 빈 문자열을 pdo 준비된 쿼리에 바인딩 할 때 SQL 서버 오류가 발생했습니다.
$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()
)";
내 바인딩 : 내 PHP 변수 중 하나가 자동화 된 CSV 파일에서 오는 빈 문자열 (될 일 때마다
이$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);
문제는 여기에
내 준비 요청입니다 그것은 실제로 많이 발생합니다.) SQL 서버는 HY104 (유효하지 않은 정밀도) 오류를 반환합니다.내 모든 필드는 NULL 권한이 있으므로 PDO::NULL_EMPTY_STRING
으로 특성을 사용하여 빈 문자열을 NULL로 변환했지만 동작은 동일합니다.
내가 찾은 유일한 해결 방법은 내 변수를 바인딩하기 전에 널 (null) PHP로 그것을 설정하는 비어있는 경우 테스트하는 것입니다 :이 실제로 작동
$lien_clique = (empty($lien_clique)) ? null : $lien_clique;
하지만 PDO 나를 위해 그것을해야 NULL_EMPTY_STRING에 속성 같은 느낌 업데이트 할 쿼리가 많아서이 트위터로 모든 것을 보호하고 싶지 않습니다.
누구에게 문제의 문제점과 해결 방법에 대한 아이디어가 있습니까?
는 참고 : 리눅스에서 PHP 5.3.1, 3.0 및 SQL 서버 pdo_sqlsrv 2000
나는 이것이 오래되었다는 것을 알고있다. 그러나 $ prep_req_action-> bindValue (": email", trim ($ email), PDO :: PARAM_STR); 공백 문자가 혼란스럽지 않게하기 위해서입니다. – FreudianSlip
안녕하세요. 아이디어를 제공해 주셔서 감사합니다. 불행히도 바인딩 전에 변수를 다듬는 것에 대해 생각하지 않았습니다. 나는 내가 언급 한 비틀기로 모든 바인딩을 실제로 보호했다. 하지만 dev 플랫폼에서 프로덕션 앱으로 앱을 옮길 때 문제는 사라졌습니다. 나는 두 환경 사이의 구성 차이점을 찾을 시간이 없었다. 내기가 내 dev 환경 설정에서 버전 호환성 결함 일 것입니다. – C0chett0