Страница 1 из 1

ORDER BY RAND() в CI 1.7

СообщениеДобавлено: 22 янв 2009, 11:13
maxnag
Вчера нашел ошибку в неправильном формировании запроса.
Делаю так
Код: Выделить всё
$this->db->order_by('some_field','random');
на выходе должно быть ORDER BY RAND() получаю ORDER BY ` RAND().

Начал копать, разобрался (сделал у себя для мускуля). Ищем в файле /system/database/drivers/mysql/mysql_driver.php метод function _escape_identifiers($item) (431 строка, если ничего не трогали). В нем есть в возврате данных ф-цией. Дело в том, что переменая $item для текущей сортировки не нужна, а в методе стоит проверка на двойные ``, ну если мы уже в запросе ввели, тогда метод должен исключить дубликаты. Поулчается, т.к. переменной нет, то идет `` и регуляркой обрезаем одну ` и получаем ошибку в запросе.

Было:
Код: Выделить всё
return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str);


Сделал:
Код: Выделить всё
return (!empty($item)?preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str):'');


оказывается уже такое сообщение на родном БТ было
http://codeigniter.com/bug_tracker/bug/bug_in_170_database_class_when_doing_random_in_order_by/,
но решил отписаться сюда :) Чего доброе дело не сделать.