Перед созданием новой темы, пожалуйста, ознакомьтесь с FAQ по LinkorCMS

Записи в таблице config вперемежку

Супер пользователь
Сообщений: 38
Почему в таблице config записи настроек не по порядку?
Из-за этого в настройках модуля получается "каша".
Разработчик
Сообщений: 605
Ну как сказать не по порядку. Таблица нормальная, ничего страшного в ней нет. Порядка вывода технически нет, так как код отображения формы настроек делает выборку из базы без указания сортировки, но как правило все будет в порядке добавления записей (БД без явного указания сортировки в запросе не обязана упорядочивать данные в выборке (могут быть в произвольном порядке), но логично, что она будет производить выборку линейно. то есть, в данном случае записи скорее всего будут "отсортированы" по столбцу id. если подробнее, то надо копать в дебри внутренних индексов и движков у мускула). Добавить явное указание на сортировку по id можно в admin_template.class.php, чтобы не надеяться на авось. Можно и ввести какую-то колонку order и тогда порядок вывода у вас будет, хоть и потребует некоторой модификации системы.

-- Изменено "Мартин": 23.12.2015 03:03 --
Супер пользователь
Сообщений: 38
Если вибирает линейно, то почему такая каша?
Инсталятор запихивает настройки по-порядку, что подтверждают присвоенные id.
Разработчик
Сообщений: 605
Объясните что вы понимаете под "кашей"?

dimajak:
Если вибирает линейно, то почему такая каша?
Инсталятор запихивает настройки по-порядку, что подтверждают присвоенные id.

Установщик системы просто копирует заложенную в нем БД.
Супер пользователь
Сообщений: 38
Мартин:
Объясните что вы понимаете под "кашей"?

Если посмотреть на скрин, то увидим порядок id - 222, 221, 220, 219, 218, 229, 230...
Хотя линейная выборка должна быть иная.
Просто не хотел городить ручной вывод настроек и воспользовался
System::admin()->AddConfigsForm


Но это уже не актуально, т.к. пересмотрел концепцию и вынес эти настройки модуля в настройки блока. Всё равно они используются в блоке для вывода.
Разработчик
Сообщений: 605
dimajak:
Если посмотреть на скрин, то увидим порядок id - 222, 221, 220, 219, 218, 229, 230...
Хотя линейная выборка должна быть иная.

Как я уже писал, по стандартам SQL нет какой-либо определенности в выводе, если в запросе нет указаний о сортировке. Может быть выведено как угодно. Если рассматривать MySQL и практически это, то на порядок вывода могут влиять какие-то внутренние индексы и другое.

Метод AddConfigsForm() не дает явных указаний в своих запросах, так что данные могут быть выведены как угодно (и тем более модуль администрирования БД, который вообще не знает зачем эта таблица нужна и какие данные в ней. тот же phpMyAdmin так же не знает, но он в таких вещах полагается вроде на primary индексы).

Если хотите чтобы настройки выводились отсортированными по id, то укажите это в методах Select. Его аргументы:
/**
* Выбирает записи из таблицы.
* @param $Name Имя таблицы
* @param string $Where Условия выборки
* @param null $Limit Ограничение выборки, число первых элментов, или массив array(start, length)
* @param null $Order Сортировка результатов (имя колонки или массив колонок)
* @param bool $OrderDesc Сортировать в обратном порядке (логическое значение или массив значений)
* @return mixed
*/
public function &Select($Name, $Where = '', $Limit = null, $Order = null, $OrderDesc = false){
Супер пользователь
Сообщений: 38
Про public function &Select() я в курсе, ведь она была одна из первых в изучении LinkorCMS.
Но при использовании
System::admin()->AddConfigsForm
нет возможности указать порядок сортировки селекта.
Хорошо, соглашусь на версию, что мускул выдаёт как ему захочется. Тем более, что я вспомнил давний подобный случай.
Мне это сейчас не принципиально и настройки я перенёс в блок.
Спасибо.
Разработчик
Сообщений: 605
dimajak:
Но при использовании
System::admin()->AddConfigsForm
нет возможности указать порядок сортировки селекта.

Просто модифицируйте метод. Тут уж никак иначе его не заставить.

dimajak:
Хорошо, соглашусь на версию, что мускул выдаёт как ему захочется

Ну не как он хочется. Если хочется все же копнуть глубже, то вот хоть цитата с офф форума мускул:
* Do not depend on order when ORDER BY is missing.
* Always specify ORDER BY if you want a particular order -- in some situations the engine can eliminate the ORDER BY because of how it does some other step.
* GROUP BY forces ORDER BY. (This is a violation of the standard. It can be avoided by using ORDER BY NULL.)

SELECT * FROM tbl -- this will do a "table scan". If the table has never had any DELETEs/REPLACEs/UPDATEs, the records will happen to be in the insertion order, hence what you observed.

If you had done the same statement with an InnoDB table, they would have been delivered in PRIMARY KEY order, not INSERT order. Again, this is an artifact of the underlying implementation, not something to depend on.
Гости не могут отвечать на темы. Войдите или Зарегистрируйтесь.
Здесь присутствуют
(пользователей: 0, гостей: 1)
Быстрый переход: