无效的参数号码:绑定变量的数量不匹配令牌的数量
很多问题与这个标题,但没有一个能够解决我的问题,我不知道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在线 ............................
当你在做
$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"]));
是的,我被张贴编辑的代码,忘记更改虚拟变量名称。所以你意味着绑定必须要求? –
将值绑定到一对一的关系中,这样您就可以确保始终绑定您期望的值。这意味着使用我在答案中发布的示例(您可能需要根据您的实际代码更改POST索引,您更改了它们以便我不确定实际使用的是哪个)。 – Qirel
感谢Qirel提供的答案和时间。一般来说,我期望$ Post应该需要工作,因为参数名称是相同的。我们不需要明确地定义它 –
您需要修改你如何”重新执行你的陈述。既然你定义(:ProId, :ProQuestion
)的结合/参数,就需要构建一个数组传递给->execute(...)
看起来像这样:
$binds = array(
':ProId' => $_POST['ProjectId'],
':ProQuestion' => $_POST['ProjectQuestion']
);
$querySuccess = $queryInsert->execute($binds);
我更新了我的问题是绑定是否有必要? –
@MohammadFaizanKhan如果这是外部用户输入,那么您应该[**始终绑定**](http://stackoverflow.com/a/24989031/2518525),因为您永远不会相信任何用户输入。 – Darren
谢谢你的时间。我希望我能接受不止一个答案。但我仍然无法理解绑定的目的,因为参数名称相同,那么你应该不需要绑定它 –
'$ _POST'是什么?对它做一个'var_dump();'。 – Qirel
ProjectId和ProjectQuestion数据 –