2012-09-20 8 views
5

Mam przenieść aplikację z funkcji mssql do PDO. Wszystko działało sprawnie, dopóki nie znalazłem sobie drobnego błędu, którego nie mogę obejść.HY104 Błąd serwera Sql podczas wiązania pustego łańcucha z zapytaniem przygotowanym pdo.

Oto mój przygotowany wniosek:

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

i moje Wiązania:

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

Problem jest, gdy jeden z moich zmiennej PHP zdarza się być pusty ciąg (pochodzących z zautomatyzowanym pliku csv zdarza się to naprawdę dużo) Serwer SQL zwraca błąd HY104 (Nieprawidłowa precyzja).

Wszystkie moje pola mają uprawnienia NULL, więc zmieniłem atrybut PDO::ATTR_ORACLE_NULLS na PDO::NULL_EMPTY_STRING, aby przekonwertować puste ciągi na NULL, ale zachowanie jest dokładnie takie samo.

Jedyne obejście znalazłem jest aby sprawdzić, czy moja zmienna jest pusta, aby ustawić go do php zerowy przed wiążące go:

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

To faktycznie działa, ale czuję się jak PDO przypisują NULL_EMPTY_STRING powinien zrobić to za mnie i mam mnóstwo zapytań do aktualizacji i nie chcę chronić wszystkiego za pomocą tego podręcznika.

Czy ktoś ma pojęcie o przyczynie problemu i o sposobie rozwiązania?

FYI: PHP 5.3.1 w systemie Linux, pdo_sqlsrv 3.0 i SQL Server 2000.

+0

Wiem, że jest stary, ale czy próbowałeś: $ prep_req_action-> bindValue (": email", trim ($ email), PDO :: PARAM_STR); aby upewnić się, że nie ma znaków whitespace mylących rzeczy. – FreudianSlip

+0

Witam, dziękuję za pomysł. Niestety nie myślałem o przycinaniu zmiennych przed związaniem. Naprawdę chroniłem wszystkie moje wiązania za pomocą poprawek, o których wspomniałem. Ale kiedy przeniosłem swoją aplikację z platformy deweloperskiej do produkcji, problem zniknął. Nie miałem czasu, aby znaleźć różnicę w konfiguracji między tymi dwoma środowiskami. Mój zakład byłby usterką zgodności wersji w konfiguracji środowiska dev. – C0chett0

Odpowiedz

0

Brzmi jak masz rozmiar ustawiony na kolumnie smyczkową i baza danych wymaga chyba że zostanie określona w momencie wkładania .

Spróbuj użyć ...

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

Na obszarze, który daje błąd, gdzie $ długość jest wielkość pola, jak określono w bazie danych. Musi to być bolesne, ale pamiętam, że wracam do tego problemu ze sterownikiem ODBC.

Powiązane problemy