Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Злостный оффтопик от нежелания прочитать документацию ()
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 4:19 pm ()
   Post subject:
Reply with quote


М

Выделено из темы «6_DbSimple: лаконичная работа с различными СУБД»,
расположенной в форуме Конструктор (09 Декабря 2005, 14:48).
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 4:19 pm (спустя 1 секунду; написано за 10 минут 29 секунд)
   Post subject:
Reply with quote

Quote:
Соответственно, если понять необходимость использования префиксов я еще могу, то вставки имени таблицы как единого целого - вряд ли (мне кажется, это излишество; я сами никогда не применяю).
Единственная причина, по которой это делается - абстрагироваться от устройства базы, в частности от конкретных названий таблицы. Например, назвал я при проектировании таблицу "MyTable1", и соответственно, все запросы будут построены SELECT * FROM MyTable1... И в один прекрасный день, я начну путаться, а зачем эта таблица, или решу переименовать таблицу в базе данных. Представляете, сколько работы, чтобы исправить все тексты запросов. А с использованием предопределенных констант, я не буду заморачиваться с этим, просто раместив комментарий к названию этой константы, что за таблица скрывается за названием. Ну это так, мелкие придирки, клиента, который не хочет и не может сделать все сам...

Вот еще одно но, которое "не понравилось" в библиотеке DBSimple - выдача ошибки, если в $DB->selectRow передается пустая таблица. Довольно странное поведение, на фоне того, что используется конструкция foreach(). По крайней мере в MySQL и MsSQL при нулевом (но не отрицательном!) результате возвращается пустой массив. И только в случае неудачного исполнения запроса на сервере, возвращается ошибка. И "надуманную" ошибку приходится подавлять, что не есть хорошо
Code (php): скопировать код в буфер обмена
$DB->query("SELECT * FROM ?_user ....");
while (false !== @($row = $DB->selectRow())) {
...
}
Или я что-то не правильно понял?

Спасибо за библиотеку. Правда мне в ней не хватает части для работы с MsSQL. Пока пробую сделать по аналогии для mysql и ibase.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 4:50 pm (спустя 30 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

Гость wrote:
Единственная причина, по которой это делается - абстрагироваться от устройства базы, в частности от конкретных названий таблицы. Например, назвал я при проектировании таблицу "MyTable1", и соответственно, все запросы будут построены SELECT * FROM MyTable1... И в один прекрасный день, я начну путаться, а зачем эта таблица, или решу переименовать таблицу в базе данных. Представляете, сколько работы, чтобы исправить все тексты запросов.
Ну тогда почему Вы не храните имена полей таблицы тоже в константах? Вдруг захотите поменять? :-)
А если кто-то использует хранимые процедуры, а не таблицы - ему их что, тоже в константах хранить?
Гость wrote:
выдача ошибки, если в $DB->selectRow передается пустая таблица
Пример кода - в студию. Какая ошибка? Какая пустая таблица? Что выдается? Что, по-Вашему, должно бы выдаваться?
Как правильно задавать вопросы: статья, обязательная к прочтению (citforum.ru/howto/smart-questions-ru.shtml)
Гость wrote:
Пока пробую сделать по аналогии для mysql и ibase.
Только вначале убедитесь, что работаете с самой последней версией библиотеки.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 4:53 pm (спустя 2 минуты; написано за 1 минуту 35 секунд)
   Post subject:
Reply with quote

