SQLSTATE[HY093]: SQL の「無効なパラメーター番号」エラーの理解と解決
データベースを操作するときに、エラーが発生する可能性があります「SQLSTATE[HY093]: 無効なパラメータ番号: パラメータが定義されていません。」などのメッセージが表示されます。このエラーは、パラメータが SQL ステートメントにバインドされる方法に問題があることを示しています。
Yii のアクティブ レコード パターンと DAO (データ アクセス オブジェクト) のコンテキストで、このエラーが発生する特定のシナリオを考えてみましょう。
次のコードがあるとします。
$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();
このコードは、「users」テーブルに基づいてレコードを挿入しようとします。 $model オブジェクトの属性について。ただし、生成され、アプリケーション ログに記録されるクエリは次のようになります。
INSERT INTO users (username, password, ssn, surname, firstname, email, city, country) VALUES(:alias, :password, :ssn, :surname, :firstname, :email, :city, :country);
上記のクエリを、bindValue() 呼び出しのパラメータ名と比較してください。ユーザー名の値をバインドするためのパラメーター名は、SQL ステートメントで指定されている「:alias」ではなく、「:username」であることに注意してください。 Yii は、この不一致を「1 つのパラメーターが不足している」と解釈し、「SQLSTATE[HY093]」エラーを引き起こします。
この問題を解決するには、SQL ステートメント内のパラメーター名が、bindValue で使用されているパラメーター名と正確に一致していることを確認してください。 () 方法。この場合、SQL ステートメントのパラメータ名を「:username」に変更します。
「SQLSTATE[HY093]」エラーのその他の一般的な原因は次のとおりです。
これらの問題を効果的にトラブルシューティングするには、以下を追加して Yii 設定ファイルのパラメータログを有効にします。
'enableParamLogging' => true,
を DB 配列にコピーします。これにより、SQL クエリとバインドされたパラメーターに関する詳細情報が提供され、エラーの特定と修正が容易になります。
以上がYii で SQLSTATE[HY093] 'Invalid Parameter Number' エラーが発生するのはなぜですか? それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。