2012-11-14 39 views
0

我想有过滤器下拉菜单在我的CMS符号 我的模型看起来像笨查询在条件字符串

public function load($sort,$order,$key,$value) 
{ //  $key='listening'; //  $value="1"; 
      //configure pagination 
    $config=array(
     'base_url'=>base_url().'/index.php/companies/index', 
     'total_rows'=>$this->db->get('company')->num_rows(), 
     'per_page'=>$this->settings_model->get_per_page(), 
     'num_links'=>20 
    ); 

    $this->pagination->initialize($config); 



    $this->db->select('company.id, 
         company.name, 
         company.logo, 
         company.status_id, 
         company.listening',FALSE); 
    $this->db->select('company_category.name as category, 
         company_category.id as category_id',FALSE); 

    $this->db->select('complain_status.cs_status as status',false); 
    $this->db->from('company'); 
    $this->db->join('company_category','company_category.id = company.category_id'); 
    $this->db->join('complain_stastus', 'complain_status.cs_id = company.status_id'); 



    if(isset($_POST['key'])) 
    { 
     $value= str_replace('&nbsp', ' ', $_POST['value']); 
     var_dump($value); 
     if($value!='0') 
      $this->db->having ($_POST['key'], mysql_real_escape_string($value)); 

    } 
    if($sort!='' || $sort!=NULL) 
     $this->db->order_by ($sort, $order); 

    $this->db->limit($config['per_page'], $this->uri->segment(3)); 

    $result=$this->db->get(); 
    if(!isset($_POST['key'])) 
     $this->filter->set_filters_list($result->result_array()); 

    return $result->result(); 
} 

产生下面的查询

SELECT company.id, company.name, company.logo, company.status_id, company.listening, company_category.name as category, company_category.id as category_id, complain_status.cs_status as status 
FROM (`company`) 
JOIN `company_category` ON `company_category`.`id` = `company`.`category_id` 
JOIN `complain_status` ON `complain_status`.`cs_id` = `company`.`status_id` 
HAVING `category` = 'Health & recreation' 
LIMIT 20 

,你可以在这里看到的是当类别等于一些字符串与特殊字符如Health & recreation它的问题,它失败,即使我试图查询生成的查询它通常在MYSQL上正常工作,并得到我的结果

注:我替换m的空间$value= str_replace('&nbsp', ' ', $_POST['value']);因为这个数据来自于失败时,它有选择的空间,所以我不得不来解析,并在后端代码提前

后来删除

由于选择HTML元素

+1

你怎么知道这就是生成的查询?你使用'echo $ this-> db-> last_query()'来确保这是正在生成的查询吗? – Catfish

+0

没有其实我只是拼错在查询中的任何东西,如错误的表名,我从ajax响应生成的错误得到它.. –

回答

2

代码点火器可能是html_encoding&符号,它读取它的html值。您可以通过添加此行到任何控制器的构造函数通过打开探查comfirm这或型号您捉迷藏查询中:

$this->output->enable_profiler(TRUE); 

,如果我是正确的查询将有取代类似&其中&应该。

注意探查,同时使用$this->db->last_query()仍然显示了&

+0

我用探查器,我得到 HAVING'category' ='健康与休闲',这是真的奇怪的相同的查询正在运行在MySQL和工作正常@jJohn B –

+0

嗯。您可以尝试通过sql运行查询,除了使用&#amp;和&代替&。 Se如果其中任何一项工作。 – Rooster

0

要插入符号到数据库中揭示了&,你需要先逃跑的值。在PHP中,你通常会使用:mysql_real_escape_string()

How to insert special characters into a database?

然而,正如你在笨这样做,你必须使用查询自动进行转义的数据绑定,

$category = $this->input->post('category'); 
$status = $category = $this->input->post('status'); 
$status_id = $category = $this->input->post('status_id'); 

$sql = "SELECT * FROM company WHERE category = ? AND status = ?"; 

$this->db->query($sql, array($category, $status)); 

http://ellislab.com/codeigniter/user_guide/database/queries.html(查询下结合)

Does CodeIgniter automatically prevent SQL injection?

Alt键尽管它不是原始问题的一部分,但是你的代码存在缺陷,因为你没有任何过滤就使用$ _POST ['value']。没有什么能阻止某人从SQL注入你的表单。

How can I prevent SQL injection in PHP?

+0

感谢Jarret为您的回应,但我的问题与选择不插入值,我已使用转义字符串功能,但行为相同,这只是在CMS中添加一个条件在查询中的过滤器 –

+0

尝试在&符号前添加正斜杠“&”,以便它显示:'category' ='健康\&娱乐' –