[解決済み] 「無効なパラメータ番号:パラメータが定義されていない」 データを挿入する
質問
私はしばらくの間、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 を使用すると、おかしなコンフリクトが発生する。
together
と
joins
. これを特徴づける具体的で簡単な方法はありませんが、CDataProvidersで複雑なクエリを使用する場合、パラメータが脱落してこのエラーが発生する奇妙な問題がありました。
Yiiでこれらの問題をトラブルシューティングするのに非常に役立つ方法の1つは、以下の通りです。
パラメータロギングを有効にする
を設定ファイルに追加してください。これをあなたの
db
の配列で指定します。
'enableParamLogging'=>true,
そして、必ず
CWebLogRoute
のルートは、あなたの
log
セクションを作成します。これにより、エラーが発生したクエリと、バインドしようとしたすべてのパラメータが出力されます。とても便利です。
関連
-
[解決済み】Notice: 非オブジェクトのプロパティを取得しようとしているエラー
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: パラメータが定義されていません
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】mysqli::query(): mysqli をフェッチできない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】++と*+の意味は何ですか?
-
[解決済み】不明なMySQLサーバーのホスト
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】新しいPHPMailerはPHPMailerAutoload.phpが必要?
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み】In_arrayが動作しない。
-
[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?