gpt4 book ai didi

php - 将空字符串绑定(bind)到 pdo 准备查询时出现 HY104 Sql 服务器错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:38 24 4
gpt4 key购买 nike

我应该将一个应用程序从 mssql 函数移动到 PDO。一切都运行得很顺利,直到我发现自己遇到了一个我似乎无法解决的小错误。

这是我准备好的请求:

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

和我的绑定(bind):

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

问题是每当我的 PHP 变量之一恰好是空字符串(来自自动 csv 文件,它实际上发生了很多)SQL 服务器返回错误 HY104(无效精度)。

我的所有字段都是 NULL 授权的,所以我将 PDO::ATTR_ORACLE_NULLS 属性切换为 PDO::NULL_EMPTY_STRING 以将空字符串转换为 NULL,但行为完全相同。

我发现的唯一解决方法是测试我的变量是否为空,以便在绑定(bind)它之前将其设置为 php null:

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

这确实有效,但我觉得 NULL_EMPTY_STRING 的 PDO 属性应该为我完成,我有大量查询要更新,我不想在这周保护所有内容。

有没有人知道问题的原因和解决方法?

仅供引用:Linux 上的 PHP 5.3.1、pdo_sqlsrv 3.0 和 SQL Server 2000。

最佳答案

听起来您在字符串列上设置了大小,您的数据库可能要求在插入时指定它。

尝试使用...

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

在出现错误的字段上,$length 是数据库中指定的字段大小。不得不这样做很痛苦,但我记得不久前遇到过 ODBC 驱动程序的这个问题。

关于php - 将空字符串绑定(bind)到 pdo 准备查询时出现 HY104 Sql 服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com