LINUX.ORG.RU

История изменений

Исправление Xintrea, (текущая версия) :

кстати да, покажи как ты формируешь query, по идее должно быть как-то так:
$this->db->where('table_name', 'articles');

Я засовываю WHERE в виде строки, так как условие берется из специального XML-файла с конфигом проекта.

Вот кусок документации CodeIgniter:

$this->db->where();

Эта функция позволяет установить условие WHERE одним из четырех методов:

4. Специальная строка:

Вы можете писать запросы вручную:

$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

Я засовываю WHERE, для теста, вот так (один-в-один как в документации!):

$where="table_name='articles'";
$this->db->where($where);

где «table_name='articles'» - в реальном проекте берется из XML конфига. И CodeIgniter тупо обрамляет все это выражение обратными апострофами:

SELECT `id`, `allocate_id` FROM (`lt_sys_allocate_id_history`) WHERE `table_name='articles'` ORDER BY `id`

А нужно:

SELECT `id`, `allocate_id` FROM (`lt_sys_allocate_id_history`) WHERE `table_name`='articles' ORDER BY `id`

Кстати, такое обрамление нормально прожевывает SQLite, но не может прожевать MySQL. У SQLite, правда, драйвер рисует прямые апострофы, а внутри такого обрамления можно пользоваться кавычками. То есть, в случае SQLite будет сгенерирован и нормально выполнен запрос:

SELECT 'id', 'allocate_id' FROM ('lt_sys_allocate_id_history') WHERE 'table_name="articles"' ORDER BY 'id'

Мне подсказывают, что можно воспользоваться решением:

$this->db->where($where, NULL, FALSE)

Однако, такое решение - серьезный удар по безопасности, ибо:

$this->db->where() принимает третий опциональный параметр. Если вы установите его в FALSE, CodeIgniter не будет пытаться защищать имена полей и таблиц обратными кавычками.

Что же делать?

Исходная версия Xintrea, :

кстати да, покажи как ты формируешь query, по идее должно быть как-то так:
$this->db->where('table_name', 'articles');

Я засовываю WHERE в виде строки, так как условие берется из специального XML-файла с конфигом проекта.

Вот кусок документации CodeIgniter:

$this->db->where();

Эта функция позволяет установить условие WHERE одним из четырех методов:

4. Специальная строка:

Вы можете писать запросы вручную:

$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

Я засовываю WHERE, для теста, вот так:

$where="table_name='articles'";
$this->db->where($where);

где «table_name='articles'» - в реальном проекте берется из XML конфига. И CodeIgniter тупо обрамляет все это выражение обратными апострофами:

SELECT `id`, `allocate_id` FROM (`lt_sys_allocate_id_history`) WHERE `table_name='articles'` ORDER BY `id`

А нужно:

SELECT `id`, `allocate_id` FROM (`lt_sys_allocate_id_history`) WHERE `table_name`='articles' ORDER BY `id`

Кстати, такое обрамление нормально прожевывает SQLite, но не может прожевать MySQL. У SQLite, правда, драйвер рисует прямые апострофы, а внутри такого обрамления можно пользоваться кавычками. То есть, в случае SQLite будет сгенерирован и нормально выполнен запрос:

SELECT 'id', 'allocate_id' FROM ('lt_sys_allocate_id_history') WHERE 'table_name="articles"' ORDER BY 'id'

Мне подсказывают, что можно воспользоваться решением:

$this->db->where($where, NULL, FALSE)

Однако, такое решение - серьезный удар по безопасности, ибо:

$this->db->where() принимает третий опциональный параметр. Если вы установите его в FALSE, CodeIgniter не будет пытаться защищать имена полей и таблиц обратными кавычками.

Что же делать?