为什么我会收到错误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(); 
    } 
} 

哎呀,这么多问题。

  1. 您的阵列构建过于冗长。试试这个

    $stqid = array(); 
    foreach ($qid as $qidArr) { 
        $stqid[] = $lastInsertValue; // no idea why you repeat this 
        $stqid[] = $qidArr[0]; 
        $stqid[] = $qidArr[1]; 
    } 
    
  2. 使用位置占位符,如果你单纯依靠的论据

    $sql = 'INSERT INTO ... VALUES (?, ?, ?)'; 
    
  3. bindParam号码使用你与每个循环迭代改写引用。您希望使用bindValue()代替

  4. 您的查询只有3个占位符,但您的$stqid数组有9个项目。这是你的错误的来源。

+0

感谢您的建设性反馈。我知道代码不是很好。我倾向于把它甩出来,然后再去盯着电脑屏幕(尽管我也这么做!)。我可能会留下更多评论,但我必须先做更多的研究。 – TryHarder 2012-03-29 06:49:09

+0

当我不知道该数组将包含多少项目时,如何插入值?我曾想插入多行(每行3个项目),但每次插入的行数都不相同。 – TryHarder 2012-04-03 04:23:12

你必须围绕一个变量,它会被当作变量名$count(不是值)单引号,尝试变串联为字符串。这给一试:

$stmt->bindParam(':val' . $count, $val,PDO::PARAM_STR); 
+0

这确实是问题的一部分。谢谢。 – 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

同时在数据库的一个字段中有多个值是不好的。不要这样做。尝试重新设计您的数据库不同

编辑:在早上坏数学...对不起

+0

对不起。一个领域的多重价值是什么意思? – TryHarder 2012-03-29 06:28:10

+0

嗯......可能错误地理解了'$ stmt-> bindParam(':an_array',implode(',',$ values),PDO :: PARAM_STR);'在你上一个问题中。看起来像你在那里尝试将多个值除以','成一个字段。但一些咖啡后,我认为你正在尝试使用数组一次插入多行。我正确或应该得到更多的咖啡 – 2012-03-29 08:05:16

+0

在http://*.com/questions/9858073/how-to-insert-array-into-mysql-using-pdo-and-bindparam我试图插入多行在一次使用多维数组。该数组包含例如qid和结果的值。我想通过使用bindparam使它更安全。这个问题只是我玩弄这个问题的答案并试图理解它的结果。 – TryHarder 2012-03-29 10:13:18