История изменений
Исправление 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 не будет пытаться защищать имена полей и таблиц обратными кавычками.
Что же делать?