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

2022-08-30 11:26:21

我已经使用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);

FYI应该同时具有城市和县值。这不是一个错别字(只是我必须做的一件愚蠢的事情)。$model->placeOfBirth


答案 1

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

  1. 该名称错误地与绑定不匹配(拼写错误?这就是这里发生的事情。他在 SQL 语句中,但绑定了 .因此,当尝试参数绑定时,Yii/PDO 无法在 sql 语句中找到,这意味着它是“一个参数短”并抛出了错误。:parameter:alias:username:username

  2. 完全忘记添加 for a 参数。这在 Yii 其他构造中更容易做到,比如 ,其中有一个数组或 params ()。bindValue()$critera$criteria->params = array(':bind1'=>'test', ':bind2'=>'test)

  3. 另一个可能的原因是占位符名称中的字符无效

  4. 与 CDataProvider 分页和/或排序在使用 和 时发生奇怪的冲突。没有具体而简单的方法来描述这一点,但是当在CDataProviders中使用复杂查询时,我遇到了奇怪的问题,参数被删除并发生此错误。togetherjoins

在 Yii 中解决这些问题的一个非常有用的方法是在配置文件中启用参数日志记录。将其添加到配置文件中的数组中:db

'enableParamLogging'=>true,

并确保在您的路段设置了路线。这将打印出给出和 error 的查询,以及它尝试绑定的所有参数。超级乐于助人!CWebLogRoutelog


答案 2

可能是您试图在单引号内绑定参数,而不是让它为您完成工作。

比较:

Model::model()->findAll("t.description ilike '%:filter%'", array(':filter' => $filter));

跟:

Model::model()->findAll("t.description ilike :filter", array(':filter' => '%' . $filter . '%'));

推荐