5

私はcodeigniterを使用しており、ほとんどの場合、クエリにアクティブレコードを使用しています(自動的にエスケープされます)が、変数が原因で、このクエリはうまく収まらないようです。したがって、クエリを手動でエスケープする方法を理解する必要があります。

Codeigniterのドキュメントでは、次の方法でクエリをエスケープすることを提案しています。

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";

私の元のクエリ

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'";

私のエスケープされたクエリ

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")";

しかし、構文を正しく理解するのに問題があります。エラーメッセージは次のとおりです。

  • PHPエラーメッセージ:未定義の変数:user_language
  • SQLエラー:構文が間違っています...1行目の「VALUES(NULL)」の近く
4

2 に答える 2

12
$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id);

$ idで指定されたユーザーの言語を選択する場合は、そのように機能するはずです。

代替の数字を扱うことは次のようになります:

$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . (int)$id;

codeigniterは、「クエリバインディング」としてプリペアドステートメントもサポートしています。

バインドを使用することの2番目の利点は、値が自動的にエスケープされ、より安全なクエリが生成されることです。データを手動でエスケープすることを覚えておく必要はありません。エンジンが自動的にそれを行います。

于 2012-05-03T16:19:22.287 に答える
4

CIでActiveRecordクラスを使用できないと言う理由がわかりません。これは単純なSQL呼び出しです(以下の例ではメソッドチェーンを使用しています)。

$this->db->select('*')->from('user_language')->where('user_id', $id);
$query = $this->db->get();

その後、あなた$idは適切に脱出され、注射を軽減します。個人的には可能な限りARを使用しているので、SQL呼び出し(カスタムクエリ)の悪い点を気にせずに、すばやく効率的なコードを記述できます。

于 2012-05-03T17:01:19.497 に答える