2017-05-31 13 views
1

私はこの検索クエリでSQLインジェクションを防ぐ方法を知りましたか?残念ながら、検索のために姓と名を連結する必要があるため、文字列を使用する必要がありました。私は準備文を試しましたが、ここでもうまく動作していないようです。誰かが私にこれを手伝ってくれることを願っているありがとうございました。Codeigniterはプリペアドステートメントを作成するか、concatで検索するためにアクティブレコードを使用します

My機能

public function admin_search($input,$limit,$start){ 
     $sql = "SELECT * FROM agent_accounts as aa LEFT JOIN person as p ON aa.person_id = p.id " 
       . "WHERE CONCAT_WS('', p.first_name, p.last_name) LIKE '%$input%' " 
       . "OR p.email LIKE '%$input%' OR p.phone_number LIKE '%$input%' " 
       . "OR aa.account_number LIKE '%$input%' LIMIT $limit OFFSET $start"; 
     $query = $this->db->query($sql); 
     if($query->num_rows()>0){ 
      foreach($query->result()as $row){ 
       $documents[] = $row; 
      } 
      return $documents; 
     }else{ 
      return false; 
     } 
    } 
+0

Codeigniterには、SQLインジェクションを防ぐ機能を持つ独自のデータベースクラスがあります。 – Akintunde007

答えて

0

CodeIgniterのアクティブレコードが自動的にSQLインジェクションからこの

$query = $this->db->get_where('table_name', array('id' => $id), $limit, $offset); 

同様

を防止するためのクエリを脱出しかし、あなたは、クエリの兄弟を使用する場合

はこれを試してみてください。

$sql = "SELECT * FROM agent_accounts as aa LEFT JOIN person as p ON aa.person_id = p.id " 
       . "WHERE CONCAT_WS('', p.first_name, p.last_name) LIKE ? " 
       . "OR p.email LIKE ? OR p.phone_number LIKE ? " 
       . "OR aa.account_number LIKE ? LIMIT ? OFFSET ?"; 
     $query = $this->db->query($sql,array('%{$input}%','%{$input}%','%{$input}%','%{$input}%',$limit,$start)); 

クエリの疑問符は自動的に配列の値に置き換えられます。

+0

こんにちは、ありがとうございました!しかし、最初と最後の名前であるジョン・スミスのようなものを検索しようとすると何らかの理由で何も表示されません。 – JianYA

+0

'echo $ this-> db-> last_query()'を使用してクエリを出力し、DBで実行します。デバッグ・クエリー何が問題なのですか?@ JianYA – Nidhi

+0

SELECT * FROM agent_accounts as a LEO JOIN person as p ON aa.person_id = p.id WHERE CONCAT_WS( ''、p.first_name、p.last_name)LIKE '%{$ input} '%{$ input}%'またはLIKE '%{$ input}%' LIMIT 30 OFFSET 0 – JianYA

関連する問題