Стоп, стоп!
Гость wrote:
$DB->query("SELECT * FROM ?_user ....");
while (false !== @($row = $DB->selectRow())) {
...
}
Вы что это делаете? Прочитайте статью внимательно, там написано, как использовать selectRow(). А также посмотрите комментарии в коде и ссылки в текущем топике.
То, что Вы написали, в корне неверно, удивительно, что вообще хоть как-то работает.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 5:28 pm (спустя 35 минут; написано за 10 минут 17 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Стоп, стоп!
Гость wrote:
$DB->query("SELECT * FROM ?_user ....");
while (false !== @($row = $DB->selectRow())) {
...
}
Вы что это делаете? Прочитайте статью внимательно, там написано, как использовать selectRow(). А также посмотрите комментарии в коде и ссылки в текущем топике.
То, что Вы написали, в корне неверно, удивительно, что вообще хоть как-то работает.
Простите, писал не разобравшись. :) В общем, я понял, в чем моя ошибка - они и не работало. А в статье нет описания, как пользоваться selectRow, selectPage. Вот, пришлось пересматривать весь код, чтобы понять, как все устроено.
Я не нашел функции, которая бы последовательно выбирала из результата все строки, подобно mysql_fetch_row() - эта функция используется гораздо чаще. Потому что вот такая конструкция
Code (php): скопировать код в буфер обмена
$row = $DB->selectPage("SELECT ... "
Было бы куда уобнее и привычнее...
Простите, что такой назойливый.
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 5:32 pm (спустя 3 минуты; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

[offtopic]На форуме не хватает функции редактирования. А то я как неправильный пользователь никогда не пользуюсь предпросмотром сообщения...[/offtopic]
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Dec 08, 2005 7:13 pm (спустя 1 час 41 минуту; написано за 29 секунд)
   Post subject:
Reply with quote

// оффтоп
Гость
А Вы зарегистрируйтесь - и будет Вам редактирование...
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 10:18 pm (спустя 3 часа 5 минут; написано за 1 минуту 12 секунд)
   Post subject:
Reply with quote

Гость wrote:
Я не нашел функции, которая бы последовательно выбирала из результата все строки, подобно mysql_fetch_row() - эта функция используется гораздо чаще. ... Потому что вот такая конструкция ... Было бы куда уобнее и привычнее...
Привычнее - да. Но не удобнее ни в коей мере. Еще раз: читайте статью, не позорьтесь. Оттуда:
Quote:
Пожалуй, это полный список. Обратите внимание, сколько в нем пунктов, поддержка которых в PEAR DB и ADOdb, как мне кажется, находится на неудовлетворительном уровне. В то же время, эти две библиотеки поддерживают еще множество возможностей, которые в данный список не вошли в виду их малой практической целесообразности и большой избыточности:
...
* разделение в интерфейсе операций «выполнить запрос» и «получить результат запроса»;
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Dec 08, 2005 10:20 pm (спустя 1 минуту 45 секунд; написано за 1 минуту 12 секунд)
   Post subject:
Reply with quote

Гость wrote:
$result = $DB->select(<query_string>);
while ($row = $result->fetch(index|assoc|both)) {
...
}
Вместо этого:
Code (php): скопировать код в буфер обмена
foreach ($DB->select(<query>) as $row) {
  //
}
Скажете, это менее удобно? Да ни за что не поверю. И никакой "fetch index" не нужен - assoc хватает за глаза, для того-то и придумали в SQL алиасы столбцов.
Back to top
View user's profile Send private message Send e-mail
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Fri Dec 09, 2005 10:28 am (спустя 12 часов 8 минут; написано за 17 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
для того-то и придумали в SQL алиасы столбцов.
А может быть для сортировки и группирования?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Dec 09, 2005 1:13 pm (спустя 2 часа 44 минуты; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote


М

И для этого тоже. Только вот сортировка по алиасу в SQL 92 не предусмотрена - по крайней мере, в FireBird не работает.
Перестаньте, пожалуйста, засорять топик оффтопиком.
Back to top
View user's profile Send private message Send e-mail
zarusjamer
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Dec 09, 2005 2:32 pm (спустя 1 час 19 минут; написано за 12 минут 35 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Гость wrote:
$result = $DB->select(<query_string>);
while ($row = $result->fetch(index|assoc|both)) {
...
}
Вместо этого:
Code (php): скопировать код в буфер обмена
foreach ($DB->select(<query>) as $row) {
  //
}
Скажете, это менее удобно? Да ни за что не поверю. И никакой "fetch index" не нужен - assoc хватает за глаза, для того-то и придумали в SQL алиасы столбцов.
Куда менее удобно, так как синтаксис получения результата запроса становится нетривиальным. Более того, при таком подходе каждая конструкция foreach будет снова обращаться к базе (! это я так понял, читая код в первом приближении, может, я неправильно понял), тем самым, ожидая на выходе получить статичный результат, при последующих вызовах результата, получаем динамику. Это не хорошо, но и не плохо, так как в разных задачах нужен и такой, и такой подход. Но в результате, не получаем простую работу с БД, так как хранение результата опять ложится на плечи программиста.
Почему бы не сделать отдельный класс - query_result с теми самыми методами. result_first_row, result_first_column, result_first_cell, result_total_rows, result_last_row, result_next и result_reset и 2 проверки - result_is_last_row, result_is_first_row. Я наверное, попробую сделать что-то такое самостоятельно.
И еще одно "за" такого подхода. Функция mysql_query не может обрабатывать 2 запроса в одной строке, т.е. "SELECT ....; UPDATE ...." вызовут ошибку исполнения. В то время как mssql_query вернет набор результатов, что куда более удобно для работы с БД. Почему бы такое не реализовать на уровне DBSimple. Т.е. разбивать строку запроса по ; и исполнять последовательно, возвращая набор результатов.
Back to top
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

Location: Россия, Санкт-Петербург

PostPosted: Fri Dec 09, 2005 2:38 pm (спустя 6 минут; написано за 42 секунды)
   Post subject:
Reply with quote

zarusjamer wrote:
Куда менее удобно, так как синтаксис получения результата запроса становится нетривиальным. Более того, при таком подходе каждая конструкция foreach будет снова обращаться к базе (! это я так понял, читая код в первом приближении, может, я неправильно понял), тем самым, ожидая на выходе получить статичный результат, при последующих вызовах результата, получаем динамику.
Глупости. К базе обращается только один раз. Читайте спецификацию по foreach.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Dec 09, 2005 2:40 pm (спустя 1 минуту 33 секунды; написано за 7 секунд)
   Post subject:
Reply with quote

zarusjamer
По поводу foreach - очень аккуратно RTFM: ru2.php.net/foreach
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Dec 09, 2005 2:47 pm (спустя 6 минут; написано за 4 секунды)
   Post subject:
Reply with quote


М

Так, все, я от вас устал. Идите читать документацию, наконец! На этот раз - по PHP и foreach.
Как правильно задавать вопросы: статья, обязательная к прочтению (citforum.ru/howto/smart-questions-ru.shtml) тысячу раз!
Back to top
View user's profile Send private message Send e-mail
Зарипов Руслан
Заглянувший



Joined: 09 Dec 2005
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Fri Dec 09, 2005 3:43 pm (спустя 56 минут; написано за 4 минуты 14 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
zarusjamer
По поводу foreach - очень аккуратно RTFM: ru2.php.net/foreach
Я знаю, как работает foreach, не надо меня держать за полного идиота, а внимательно читать, что написано. "Каждый ВЫЗОВ foreach" != "Каждый шаг цикла foreach".
Code (php): скопировать код в буфер обмена
$query = "somequery";
foreach ($DB->selectPage($query) as $row) {
}
foreach ($DB->selectPage($query) as $row) {
}
Это уже 2 разных результата запроса. Мне же нужен был класс, который бы хранил результаты ПРЕДЫДУЩЕГО запроса и позволял работать с ним неоднократно более или менее стандартными способами.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sat Dec 10, 2005 4:38 pm (спустя 1 день 54 минуты; написано за 25 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
$rows = $DB->selectPage($query);
foreach ($rows as $row) {
}
foreach ($rows as $row) {
}
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You cannot download files in this forum.
XML