абстрагированно с помощью PEAR DB или другого класса
25%
[ 1 ]
Всего голосов : 4
Автор
Сообщение
vohomov Хостинг — это наше всё!
Зарегистрирован: 17.07.2009 Сообщения: 183
20631
Добавлено: Чт, 20 Авг, 2009 13:13 Заголовок сообщения: Обмен местами записей в MySQL
Добрый день, друзья.
Хотел бы узнать мнение знающих по-поводу того, как лучше сделать на уровне php-скрипта возможность обмена местами записей в таблице. Поясняю: это необходимо, например, когда нужно предоставить пользователю выбирать порядок следования записей в меню на сайте и т.д. и т.п. Это можно сделать, присваивая буквенные или цифровые идентификаторы записей в отведённых для этого полях, соответственно - для последующей сортировки. Но администратору нужно предоставить возможность изменения этих указателей - "обмена местами" - как, по вашему мнению, это лучше реализовать?
я очень хочу научиться абстрагировано писать работу с БД, но я до конца еще не осмыслил как это будет работать.... _________________ Друзья, уважайте труд других http://xternalx.com - моя хомпага
я очень хочу научиться абстрагировано писать работу с БД, но я до конца еще не осмыслил как это будет работать....
Значит свой человек
А не могли бы рассказать, что конкретно не осмыслено? Может, наоборот, я могу чем-то помочь? Какую литературу или мануалы по этому вопросу читаете?
Я лично заинтересовался кроссбазностью, когда увидел установку phpBB3 - там можно даже SQLite выбрать и форум будет работать... вот решил поэтому написать некое подобие движка для сайта на основе PEAR DB - пишется легко, ясно, но вот возник вопрос описанный в начале темы... _________________ Любителям и знатокам географии | Помощь по химии онлайн
Зарегистрирован: 17.05.2007 Сообщения: 2066 Откуда: Самара 11733
Добавлено: Пт, 21 Авг, 2009 06:49 Заголовок сообщения: Re: Обмен местами записей в MySQL
vohomov писал(а):
Добрый день, друзья.
Хотел бы узнать мнение знающих по-поводу того, как лучше сделать на уровне php-скрипта возможность обмена местами записей в таблице.
Ничего не понял из этой фразы, если вы как то завязываетесь на место записи в таблицы это нарушение всех принципов SQL, сортировку в таблице можно сделать совсем другими способами.
vohomov писал(а):
Поясняю: это необходимо, например, когда нужно предоставить пользователю выбирать порядок следования записей в меню на сайте и т.д. и т.п. Это можно сделать, присваивая буквенные или цифровые идентификаторы записей в отведённых для этого полях, соответственно - для последующей сортировки. Но администратору нужно предоставить возможность изменения этих указателей - "обмена местами" - как, по вашему мнению, это лучше реализовать?
Опять таки не понял, ну введите в таблицу два поля порядок записи заданный пользователем и порядок записи заданный администратором в чем проблема? Не понятно следующие: если администартор поменял местами записи, то юзер уже не сможет поменять эти (и другие) записи, или сможет? Если сможет, то как вы сумеете предотварить, что после смены порядка админом, пользователь снова обратно все поменяет?
vohomov писал(а):
P.S. У меня, конечно есть варианты, но ввиду того, что делаю это на PEAR DB, хотелось бы услышать мнение других людей.
Мое мнение SQL язык сам по себе переносимый и 99% конструкций переносятся без всяких изменений на другую бд, а пытаться сделать ваш скрипт работающий например под Oracl'ом хотя у вас нет и не будет возможности его проверить с этой СУБД не стоит, лучше сделать работающий скрипт под один MySQL, чем условно работающий скрипт под десятком БД, но проверенный на одном MySQL.
Вообще эти классы
абстрагирования это зло, так как вы пытаетесь отвязаться от БД, однако привязываетесь к классу PEAR DB, который совсем не обязательно каждый хостер поставит. Вообще учите стандарт SQL, зная его можно и так писать переносимые скрипты.
P.S. Да, ошибся с php 4.2 PEAR стоит по умолчанию (если его специально не выключили что тоже возможно), в общем то класс не плохой, но все равно, пока не проверили работоспособность на всех БД нельзя говорить, что он работает везде, хотя бы потому что не факт например что русская кодировка или длинное название полей в таблице будет работать везде одинаково, советую если вам это не надо используйте обычный mysql класс потом перепишите на PEAR, все равно без тестирования это бессмысленно. _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
Добавлено: Пт, 21 Авг, 2009 09:16 Заголовок сообщения: Re: Обмен местами записей в MySQL
Веденин писал(а):
vohomov писал(а):
Добрый день, друзья.
Хотел бы узнать мнение знающих по-поводу того, как лучше сделать на уровне php-скрипта возможность обмена местами записей в таблице.
Ничего не понял из этой фразы, если вы как то завязываетесь на место записи в таблицы это нарушение всех принципов SQL, сортировку в таблице можно сделать совсем другими способами.
vohomov писал(а):
Поясняю: это необходимо, например, когда нужно предоставить пользователю выбирать порядок следования записей в меню на сайте и т.д. и т.п. Это можно сделать, присваивая буквенные или цифровые идентификаторы записей в отведённых для этого полях, соответственно - для последующей сортировки. Но администратору нужно предоставить возможность изменения этих указателей - "обмена местами" - как, по вашему мнению, это лучше реализовать?
Опять таки не понял, ну введите в таблицу два поля порядок записи заданный пользователем и порядок записи заданный администратором в чем проблема? Не понятно следующие: если администартор поменял местами записи, то юзер уже не сможет поменять эти (и другие) записи, или сможет? Если сможет, то как вы сумеете предотварить, что после смены порядка админом, пользователь снова обратно все поменяет?
vohomov писал(а):
P.S. У меня, конечно есть варианты, но ввиду того, что делаю это на PEAR DB, хотелось бы услышать мнение других людей.
Мое мнение SQL язык сам по себе переносимый и 99% конструкций переносятся без всяких изменений на другую бд, а пытаться сделать ваш скрипт работающий например под Oracl'ом хотя у вас нет и не будет возможности его проверить с этой СУБД не стоит, лучше сделать работающий скрипт под один MySQL, чем условно работающий скрипт под десятком БД, но проверенный на одном MySQL.
Вообще эти классы
абстрагирования это зло, так как вы пытаетесь отвязаться от БД, однако привязываетесь к классу PEAR DB, который совсем не обязательно каждый хостер поставит. Вообще учите стандарт SQL, зная его можно и так писать переносимые скрипты.
P.S. Да, ошибся с php 4.2 PEAR стоит по умолчанию (если его специально не выключили что тоже возможно), в общем то класс не плохой, но все равно, пока не проверили работоспособность на всех БД нельзя говорить, что он работает везде, хотя бы потому что не факт например что русская кодировка или длинное название полей в таблице будет работать везде одинаково, советую если вам это не надо используйте обычный mysql класс потом перепишите на PEAR, все равно без тестирования это бессмысленно.
Да-да, совершенно верно - друг, вы ничего не поняли
Насчёт класса Pear DB - всё, что нужно, чтобы он работал - поместить рядом со скриптами его использующими класс PEAR.php , PEAR5.php , DB.php и папку DB с драйверами баз для класса (скачать можно с сайта PEAR) - и всё прекрасно работает. Может вы не знали - я это проверил, работает. И вовсе необязательно, чтобы на хостинге где-то PEAR был поставлен.
Что касается перемещений - вы меня не поняли совершенно. Никаких юзеров и администраторов, только один администратор и сайт. Сортировка - дело понятное, но она будет на _выводе_ записей меню, а я говорю про их запись. То есть смотрите пример: у админа есть админка, он добавил на сайт 5 разделов:
A, B, C, D, E - сортировка на _выводе_ их выводит именно в этом порядке, скажем по цифровым идентификаторам
name | id
A_____1
B_____2
C_____3
D_____4
E_____5
Они в админке добавляются автоматически, инкремент так сказать. А админу в силу тех или иных причин хочется, чтобы в самом начале шла запись B, а "A" шла второй. Т.е. в интерфейсе админки нужна функция обмена местами записей. Так , чтобы в A идентификатору присвоить "2", а B присвоить идентификатор "1" и в результате набор записей остался тем же, но B теперь на первом месте, а A на втором. Вот меня и интересует - как это сделать в SQL наиболее просто?
Если всё же не поняли о чём речь, возьмём конкретный пример - вот, в форумах есть возможность администратора поднимать разделы форумов выше или ниже в общем списке. Вот это как раз ещё один пример того что я описываю.
--
Есть конечно такие движки, в которых просто при добавлении новой записи даётся текстовое или цифровое поле. И по нему сортировка. Админ тупо вписывает в нужную запись цифру 1 например, а в другую "2" чтобы они именно в этом порядке выводились. Есть такие движки, видел. Но нужно, чтобы автоматически была возможность перемены мест записей.
----
По-поводу совместимости:
Начнём с того, что в данном примере только SQLite и MySQL, остальные базы я не затрагиваю. Во-вторых, PEAR DB штука хитрая - там есть режимы совместимости.
Например, как раз автоматическое увеличение идентификаторов записей не поддерживается в некоторых базах, а к нему привыкли пользователи MySQL, поэтому, чотобы была переносимость, класс PEAR DB скрыто от вас создаёт вспомогательную таблицу, где сам вручную и реализовывает sequence для записей в том, случае если это не поддерживается используемой базой. Так что код можно сделать _полностью" абстрактным - PEAR DB признан многими разработчиками как очень мощное решение. Вы зря сомневаетесь в нём. _________________ Любителям и знатокам географии | Помощь по химии онлайн
Зарегистрирован: 17.05.2007 Сообщения: 2066 Откуда: Самара 11733
Добавлено: Пт, 21 Авг, 2009 10:00 Заголовок сообщения: Re: Обмен местами записей в MySQL
vohomov писал(а):
Никаких юзеров и администраторов, только один администратор и сайт. Сортировка - дело понятное, но она будет на _выводе_ записей меню, а я говорю про их запись. То есть смотрите пример: у админа есть админка, он добавил на сайт 5 разделов:
A, B, C, D, E - сортировка на _выводе_ их выводит именно в этом порядке, скажем по цифровым идентификаторам
name | id
A_____1
B_____2
C_____3
D_____4
E_____5
Они в админке добавляются автоматически, инкремент так сказать. А админу в силу тех или иных причин хочется, чтобы в самом начале шла запись B, а "A" шла второй. Т.е. в интерфейсе админки нужна функция обмена местами записей. Так , чтобы в A идентификатору присвоить "2", а B присвоить идентификатор "1" и в результате набор записей остался тем же, но B теперь на первом месте, а A на втором. Вот меня и интересует - как это сделать в SQL наиболее просто?
Не думал, что это настолько простой вопрос:
1) В таблице должно быть минимум три поля id,name,order, так менять первичный ключ неправильно:
Код:
name | id| order
A_____1_____1
B_____2_____2
C_____3_____3
D_____4_____4
E_____5_____5
2) А дальше все делается двумя запросами
Код:
update nc_directory
set order = 1
where id = 2;
update nc_directory
set order = 2
where id = 1;
_________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
Добавлено: Пт, 21 Авг, 2009 10:04 Заголовок сообщения: Re: Обмен местами записей в MySQL
Веденин писал(а):
Не думал, что это настолько простой вопрос:
1) В таблице должно быть минимум три поля id,name,order, так менять первичный ключ неправильно:
Код:
name | id| order
A_____1_____1
B_____2_____2
C_____3_____3
D_____4_____4
E_____5_____5
2) А дальше все делается двумя запросами
Код:
update nc_directory
set order = 1
where id = 2;
update nc_directory
set order = 2
where id = 1;
То, что обязательно есть id - это понятно, я вам таблицу из двух полей для простоты привёл.
Спасибо за совет - я со своей стороны не ожидал, что так просто это можно разрешить, у меня была несколько запутанная схема _________________ Любителям и знатокам географии | Помощь по химии онлайн