1)该:parameter
名称与错误绑定(typo?)不匹配。这就是这里发生的事情。他:alias
在sql语句中,但已绑定:username
。因此,当尝试进行参数绑定时,Yii / PDO :username
在sql语句中找不到,这意味着“参数短”并引发了错误。
2)完全忘记bindValue()
为参数添加。这在Yii其他结构(如$critera
,具有数组或params($criteria->params = array(':bind1'=>'test', ':bind2'=>'test)
))中更容易做到。
3)使用together
和时,与CDataProvider分页和/或排序很奇怪joins
。没有特定,简单的方法可以对此进行表征,但是当在CDataProviders中使用复杂的查询时,我遇到了奇怪的问题,即删除了参数并发生了此错误。
解决Yii中这些问题的一种非常有用的方法是在配置文件中启用参数记录。将此添加到db
配置文件中的数组中:
'enableParamLogging'=>true,
@H_419_33@并确保
CWebLogRoute
在您的log
部分中设置了路线。这将打印出给出和错误的查询,以及它试图绑定的所有参数。超级有帮助!解决方法
更新
列出值时,我犯了一个小错误。我应该输入“:username”而不是“:alias”。我想这个问题的答案是谁想要的自由统治?还是删除问题?
原版的
我一直在使用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,country) VALUES(:alias,:country);
仅供参考
$model->placeOfBirth
,以市值和县值表示。那不是错别字(我要做的只是愚蠢的事情)。
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,country)
VALUES(:alias,:country);
并确保CWebLogRoute
在您的log
部分中设置了路线。这将打印出给出和错误的查询,以及它试图绑定的所有参数。超级有帮助!
更新
列出值时,我犯了一个小错误。我应该输入“:username”而不是“:alias”。我想这个问题的答案是谁想要的自由统治?还是删除问题?
原版的
我一直在使用Yii的活动记录模式。现在,我的项目需要为一个小事务访问另一个数据库。我以为Yii的DAO会很好。但是,我收到了一个神秘的错误。
CDbCommand无法执行SQL语句:SQLSTATE [HY093]:无效的参数编号:参数未定义
这是我的代码:
这将构造以下查询(如在应用程序日志中所示):
仅供参考$model->placeOfBirth
,以市值和县值表示。那不是错别字(我要做的只是愚蠢的事情)。
并确保CWebLogRoute
在您的log
部分中设置了路线。这将打印出给出和错误的查询,以及它试图绑定的所有参数。超级有帮助!