2017-05-31 50 views
1

我想知道如何可以防止SQL注入与我的搜索查询?不幸的是,我不得不使用字符串,因为我需要连接要搜索的名字和姓氏。我已经尝试过准备好的声明,但他们似乎也没有在这里工作。我希望有人能帮助我。谢谢。Codeigniter创建一个准备好的语句或使用活动记录搜索与concat

我的功能

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

笨的活动记录自动转义查询的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

嗨,非常感谢您的帮助!然而,当我试图寻找像john smith这样名字连接的东西时,由于某种原因没有出现任何东西。 – JianYA

+0

使用'echo $ this-> db-> last_query()'打印您的查询并在数据库中执行。调试查询什么错误@ JianYA – Nidhi

+0

SELECT * FROM agent_accounts as a 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}%'或phone_number LIKE'%{$ input}%'或aa.account_number LIKE'%{$ input}%'LIMIT 30 OFFSET 0 – JianYA