0

準備済みステートメントに SQL を使用するデータ アクセス オブジェクトには、SQL 変数とバインド変数が初期化された文字列がいくつかあります。その一つは

private $insertQuestionSql = "
INSERT IGNORE INTO bgt.question_models (nodeId, questionId, parentId, state, version,
questionText, userResponseText) 
VALUES (NID, QID, PID, ST, V, QT, URT)";

このステートメントは、DAO 関数と同じクラスで宣言され、使用されます

public function createQuestion(QuestionTemplateModel $qt) {
  //create database connection and initialize transaction
  $connection = Yii::app()->db;
  $transaction = $connection->beginTransaction();

  try {
    $command = $connection->createCommand($this->insertQuestionSql);

Yii では、$connectionは のインスタンスであり、関数を介して のCDbConnectionインスタンスを返します。CDbCommandcreateCommand

クラス内でこのプロパティにアクセスしているので、文字列変数にアクセスできるはずです。ここでそれが起こらないのはなぜですか?

完全なエラーは

"Unknown property 'insertQuestionSql' for class 'QuestionDAOTest'."

この動作は、

  • SQL 文字列の変更
  • 最初の改行文字を削除する

$this->また、結果を削除するとundefined variable: insertQuestionSqlエラーになります。これは、アクセス修飾子を両方に変更しても発生しpublicますprotected

4

1 に答える 1

0

これが誰かに役立つかどうかはわかりませんが、解決策を見つけました。

まず、変数がバインドされるプレースホルダーにはプレフィックスが必要CDbCommand::bindParamな標準の PHP 構文に従います。そのプレフィックスがないと、変数は SQL ステートメントにバインドされませんでした。PDOStatement::bindParam():

次に、何らかの理由で、変数を呼び出すときprivate $insertQuestionSqlに接頭辞を使用しているにもかかわらず、クラス内でアクセスすると常に不明なプロパティであることが判明しました。$this->プロパティをに変換してstatic呼び出すことで、これを回避しました

$command = $connection->createConnection(QuestionDAO::$insertQuestionSql);
于 2013-06-06T18:31:07.563 に答える