«Неверный номер параметра: параметр не был определен» Вставка данных - PullRequest
36 голосов
/ 03 мая 2011

UPDATE

Я допустил мелкую ошибку при перечислении ЗНАЧЕНИЙ. Я должен был поставить ": имя пользователя", а не ": псевдоним". Я полагаю, что ответом на этот вопрос является бесплатное правление для всех, кто этого хочет? Или мне удалить вопрос?

ORIGINAL

Я уже некоторое время использую шаблон активной записи Yii. Теперь моему проекту нужен доступ к другой базе данных для одной небольшой транзакции. Я думал, что DAO Yii будет хорошо для этого. Однако я получаю загадочную ошибку.

CDbCommand не удалось выполнить инструкцию SQL: SQLSTATE [HY093]: недопустимый номер параметра: параметр не был определен

Вот мой код:

public function actionConfirmation
{
    $model_person = new TempPerson();

    $model = $model_person->find('alias=:alias',array(':alias'=>$_GET['alias']));
    $connection=Yii::app()->db2;
            $sql = "INSERT INTO users (username, password, ssn, surname
                    , firstname, email, city, country) 
                    VALUES(:alias, :password, :ssn, :surname
                    , :firstname, :email, :city, :country)";
            $command=$connection->createCommand($sql);
            $command->bindValue(":username", $model->alias);
            $command->bindValue(":password", substr($model->ssn, -4,4));
            $command->bindValue(":ssn", $model->ssn);
            $command->bindValue(":surname", $model->lastName);
            $command->bindValue(":firstname", $model->firstName);
            $command->bindValue(":email", $model->email);
            $command->bindValue(":city", $model->placeOfBirth);
            $command->bindValue(":country", $model->placeOfBirth);
            $command->execute();
            $this->render('confirmation',array('model'=>$model));
}

Это создает следующий запрос (как видно из журнала приложения):

INSERT INTO users (username, password, ssn, surname, firstname, email
                   , city, country) 
VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country);

К вашему сведению $model->placeOfBirth предполагается в значениях города и округа. Это не опечатка (просто глупость, которую я должен сделать).

Ответы [ 4 ]

88 голосов
/ 04 мая 2011

Просто чтобы дать ответ - потому что эта ошибка довольно распространена - вот несколько причин:

1) Имя :parameter не соответствует привязке по ошибке (опечатка?). Это то, что здесь произошло. Он имеет :alias в операторе SQL, но связан :username. Поэтому, когда была сделана попытка привязки параметров, Yii / PDO не смог найти :username в операторе sql, что означало «один параметр был коротким» и выдал ошибку.

2) Полностью забывая добавить bindValue() для параметра. Это проще сделать в Yii для других конструкций, таких как $critera, где у вас есть массив или параметры ($criteria->params = array(':bind1'=>'test', ':bind2'=>'test)).

3) Странные конфликты с разбиением на страницы CDataProvider и / или сортировкой при использовании together и joins. Не существует конкретного, простого способа охарактеризовать это, но при использовании сложных запросов в CDataProviders у меня возникали странные проблемы с удалением параметров и возникновением этой ошибки.

Один из очень полезных способов устранения этих проблем в Yii - включить ведение журнала параметров в вашем файле конфигурации. Добавьте это к вашему массиву db в вашем конфигурационном файле:

'enableParamLogging'=>true,

И убедитесь, что в разделе log установлен маршрут CWebLogRoute. Это выведет на экран запрос, который дал и ошибку, и все параметры, которые он пытался связать. Супер полезно!

4 голосов
/ 16 декабря 2015

Причиной этой ошибки для меня, не охваченной выше, является то, что когда вы имеете дело с динамическим массивом параметров, если вы сбрасываете какие-либо параметры, вам необходимо переиндексировать их перед передачей. Жестокая часть этого заключается в том, что ваш журнал ошибок не показывает индексы, поэтому все выглядит правильно. Например:

SELECT id WHERE x = ?, y = ?, z = ?

Возможно получение Log: Неверный номер параметра: параметр не был определен с параметрами ("x", "y", "z")

Похоже, что это не должно вызывать ошибку, но если индексы имеют вид:

0 => x, 1 => y, 4 => z

Считает, что последний параметр не определен, потому что ищет ключ 2.

4 голосов
/ 30 мая 2012

Может быть, вы пытаетесь связать параметр в одинарных кавычках вместо того, чтобы позволить ему делать всю работу за вас.

Сравнить:

Model::model()->findAll("t.description ilike '%:filter%'", array(':filter' => $filter));

С:

Model::model()->findAll("t.description ilike :filter", array(':filter' => '%' . $filter . '%'));
2 голосов
/ 09 февраля 2018

Я получил эту ошибку при попытке сделать что-то вроде:

$stmt = $pdo->prepare("select name from mytable where id = :id");
$stmt->execute([
  'id' => $id,
  'unusedvar' => $foo, // This row causes the error.
]);

В принципе, вы не можете иметь неиспользуемые параметры в массиве, переданные в execute().Каждое значение в массиве, переданное execute(), должно использоваться в подготовленном операторе.

Это также указывается в документах :

Привязка дополнительных значенийуказанное не возможно;если в input_parameters существует больше ключей, чем в SQL, указанном в PDO :: prepare (), то инструкция завершится ошибкой и будет выдана ошибка.

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