无效的参数号码:绑定变量的数量不匹配令牌的数量

无效的参数号码:绑定变量的数量不匹配令牌的数量

问题描述:

很多问题与这个标题,但没有一个能够解决我的问题,我不知道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对象::执行():SQLSTATE [HY093]:无效参数号: 号码绑定变量的不 C匹配的令牌的数目:\瓦帕\ WWW \ ESP \ ESP.php在线 ............................

+0

'$ _POST'是什么?对它做一个'var_dump();'。 – Qirel

+0

ProjectId和ProjectQuestion数据 –

当你在做

$queryInsert->execute($_POST); 

你”重新尝试绑定全部后置数组中的所有内容,并将它们各自的索引作为占位符存储在数组中。当您提交您的AJAX,你发送以下数据

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

在这里有三个项目,但你只是想结合两个人,造成那里是在结合数的missmatch和即使您试图绑定的两个索引与占位符的名称相匹配,因为您的action不是查询中的占位符。

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

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

是的,我被张贴编辑的代码,忘记更改虚拟变量名称。所以你意味着绑定必须要求? –

+0

将值绑定到一对一的关系中,这样您就可以确保始终绑定您期望的值。这意味着使用我在答案中发布的示例(您可能需要根据您的实际代码更改POST索引,您更改了它们以便我不确定实际使用的是哪个)。 – Qirel

+0

感谢Qirel提供的答案和时间。一般来说,我期望$ Post应该需要工作,因为参数名称是相同的。我们不需要明确地定义它 –

您需要修改你如何”重新执行你的陈述。既然你定义(:ProId, :ProQuestion)的结合/参数,就需要构建一个数组传递给->execute(...)看起来像这样:

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

我更新了我的问题是绑定是否有必要? –

+0

@MohammadFaizanKhan如果这是外部用户输入,那么您应该[**始终绑定**](http://*.com/a/24989031/2518525),因为您永远不会相信任何用户输入。 – Darren

+0

谢谢你的时间。我希望我能接受不止一个答案。但我仍然无法理解绑定的目的,因为参数名称相同,那么你应该不需要绑定它 –