«Недопустимый номер параметра: параметр не определен» Вставка данных

ОБНОВИТЬ

Я делал мелкую ошибку при перечислении VALUES. Я должен был бы поставить «: имя пользователя», а не «: псевдоним». Я полагаю, что ответ на этот вопрос является свободным правлением для всех, кто этого хочет? Или я удаляю вопрос?

ОРИГИНАЛ

Я некоторое время использую шаблон активной записи 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); 

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

Related of "«Недопустимый номер параметра: параметр не определен» Вставка данных"

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

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

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

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

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

 'enableParamLogging'=>true, 

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

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

Для сравнения:

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

С:

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

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

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

Может возникнуть Log: Invalid number number: параметр не был определен с параметрами («x», «y», «z»)

Похоже, что это не должно быть ошибкой, но если индексы – это что-то вроде:

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

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