Почему я получаю сообщение об ошибке SQLSTATE [HY093]: Неверный номер параметра:? Как я могу это исправить? - PullRequest
0 голосов
/ 29 марта 2012

Исходя из этого вопроса Как вставить массив в MySQL, используя PDO и bindParam?

Я пытаюсь вставить значения массива в MySQL через PDO.Мне тяжело, потому что я получаю следующую ошибку.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();
    }
}   

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Вокруг переменной есть одинарные кавычки, которые будут рассматриваться как имя переменной $count (не значение), попробуйте объединить переменную со строкой. Попробуйте это:

$stmt->bindParam(':val' . $count, $val,PDO::PARAM_STR);
2 голосов
/ 29 марта 2012

Yikes, очень много проблем.

  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 элементов.Это источник вашей ошибки.

1 голос
/ 29 марта 2012
      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.

Также иметь несколько значений в одном поле в базе данных - это плохо.Не делай этого.Попробуйте изменить дизайн вашей БД по-другому

РЕДАКТИРОВАТЬ: плохая математика по утрам ... извините

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...