"Недопустимый номер параметра: параметр не был определен" вставка данных
обновление
Я делал мелкую ошибку при перечислении значений. Я должен был поставить ": 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 (), то оператор завершится ошибкой, и будет выдана ошибка.