2015-10-22 6 views
2

Я строю поиск по сайту с помощью выделенных ящиков, чтобы получить определенные категории & регионов. Если выбрано, я включаю его в запрос, но по какой-то причине, используя LIKE, он игнорирует раздел WHERE запроса!?!? Почему это или что я делаю неправильно?CodeIgniter 3 Запрос ESCAPE '!' Игнорирование инструкции WHERE?

Когда эхо запрос, построенный Codeigniter я получаю fololowing: (Обратите внимание на ESCAPE '!')

запросов эхо:

 SELECT SQL_CALC_FOUND_ROWS null as rows, ads.id AS id, location, provLabel, text, 
    adcat.id AS catid, ads.subcatid AS subcatid, ads.province R_rand, r_option, addate, 
    adcat.name AS catname, adsubcat.name AS subname, f_value, adtitle, ads.area, regionLabel, 
    adlink 
    FROM `ads` 
    JOIN `search_town` ON `search_town`.`townId`=`ads`.`townId` 
    JOIN `search_region` ON `search_region`.`regionId`=`ads`.`area` 
    JOIN `search_prov` ON `search_prov`.`provId`=`ads`.`province` 
    JOIN `adcat` ON `adcat`.`id`=`ads`.`catid` 
    JOIN `adsubcat` ON `adsubcat`.`id`=`ads`.`subcatid` 
    LEFT JOIN `adfields` ON `adfields`.`ad_id`=`ads`.`id` 
    WHERE `ads`.`catid` != 8 AND `ads`.`adactive` = 1 AND `scam` =0 AND `ads`.`province` = '1' 
    AND `ads`.`catid` = '3' AND `text` LIKE '%Nissan%' ESCAPE '!' 
    OR `f_value` LIKE '%Nissan%' ESCAPE '!' 
    GROUP BY `ads`.`id` 
    ORDER BY `addate` DESC 
    LIMIT 10 

Вот фактический запрос в контроллере :

 public function get_search($fsearch, $fcategory, $fprovince, $farea, $limit, $start) 
    { 
     if($fcategory >=1){ 
     $incl_cat=" AND ads.catid='$fcategory'"; 
     }else{ 
     $incl_cat=''; 
     } 
     if($fprovince>=1){ 
     $incl_prov=" AND ads.province='$fprovince'"; 
     }else{ 
     $incl_prov=''; 
     } 
     if($farea >= 1){ 
     $incl_area=" AND ads.area='$farea'"; 
     }else{ 
     $incl_area=''; 
     }        

     $this->db->select('SQL_CALC_FOUND_ROWS null as rows, ads.id AS id, location, provLabel, text, adcat.id AS catid, ads.subcatid AS subcatid,ads.province 
     R_rand, r_option, addate, adcat.name AS catname, adsubcat.name AS subname, f_value, adtitle, ads.area, regionLabel, 
     adlink', FALSE); 
     $this->db->from('ads'); 
     $this->db->join('search_town', 'search_town.townId=ads.townId'); 
     $this->db->join('search_region', 'search_region.regionId=ads.area'); 
     $this->db->join('search_prov', 'search_prov.provId=ads.province'); 
     $this->db->join('adcat', 'adcat.id=ads.catid'); 
     $this->db->join('adsubcat', 'adsubcat.id=ads.subcatid'); 
     $this->db->join('adfields', 'adfields.ad_id=ads.id', 'left'); 
     $where = "ads.catid!=8 AND ads.adactive=1 AND scam=0 $incl_prov $incl_cat $incl_area"; 
     $this->db->where($where); 
     $this->db->like('text', $fsearch); 
     $this->db->or_like('f_value', $fsearch); 
     $this->db->group_by("ads.id"); 
     $this->db->order_by('addate', 'DESC'); 
     $this->db->limit($limit, $start); 
     $query = $this->db->get(); 
     $return = $query->result_array(); 
     echo $this->db->last_query(); 
     $total_results=$this->db->query('SELECT FOUND_ROWS() count;')->row()->count; 
     $this->session->set_userdata('tot_search', $total_results); 
     return $return; 

    } 
+0

«ESCAPE»! »Не влияет на ваш запрос и является вполне приемлемым синтаксисом SQL. Это означает, что если вы хотите найти буквенный экземпляр символа подстановки, перед ним следует '!'. Это не влияет на ваши результаты. – DFriend

+0

Спасибо @DFriend. Очень признателен. – Howzit

+0

Полагаю, ваш запрос не возвращает результаты? – DFriend

ответ

2

Ваш WHERE условие

a AND b AND c AND d AND ... AND x OR y 

Если y истинно, то все условие WHERE является истинным.

Возможно, вы имели в виду:

a AND b AND c AND d AND ... AND (x OR y) 

экранирующий символ по умолчанию для \, но это выглядит как CodeIgniter изменилось это ! для вас (по-видимому, потому что \ уже побег в PHP, так что иногда вам нужно кратные и это может ввести в заблуждение).

В настоящее время это не относится к вашему запросу. Это будет использоваться только в том случае, если вам необходимо сопоставить % или _ с !% или !_ (по умолчанию \% или \_).

+0

Ах! Спасибо, что указали это @Arth. Иногда чувствуешь себя идиотом, пропавшим без вести! – Howzit

+0

Еще один вопрос @Arth. Как будет выглядеть запрос: $ this-> db-> like ('text', $ fsearch); $ this-> db-> or_like ('f_value', $ fsearch); находится в формате (x или y)? – Howzit

+0

Я не знаю, как воспламенитель кода, но я думаю, что это где-то в документах – Arth