2012-02-27 17 views
1

codeigniterアクティブレコードを使用してデータベーステーブルに単一のレコードを追加しようとしています。元のデータはXMLから解析され、データが存在し、それぞれの変数名で正しいことがテストされました。Codeigniterアクティブレコード一重引用符付きのクエリを挿入

データは、このようなビューにコントローラから渡されます。

$data['questionId'] = $question['id']; 
$data['answerText'] = $question->answer; 
$q = $this->mobile_user_model->save_actual_answers($data); 

とモデルの挿入機能は次のようになります。

function save_actual_answers($data) { 
    $insert = array(
     'answerText' => $data['answerText'], 
     'responseId' => $data['responseId'], 
     'questionId' => $data['questionId'] 
    ); 
    $q = $this->db->insert('actual_answers', $insert); 
    return $q; 
} 

私が午前問題はCodeIgniterのではないということですanswerTextに指定された文字列値に一重引用符を自動的に追加します。私は、関数を実行すると、私はこのエラーを取得:

Error Number: 1054 
Unknown column 'Dan' in 'field list' 
INSERT INTO `actual_answers` (`answerText`, `responseId`, `questionId`) 
VALUES (Dan, 12, 7) 

これはanswerTextの値が(この場合の値ダン)単一引用符なしのCodeIgniterで表に入力されるようにしようとしていることを私に伝えます。しかし、私は自分自身を単一引用符をハードコーディングし、そうのように、answerTextデータにそれらを追加した場合:

'answerText' => "'" . $data['answerText'] . "'" 

をクエリが正常に動作しますが、単一引用符は、テーブルに文字列を追加し、その内のレコードデータベースは次のようになります。

'Dan' 12 7 

誰も前にこの問題に遭遇したか、私は私が見ることのできない大幅何か間違ったことをやっていますか?

答えて

2
$data['questionId'] = $question['id']; 
$data['answerText'] = $question->answer; 

これら2つの行は私には疑問に思えるようです。最初の行、$ questionは配列で、2行目に質問はプロパティの答えを得るオブジェクトですか?あなたは本当にあなたはログにPHPのエラーを取得していないですか?

また、アクティブレコードinsertのドキュメントには、非常に明確に記載されています。注:すべての値は自動的にエスケープされ、より安全なクエリを生成します。質問から、推測することはあまりないので、修正を行ったかどうかは本当にわかります。私はあなた自身を引用するのではなく、図書館escape functionを使用して引用するべきだと思います。何かのように

$insert = array(
     'answerText' => $this->db->escape_str(data['answerText']), 
     'responseId' => $data['responseId'], 
     'questionId' => $data['questionId'] 
); 
3

お返事ありがとうございます。コードがそのような理由は、idがquestionの属性であり、答えがXMLの質問の子要素であるためです。合ってます。私は実際に次のように修正しました:

$insert = array(
     'answerText' => (string)$data['answerText'], // Needed to declare it was a string 
     'responseId' => $data['responseId'], 
     'questionId' => $data['questionId'] 
    ); 

私はハックのようですが、うまくいきました。問題は、私はこの宣言なしで文字列を挿入するためにプロジェクトの他の部分でこの挿入配列を使用しており、正常に動作します。私はなぜこのケースでそれがしなかったのか分からない。

+1

Jasonwの提案と本質的に同じではありませんか? – jogojapan

+0

それは同じじゃない? – SheedySheedySheedy

+0

Jasonwの答えが根底にあるように見えますが、Jasonwの答えを受け入れなかったことに気付いただけです。しかし、おそらく私は重要な違いを見逃しています。混乱させて申し訳ありません。 – jogojapan

関連する問題