php - "Invalid parameter number: parameter was not defined"插入数据

标签 php mysql pdo yii

我使用 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 应该是城市和县的值。这不是错字(只是我必须做的一件愚蠢的事情)。

最佳答案

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

  1. :parameter 名称与绑定(bind)错误不匹配(错字?)。这就是这里发生的事情。它们在 SQL 语句中有 :alias,但绑定(bind)了 :username。所以当尝试绑定(bind)参数时,Yii/PDO 在 sql 语句中找不到 :username ,这意味着它是“一个参数短”并抛出错误。

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

  3. 另一个可能的原因是invalid character in the placeholder name

  4. 在使用 togetherjoins 时与 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/

相关文章:

php - 以HTML表格格式显示Mysql数据

php - 通过单个 PHP 表单将数据和文件上传到 MySQL 数据库

php - SELECT 查询未检索最新数据

php - 使用 PDO 的正确信息登录失败

PHP/PDO/MSSQL 如何获取错误信息?

php以递归模式对一个目录中的所有图像运行函数

php - 从另一个带有一个额外字段的姐妹表插入

php - mySQL复杂的条件连接查询可提高多个查询和PHP的效率

php - 如何查询 mysql 数据库中的变量,如果存在则创建另一个变量,如果不插入?

php - PDO 'UPDATE' 带参数的语句不起作用