ホームページ >バックエンド開発 >PHPチュートリアル >Yii で SQLSTATE[HY093] 'Invalid Parameter Number' エラーが発生するのはなぜですか? それを修正するにはどうすればよいですか?

Yii で SQLSTATE[HY093] 'Invalid Parameter Number' エラーが発生するのはなぜですか? それを修正するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-25 20:48:11156ブラウズ

Why Am I Getting the SQLSTATE[HY093]

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]」エラーのその他の一般的な原因は次のとおりです。

  • 忘れ指定されたパラメータにbindValue()を追加します。
  • プレースホルダに無効な文字がありますname.
  • 複雑なクエリで結合を使用する場合、CDataProvider Pagination と Sorting の間で競合します。

これらの問題を効果的にトラブルシューティングするには、以下を追加して Yii 設定ファイルのパラメータログを有効にします。

'enableParamLogging' => true,

を DB 配列にコピーします。これにより、SQL クエリとバインドされたパラメーターに関する詳細情報が提供され、エラーの特定と修正が容易になります。

以上がYii で SQLSTATE[HY093] 'Invalid Parameter Number' エラーが発生するのはなぜですか? それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。