Подтвердить что ты не робот

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

UPDATE

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

ОРИГИНАЛ

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

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 должен находиться как в городских, так и в уездных значениях. Это не опечатка (просто глупая вещь, которую я должен сделать).

4b9b3361

Ответ 1

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

1) Имя :parameter не соответствует привязке по ошибке (typo?). Вот что произошло здесь. Он имеет :alias в операторе SQL, но связан :username. Поэтому, когда попытка привязки param была предпринята, 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. Это напечатает запрос, который дал и ошибка, и все параметры, которые он пытался связать. Супер полезно!

Ответ 2

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

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

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

С

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

Ответ 3

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

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

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

Похоже, что это не должно быть ошибка, но если индексы похожи на:

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

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