2012-11-14 40 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' ='健康\&娛樂' –