微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – “参数号无效:参数未定义”插入数据

UPDATE

列出VALUES时我犯了一个错误.我应该输入“:username”而不是“:alias”.我想这个问题的答案可归功于任何想要它的人的自由统治吗?或者我删除这个问题?

原版的

我一直在使用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);

FYI $model-> placeOfBirth应该是城市和县值.这不是一个错字(我只是一件傻事).

解决方法:

只是为了提供答案 – 因为这个错误很常见 – 这里有几个原因:

1):参数名称错误绑定不匹配(拼写错误?).这就是这里发生的事情.他在sql语句中有别名:但是绑定:用户名.因此,当尝试param绑定时,Yii / PDO无法在sql语句中找到:username,这意味着它是“一个参数短”并引发错误.

2)完全忘记为参数添加bindValue().这在Yii其他结构中比较容易,例如$critera,你有一个数组或参数($criteria-> params = array(‘:bind1’=>’test’,’:bind2’=>’test )).

3)在一起使用和加入时与CDataProvider分页和/或排序的奇怪冲突.没有特定的,简单的方法来表征这一点,但是当在CDataProviders中使用复杂查询时,我遇到了一些奇怪的问题,即参数被丢弃并且发生了这种错误.

在Yii中解决这些问题的一个非常有用的方法是在配置文件中使用enable parameter logging.将其添加配置文件中的db数组中:

'enableParamLogging'=>true,

并确保在日志部分中设置了CWebLogRoute路由.这将打印出给出的查询错误,以及它试图绑定的所有参数.超级有用!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