Получение ошибки синтаксиса 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.
Пожалуйста, пересмотрите свою логику, и если вы не нашли ничего плохого, поделитесь более необходимым кодом, я весь слух.