开发者社区> 问答> 正文

“无效的参数编号:参数未定义”插入数据

更新

列出值时,我犯了一个小错误。我应该输入“: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, password, ssn, surname, firstname, email , city, country) VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country); 仅供参考$model->placeOfBirth,以市值和县值表示。那不是错别字(我要做的只是愚蠢的事情)。

展开
收起
保持可爱mmm 2020-05-11 11:57:52 507 0
1 条回答
写回答
取消 提交回答
  • 仅提供一个答案-因为此错误非常普遍-这里有一些原因:

    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, 并确保CWebLogRoute在您的log部分中设置了路线。这将打印出给出和错误的查询,以及它试图绑定的所有参数。超级有帮助!来源:stack overflow

    2020-05-11 17:09:27
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载