2012-09-20 41 views
5

Se supone que debo mover una aplicación de funciones mssql a PDO. Todo estaba funcionando sin problemas hasta que me encontré con un pequeño error que no puedo solucionar.Error del servidor de Hy104 Sql al vincular una cadena vacía a una consulta preparada de pdo

Aquí es mi pedido preparado:

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

y mis fijaciones:

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

El problema es cuando uno de mi variable de PHP pasa a ser una cadena vacía (que viene de un archivo csv automatizado en realidad sucede mucho) El servidor SQL devuelve un error HY104 (precisión no válida).

Todos mis campos son nulos autorizados así que cambié el atributo PDO::ATTR_ORACLE_NULLS a PDO::NULL_EMPTY_STRING para convertir cadenas vacías en NULL pero el comportamiento es exactamente el mismo.

La única solución que he encontrado es para probar si mi variable está vacía para configurarlo a php nula antes de unirlo:

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

Esto funciona realmente, pero me siento como DOP atribuyen a NULL_EMPTY_STRING debe hacerlo por mí y tengo toneladas de consultas para actualizar y no quiero proteger todo con esta tweek.

¿Alguien tiene alguna idea sobre el por qué del problema y cómo es la solución?

FYI: PHP 5.3.1 en Linux, pdo_sqlsrv 3.0 y SQL Server 2000.

+0

Sé que esto es antiguo, pero ha intentado hacer: $ prep_req_action-> bindValue (": email", trim ($ email), PDO :: PARAM_STR); para garantizar que no haya caracteres en blanco que confundan las cosas. – FreudianSlip

+0

Hola, gracias por la idea. Lamentablemente, no, no pensé en recortar las variables antes de enlazarlas. De hecho, protegí todas mis ataduras con el ajuste que mencioné. Pero cuando moví mi aplicación de la plataforma de desarrollo a la de producción, el problema desapareció. No tuve tiempo de averiguar la diferencia de configuración entre esos dos entornos. Mi apuesta sería un error de compatibilidad de versión en la configuración de mi entorno de desarrollo. – C0chett0

Respuesta

0

Suena como que tiene un tamaño establecido en la columna de la cuerda y su base de datos probablemente requiere que se especifique en el momento de la inserción .

Trate de usar ...

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

En el campo que da el error, donde $ longitud es el tamaño del campo como se especifica en la base de datos. Me duele tener que hacer esto, pero recuerdo haber topado con este problema con el controlador ODBC hace un tiempo.

Cuestiones relacionadas