2012-06-10 36 views
8

CodeIgniterを使用してMySQLテーブルにデータを挿入しています。 INSERT IGNORE INTOを使用しているため、この機能を有効にするためにアクティブなレコードクラスを編集したくないので、SQLクエリを手動で生成しています。CodeigniterでSQLクエリをエスケープする

$this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type) 
         VALUES ('" . $data['lat'] . "', '" . $data['lng'] . "', '" . $data['date'] . "', '" . $data['type'] . "')"); 

問題:$data['type']内の文字列は、単一引用符が含まれていたときに、クエリが失敗しました。アクティブなレコードを使用するときのように、エスケープする必要があるこれらの文字が自動的にエスケープされるようにするにはどうすればよいですか?

答えて

19

次のとおりです。

$sql = "INSERT IGNORE INTO my_table(lat, lng, date, type) VALUES (?,?,?,?);"; 
$this->db->query($sql, array($data['lat'], $data['lng'], $data['date'], $data['type'])); 
+2

さらに簡単にすることができます: '$ this-> db-> query($ sql、$ data);' これは私のために働きます! (私はそれが動作するために、データ配列内の他のキーを持っているべきではないと思う) – Saneem

+0

またはそれをActive Record Patternに書き直してください: '$ this-> db-> inset( 'some_table'、$ data);'もっとストレートフォワードと非常に簡単です。 'if(!isset($ data ['id']))throw new {InvalidArgumentException( 'data [id]は許可されていません。 for insert '); } ' – Roland

7

use $ this-> db-> escape();それが唯一の 文字列データを逃れることができるようにそれは、文字列をエスケープします自動的

この関数は、データ型を決定します。また、自動的にデータ 周りの単一引用符を追加しますので、あなたがする必要はありません。ここで

$this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type) 
VALUES ('" . $this->db->escape($data['lat']) . "', '" . $this->db->escape($data['lng']) . "', '" . $this->db->escape($data['date']$this->db->escape . "', '" . $this->db->escape($data['type']) . "')"); 

参照は、もう一つの方法は、自動的にすべての値をエスケープしているバインディングクエリを使用することですClick Here

+4

ページの最後に、結合パラメータに関するセクションは*ずっと*良いオプションです。) – d11wtq

+0

更新されたリンク:https://www.codeigniter.com/userguide2/d atabase/queries.html –

+0

$ this-> db-> escape()は一重引用符を追加するので、クエリに追加する必要はありません(バージョン違いかどうかわかりません私は3.1を使用しています。*)今日の前半は質問を書いていましたが、私はこの間違いを犯した問題に直面しました。 – yaxe

関連する問題