我使用 Yii 的主动记录模式已经有一段时间了。现在,我的项目需要为一笔小交易访问不同的数据库。我认为 Yii 的 DAO 会对此有好处。但是,我遇到了一个神秘的错误。
CDbCommand failed to execute the SQL statement: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
这是我的代码:
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
应该是城市和县的值。这不是错字(只是我必须做的一件愚蠢的事情)。
最佳答案
只是为了提供一个答案 - 因为这个错误很常见 - 这里有几个原因:
:parameter
名称与绑定(bind)错误不匹配(错字?)。这就是这里发生的事情。它们在 SQL 语句中有:alias
,但绑定(bind)了:username
。所以当尝试绑定(bind)参数时,Yii/PDO 在 sql 语句中找不到:username
,这意味着它是“一个参数短”并抛出错误。完全忘记为参数添加
bindValue()
。这在 Yii 其他结构中更容易做到,例如$critera
,你有一个数组或参数 ($criteria->params = array(':bind1'=>'test', ' :bind2'=>'test)
).在使用
together
和joins
时与 CDataProvider 分页和/或排序发生奇怪的冲突。没有具体、简单的方法来表征这一点,但是在 CDataProviders 中使用复杂查询时,我遇到了一些奇怪的问题,即参数被丢弃并发生此错误。
在 Yii 中解决这些问题的一个非常有用的方法是 enable parameter logging在你的配置文件中。将此添加到配置文件中的 db
数组中:
'enableParamLogging'=>true,
并确保在您的 log
部分中设置了 CWebLogRoute
路由。这将打印出给出和错误的查询,以及它试图绑定(bind)的所有参数。 super 有用!
关于php - "Invalid parameter number: parameter was not defined"插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874383/