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

обновление

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

оригинал

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

к твоему сведению!--2--> должен быть как в городских, так и в окружных значениях. Это не опечатка (просто глупая вещь, которую я должен сделать).

4 ответов


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

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

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

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

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

'enableParamLogging'=>true,

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


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

сравниваем:

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 = ?

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

похоже, что это не должно вызывать ошибку, но если индексы что-то вроде:

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

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


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

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

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

Это также указано в docs:

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