【问题标题】:Invalid parameter number: number of bound variables does not match number of token无效的参数号:绑定变量的数量与令牌的数量不匹配
【发布时间】:2023-03-20 16:11:01
【问题描述】:

这个标题有这么多问题,但没有一个能够解决我的问题,我不知道 WTH? 这是一个简单的代码 php 向表中添加数据

  global $connPDO;
    ini_set('date.timezone', 'Asia/Karachi');
    $date = date('Y-m-d H:i:s');

    $sql = "INSERT INTO `pqa` VALUES (null, :ProId, :ProQuestion, null, '$date', null)";
    $queryInsert = $connPDO->prepare($sql);

    try {
        //Post contain $_POST["ProId"], $_POST["ProQuestion"];
        $querySuccess = $queryInsert->execute($_POST);
        echo $querySuccess;
    }
    catch(Exception $e) {
        echo '<h1>An error has ocurred.</h1><pre>', $e->getMessage() ,'</pre>';
    }

Catch 块未执行但给出错误。

var data = {
    "action" : "SaveProjectNewQuestion",
    "ProId" : 1,
    "ProQuestion" : $jqueryLib("#NewQuestion").val()
};
$jqueryLib.ajax({
    url : "ESP.php",
    type : "POST",
    data : data,
    success : function(data, textStatus, XMLHttpRequest) {
        console.log(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus, errorThrown);
    }
});

显示此警告的惊人成功日志,也没有插入任何数据。

( ! ) 警告: PDOStatement::execute(): SQLSTATE[HY093]: 参数号无效: 绑定变量的数量与中的标记数量不匹配 C:\wamp\www\ESP\ESP.php 上线 5621........

【问题讨论】:

  • $_POST 中有什么内容?在上面做一个var_dump();。
  • ProjectId 和 ProjectQuestion 数据

标签: php pdo


【解决方案1】:

当你在做的时候

$queryInsert->execute($_POST);

您正在尝试将全局后置数组中的 everything 与它们各自在数组中的索引绑定为占位符。当您提交 ajax 时,您将发送以下数据

var data = {
    "action" : "SaveProjectNewQuestion",
    "ProId" : 1,
    "ProQuestion" : $jqueryLib("#NewQuestion").val()
};

这里有三个项目,但您只尝试绑定其中两个,导致绑定数量和值数量不匹配,即使您尝试绑定的两个索引匹配占位符的名称 - 因为您的 action 不是查询中的占位符。

通常我会避免这样做,使用整个 POST 数组。只绑定两个变量,我宁愿直接绑定,像这样

$queryInsert->execute(array("ProId" => $_POST['ProId'], 
                            "ProQuestion" => $_POST["ProQuestion"]));

【讨论】:

  • 是的,我发布了已编辑的代码,但忘记更改变量名称。所以你的意思是必须绑定?
  • 以一对一的关系绑定值,这样您就可以确保始终绑定您期望的值。这意味着使用我在答案中发布的示例(您可能必须根据您的实际代码更改 POST 索引,您更改了它们,所以我不确定您实际使用的是哪个)。
  • 感谢 Qirel 的回答和时间。一般来说,我希望 $Post 应该需要工作,因为参数名称是相同的。我们不需要明确定义它
  • 如果您只在data jQuery 变量中发送ProId 和ProQuestion,那么可以——您可以使用$queryInsert-&gt;execute($_POST);(因为那时会有2 个值和2 个占位符==匹配),但您要发送 3 个值,因此您需要明确(作为良好做法)说明要使用的值。
  • 再次感谢!但是action也是需要发送的,就是方法名。
【解决方案2】:

您需要修正执行语句的方式。由于您正在定义 (:ProId, :ProQuestion) 绑定/参数,因此您需要将构造的数组传递给 -&gt;execute(...),如下所示:

$binds = array(
    ':ProId' => $_POST['ProjectId'],
    ':ProQuestion' => $_POST['ProjectQuestion']
);
$querySuccess = $queryInsert->execute($binds);

【讨论】:

  • @MohammadFaizanKhan 如果这是外部用户输入,那么您应该always bind,因为您永远无法信任任何用户输入。
  • 感谢您的宝贵时间。我希望我能接受多个答案。但是我仍然无法理解绑定的目的,因为参数名称相同,那么您不需要绑定它
猜你喜欢
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多