1. ホーム
  2. php

[解決済み] 「無効なパラメータ番号:パラメータが定義されていない」 データを挿入する

2022-02-01 09:22:23

質問

私はしばらくの間、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 は、cityとcountyの両方の値にあるはずです。 タイプミスではありません(単なるバカの一つ覚えです)。

解決方法は?

このエラーはかなり一般的なので、答えを出すために、いくつかの原因を紹介します。

1) :parameter の名前が誤ってbindと一致しない(typo?) このようなことがありました。彼は :alias をSQL文の中でバインドしています。 :username . そのため、パラメータバインディングを行おうとしたときに、Yii/PDO は :username は、SQL 文のパラメータが 1 つ足りないことを意味し、エラーを発生させます。

2)完全に忘れていた。 bindValue() をパラメータとして使用します。これは Yii の他の構成要素である $critera のように、配列やパラメータを持つ場合( $criteria->params = array(':bind1'=>'test', ':bind2'=>'test) ).

3) CDataProvider の Pagination や Sorting を使用すると、おかしなコンフリクトが発生する。 togetherjoins . これを特徴づける具体的で簡単な方法はありませんが、CDataProvidersで複雑なクエリを使用する場合、パラメータが脱落してこのエラーが発生する奇妙な問題がありました。

Yiiでこれらの問題をトラブルシューティングするのに非常に役立つ方法の1つは、以下の通りです。 パラメータロギングを有効にする を設定ファイルに追加してください。これをあなたの db の配列で指定します。

'enableParamLogging'=>true,

そして、必ず CWebLogRoute のルートは、あなたの log セクションを作成します。これにより、エラーが発生したクエリと、バインドしようとしたすべてのパラメータが出力されます。とても便利です。