为什么我会收到错误SQLSTATE [HY093]:无效的参数编号:?我该如何解决它?
基于这个问题How to insert array into mysql using PDO and bindParam?为什么我会收到错误SQLSTATE [HY093]:无效的参数编号:?我该如何解决它?
我试图通过PDO插入到MySQL数组的值。 我很困难,因为我不断收到以下错误。 SQLSTATE [HY093]:无效的参数编号:绑定变量的数目不为这条线$stmt->execute();
我猜问题有事情做这一行
$stmt->bindParam(':val$count', $val,PDO::PARAM_STR);
具体“VAL匹配令牌 数$ count',但我不确定到底发生了什么问题。
问题:我做错了什么?我怎样才能解决这个问题?
无论如何,这里是我与示例数组一起使用的代码。
$lastInsertValue=87;
$qid[0][0]=1;
$qid[0][1]=1;
$qid[1][0]=2;
$qid[1][1]="null";
$qid[2][0]=3;
$qid[2][1]=0;
$array_count = count($qid);
if (isset($lastInsertValue))
{
try
{
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$stqid=array();
$a=0;
for ($i=0; $i<$array_count; $i++)
{
$stqid[$a]=$lastInsertValue;
$a++;
$stqid[$a]=$qid[$i][0];
$a++;
$stqid[$a]=$qid[$i][1];
$a++;
}
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2)";
$count = 0;
$stmt = $dbh->prepare($sql);
foreach ($stqid as $val)
{
$stmt->bindParam(':val$count', $val,PDO::PARAM_STR);
$count++;
}
$stmt->execute();
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
哎呀,这么多问题。
-
您的阵列构建过于冗长。试试这个
$stqid = array(); foreach ($qid as $qidArr) { $stqid[] = $lastInsertValue; // no idea why you repeat this $stqid[] = $qidArr[0]; $stqid[] = $qidArr[1]; }
-
使用位置占位符,如果你单纯依靠的论据
$sql = 'INSERT INTO ... VALUES (?, ?, ?)';
bindParam
号码使用你与每个循环迭代改写引用。您希望使用bindValue()
代替您的查询只有3个占位符,但您的
$stqid
数组有9个项目。这是你的错误的来源。
你必须围绕一个变量,它会被当作变量名$count
(不是值)单引号,尝试变串联为字符串。这给一试:
$stmt->bindParam(':val' . $count, $val,PDO::PARAM_STR);
这确实是问题的一部分。谢谢。 – TryHarder 2012-03-29 06:26:24
for ($i=0; $i<$array_count; $i++)
{
$stqid[$a]=$lastInsertValue;
$a++;
$stqid[$a]=$qid[$i][0];
$a++;
$stqid[$a]=$qid[$i][1];
$a++;
}
这样的情况下,$i = 2
,这将增加$stqid[6]
,$stqid[7]
,$stqid[8]
所以
foreach ($stqid as $val)
{
$stmt->bindParam(':val$count', $val,PDO::PARAM_STR);
$count++;
}
会给你:val0
到:val8
在查询您只有:val0
到:val2
。
同时在数据库的一个字段中有多个值是不好的。不要这样做。尝试重新设计您的数据库不同
编辑:在早上坏数学...对不起
对不起。一个领域的多重价值是什么意思? – TryHarder 2012-03-29 06:28:10
嗯......可能错误地理解了'$ stmt-> bindParam(':an_array',implode(',',$ values),PDO :: PARAM_STR);'在你上一个问题中。看起来像你在那里尝试将多个值除以','成一个字段。但一些咖啡后,我认为你正在尝试使用数组一次插入多行。我正确或应该得到更多的咖啡 – 2012-03-29 08:05:16
在http://*.com/questions/9858073/how-to-insert-array-into-mysql-using-pdo-and-bindparam我试图插入多行在一次使用多维数组。该数组包含例如qid和结果的值。我想通过使用bindparam使它更安全。这个问题只是我玩弄这个问题的答案并试图理解它的结果。 – TryHarder 2012-03-29 10:13:18
感谢您的建设性反馈。我知道代码不是很好。我倾向于把它甩出来,然后再去盯着电脑屏幕(尽管我也这么做!)。我可能会留下更多评论,但我必须先做更多的研究。 – TryHarder 2012-03-29 06:49:09
当我不知道该数组将包含多少项目时,如何插入值?我曾想插入多行(每行3个项目),但每次插入的行数都不相同。 – TryHarder 2012-04-03 04:23:12