【问题标题】:Error HY093 with a MySQL Insert PDO Request带有 MySQL 插入 PDO 请求的错误 HY093
【发布时间】:2013-06-06 07:11:19
【问题描述】:

在阅读了有关 HY093 的所有其他问题后,我打开了这个问题来弄清楚为什么我也收到了这条消息。

这是我的桌子:

这是我的要求: (其中 $conn 是我的 PDO 连接)

$sql = $conn->prepare("INSERT INTO Sites (Email,URL,Title,Description,PageRank,Rewrite,MetaDesc,Origin,BackLink,nbBackLink,RssTitle,RssAddress,SocAddress,SocPostalCode,SocCity,SocCountry,SocTel,Offer,Status,nbHit)
                         VALUES (:Email,:URL,:Title,:Description,:PageRank,:Rewrite,:MetaDesc,:Origin,:BackLink,0,:RssTitle,:RssAddress,:SocAddress,:SocPostalCode,:SocCity,:SocCountry,:SocTel,:Offer,:Status,0)");
$sql->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$pageRank = new GooglePageRank($_POST["site_url"]);

$sql->bindParam(":Email",$_POST["submail"],PDO::PARAM_STR);
$sql->bindParam(":URL",$_POST["site_url"],PDO::PARAM_STR);
$sql->bindParam(":Title",$_POST["site_title"],PDO::PARAM_STR);
$sql->bindParam(":Description",$_POST["site_desc"],PDO::PARAM_STR);
$sql->bindParam(":PageRank",$pageRank->PageRank,PDO::PARAM_INT);
$sql->bindParam(":Rewrite",stringToRewrite($_POST["site_title"]),PDO::PARAM_STR);
$sql->bindParam(":MetaDesc",$_POST["site_desc"],PDO::PARAM_STR);
$sql->bindParam(":Origin",$_POST["site_country"],PDO::PARAM_STR);
$sql->bindParam(":BackLink",$_POST["site_backlink"],PDO::PARAM_STR);
$sql->bindParam(":RssTitle",$_POST["site_rss_title"],PDO::PARAM_STR);
$sql->bindParam(":RssAddress",$_POST["site_rss_addr"],PDO::PARAM_STR);
$sql->bindParam(":SocAddress",$_POST["soc_addr"],PDO::PARAM_STR);
$sql->bindParam(":SocPostalCode",$_POST["soc_cp"],PDO::PARAM_STR);
$sql->bindParam(":SocCity",$_POST["soc_city"],PDO::PARAM_STR);
$sql->bindParam(":SocCoutry",$_POST["soc_pays"],PDO::PARAM_STR);
$sql->bindParam(":SocTel",$_POST["soc_tel"],PDO::PARAM_STR);

$offer = $_POST["offer"] == "premium" ? 1 : 0;
$status = $_POST["offer"] == "premium" ? 2 : 0;

$sql->bindParam(":Offer",$offer,PDO::PARAM_INT);
$sql->bindParam(":Status",$status,PDO::PARAM_INT);

$sql->execute();
var_dump($sql->errorInfo());
var_dump($sql->errorCode());

知道为什么我一直有 HY093 错误吗?

【问题讨论】:

  • 当然。绑定变量的数量与标记的数量不匹配
  • 不是这样的。 Aynber 找到了原因;)
  • 那是准确错误。查询中没有 :SocCoutry 标记,表示编号不匹配

标签: php pdo


【解决方案1】:

您的一个 bindParams 中有一个拼写错误,这意味着您的参数不匹配:

$sql->bindParam(":SocCoutry",$_POST["soc_pays"],PDO::PARAM_STR);

应该是

$sql->bindParam(":SocCountry",$_POST["soc_pays"],PDO::PARAM_STR);

【讨论】:

  • 我遇到了同样的问题。而且它已经花费了我很多时间来找出我的代码中的错误。还在寻找...
  • @LCB 这可能是某个地方的拼写错误,但您可以创建一个新问题。一双新鲜的眼睛可能会有所帮助。
【解决方案2】:

这是我发现的一个有趣的案例:

运行此查询:

INSERT INTO videosubmissions (member_login, submission_date) VALUES (":login", ":submission-date")

绑定:

[ ':login',           $info['login'],   PDO::PARAM_STR ],
[ ':submission-date', $submission_date, PDO::PARAM_STR ]

有效...但是

INSERT INTO videosubmissions (member_login, submission_date) VALUES (:login, :submission-date)

因 HY093 错误而失败。 我怀疑这是由从字符串到日期的隐式转换引起的,但尝试显式 STR_TO_DATE(format, sDate) 并没有解决它。 但是,如果我在其他查询中使用 PDO::PARAM_STR 值引用所有占位符,则会导致问题。

我知道这并不能真正回答问题,但它增加了另一个案例以帮助弄清楚发生了什么。

【讨论】:

  • 有趣的是,手动替换查询中的字符串并在 MyPhpAdmin 上运行也可以。
  • 我有一些相同的问题,我发现如果 var-array 包含的条目比查询预期的多,那么 HY093 就会发生
【解决方案3】:

我的问题是参数数量与占位符数量不匹配。可能值得将此添加到@aynber 的答案中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2016-12-22
    • 2019-09-22
    相关资源
    最近更新 更多