Получение ошибки синтаксиса mysql с использованием codeigniter LIKE активной записи

Это мой код

return $this->db
            ->select('organization')
            ->like('title',$this->db->escape_str($query))
            ->or_like('description',$this->db->escape_str($query))
            ->get('shop_search')
            ->num_rows();

все работает хорошо, пока есть ' и не " в $query,

ошибка: $query="d'"

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' OR `description` LIKE '%d\\\\\\'%'' at line 3

SELECT `organization` FROM `default_shop_search` WHERE `title` LIKE '%d\\\\\\'%' OR `description` LIKE '%d\\\\\\'%'

Что мне здесь не хватает?

ОБНОВИТЬ:

дамп пройденного запроса:

Debug #1 of 1: string(2) "d'"

2 ответа

Использование

$query = mysql_real_escape_string($query);

return $this->db
            ->select('organization')
            ->like('title',$query)
            ->or_like('description',$query)
            ->get('shop_search')
            ->num_rows();

Вам не нужно вручную экранировать параметр, когда вы используете CI Active Record Class, просто удалите $this->db->escape_str() метод:

return $this->db
        ->select('organization')
        ->like('title', $query)
        ->or_like('description', $query)
        ->get('shop_search')
        ->num_rows();

Из руководства пользователя CI:

$this->db->like()

Примечание. Все значения, передаваемые этому методу, автоматически экранируются.

Обновить

Хорошо, вот мой тест-кейс:

$query = "e'";
$res = $this->db
            ->select()
            ->like('title', $query)
            ->or_like('description', $query)
            ->get('shop_search')
            ->num_rows();

var_dump($this->db->last_query());
// Output: string(96) "SELECT * FROM (`myPrefix_shop_search`) WHERE `title` LIKE '%e\'%' OR `description` LIKE '%e\'%'"

var_dump($res);
// Output: int(1)

Как я и ожидал, AR добавил только одну обратную косую черту, чтобы избежать $query, Я запускаю этот тест на CI v2.1.4.

Пожалуйста, пересмотрите свою логику, и если вы не нашли ничего плохого, поделитесь более необходимым кодом, я весь слух.

Другие вопросы по тегам