Ошибка MySQL 1064 при выполнении запроса SELECT - PullRequest
0 голосов
/ 29 марта 2012

У меня есть такой код:

function search_keyword(){
            $keyword = trim($_POST['keyword']);
            $search_explode = explode(" ", $keyword);
            $x = 0;

            $sql = " ( SELECT  name, id_global_info AS id, body AS body, tag AS tag  ,info_type_id AS info_type, \"global_info\" AS mytable FROM global_info WHERE ";
            foreach($search_explode as $each){
                $x++;
                if($x == 1){
                   $sql .= " name LIKE '%$each%' ";}                          
                else {

                    $sql .= " AND name LIKE '%$each%' ";
                }
            }

              $sql .= " ) UNION ALL "; 

              $sql .= " ( SELECT name, id_person AS id, surname AS body, info AS tag , location AS info_type, \"person\" AS mytable FROM person WHERE ";
            foreach($search_explode as $each){
                $x++;
                if($x == 1){
                   $sql .= " name LIKE '%$each%' ";}                          
                else {

                    $sql .= " AND name LIKE '%$each%' ";
                }
            }

              $sql .= " ) UNION ALL ";

              $sql .= "( SELECT name, id_event AS id, body AS body, caffe_id AS tag , date AS info_type, \"event\" AS mytable FROM event WHERE ";
            foreach($search_explode as $each){
                $x++;
                if($x == 1){
                   $sql .= " name LIKE '%$each%' ";}                          
                else {

                    $sql .= " AND name LIKE '%$each%' ";
                }
            }

            $sql .= " ) UNION ALL ";

              $sql .= "( SELECT name, id_caffe AS id, description AS body, adress AS tag, location_id AS info_type, \"caffe\" AS mytable FROM caffe WHERE ";
            foreach($search_explode as $each){
                $x++;
                if($x == 1){
                   $sql .= " name LIKE '%$each%' ";}                          
                else {

                    $sql .= " AND name LIKE '%$each%' ";
                }
            }

            $sql .= " ) ";
            echo $sql;
            $q = $this->db->query($sql);
             return $q = $q->num_rows() == 0 ? FALSE :  $q->result();
        }

Когда я ищу пример

"Мали огласи"

Я получаю следующую ошибку:

Номер ошибки: 1064

У вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного использования синтаксиса возле 'И имя LIKE'% mali% 'И имя LIKE'% oglas% ') UNION ALL ( ВЫБЕРИТЕ имя, id_e 'в строке 1

Это запрос MySQL, который он производит:

( SELECT name, id_global_info AS id, body AS body, tag AS tag ,info_type_id AS info_type, "global_info" AS mytable FROM global_info WHERE name LIKE '%mali%' AND name LIKE '%oglas%' )
 UNION ALL
 ( SELECT name, id_person AS id, surname AS body, info AS tag , location AS info_type, "person" AS mytable FROM person WHERE AND name LIKE '%mali%' AND name LIKE '%oglas%' ) 
UNION ALL
 ( SELECT name, id_event AS id, body AS body, caffe_id AS tag , date AS info_type, "event" AS mytable FROM event WHERE AND name LIKE '%mali%' AND name LIKE '%oglas%' ) 
UNION ALL
 ( SELECT name, id_caffe AS id, description AS body, adress AS tag, location_id AS info_type, "caffe" AS mytable FROM caffe WHERE AND name LIKE '%mali%' AND name LIKE '%oglas%' ) 

В чем ошибка?

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Перво-наперво: не забудьте уйти от введенного значения.Это может быть сделано в вашем случае либо на начальном значении, либо для каждой итерации цикла foreach на $each

// If your query() method calls mysql_query()
$keyword = mysql_real_eascape_string(trim($_POST['keyword']));
// Or if query() is mysqli::query()
$keyword = $this->db->real_escape_string(trim($_POST['keyword']));
// Or if this is Codeigniter's API
$keyword = $this->db->escape_like_str(trim($_POST['keyword']));

Вам необходимо сбросить $x в начале каждого цикла foreach:

       // Reset $x to 0 before the start of each of your loops.
       $x = 0;
       foreach($search_explode as $each){
            $x++;
            if($x == 1){
               $sql .= " name LIKE '%$each%' ";}                          
            else {

                $sql .= " AND name LIKE '%$each%' ";
            }
        }

Примечание : как правило, рекомендуется использовать параметризованные запросы вместо построения запроса путем конкатенации и интерполяции.Codeigniter использует для этого ? заполнители.

0 голосов
/ 29 марта 2012

Ошибки вашего запроса находятся во втором, третьем и четвертом операторах SELECT, поскольку у вас есть WHERE AND name вместо WHERE name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...