goDB — библиотека для работы с MySQL из PHP.
19 Jun 2008
Когда мои логические цепочки запросов заводят меня в MySQL-тупик, я сначала ищу в сети информацию, потом лезу в толстую книжку, потом обращаюсь к коллегам. Поскольку мы сейчас работаем с командой PHP.RU, то последний способ оказывается практически 100%-эффективным.
Именно эти люди убедили меня разобраться в интерфейсе GoBD – надстройки над MySQLi, делающей код работы с базой данных быстрее и короче, а модель плейсхолдеров – безопаснее.
Надстройки для работы с БД – любимое занятие PHP-программистов, но GoDB – не тот случай. Эта библиотека успешно прошла бенчмарки на надёжность и скорость и разработана действительно опытным человеком не без участия сообщества.
- Разработчик GoDB: Григорьев Олег (aka vasa_c).
- Требования для работы GoDB: PHP5 с расширением MySQLi.
- Сайт GoDB.
- Сайт MySQLi.


Как она, если сравнить к Котеровской DBSimple?
Не знаком со второй. Сейчас спрошу у Андреева с Григорьевым, может они знают =)
>Как она, если сравнить к Котеровской DBSimple?
Мне котеровская не понравилась, поэтому написал так как мне нравится :) Беспристрастно же сравнивать не могу.
Вообще DBSimple довольно старая, еще под php4. Много устаревшего, как в плане PHP, так и в плане MySQL (используется старое mysql-расширение).
PS. Жилинcкий Владимир, спасибо за ПЕАР :)
Я сейчас “Коллег” на GoDB переписываю, шустро получается.
Внешне похожа на DBSimple и Pear DB2 со смесью PDO. Переходить не собираюсь, потому что похожую конструкцию использовал уже года три назад, сейчас юзаю более мне конструкцию вида
$my_table->arr();
Модель называется. Кроме как в руби не слышал что-бы кто-то такое использовал. Имхо это удобней чем полный запрос писать.
А что делает конструкция my_table->arr() ?
Наверняка возвращает по заданному критерию массив столбцов таблицы.
А как она будет выглядеть, когда нужно выбрать данные из десяти таблиц, связанных хитро.ми joinами?
Это у Артёма надо спросить…
Если надо делать join, то вид сложней..
$sys_user->arr(
“is_active=1″, // Where
“t1.ID, t1.first_name, t2.title” // Select
$sys_user->table.” t1,”.$sys_usergroup->table.” t2″ // FROM
)
В случае если имя таблицы изменится, то параметр table надо будет менять только в одном месте. Конечно люди этот участок по разному реализуют – в т.ч. ассоциативными массивами из настроек. В ruby on rails или где-то можно вроде как делать аналогично и динамические поля, но это помоему уже слишком.
Кроме метода arr я использую методы obj, int, arrint, insert, delete, update и тп.
не приветствую.
Есть куча других, гораздо продвинутых, библиотек для работы с Mysql.
Лично меня интересует то, чтобы это был не просто класс – а абстрактный. т.к. считаю удобным, использовать один и тот же интерфейс доступа к РАЗЛИЧНЫМ БД и СУБД.
Поэтому и использую ADODB.
Я люблю использовать Propel http://propel.phpdb.org/trac/
Основан на парадигмах ORM,OOP, технологиях php5, pdo, spl. Схема базы хранится в интуитивно-понятном xml, генератор генерит из него sql ddl описание и php классы, представляющие строки таблиц. Для простых операций к sql можно вообще не прибегать, а работать с методами объектов, но само собой есть возможность писать свои sql запросы
Рассказал бы всё, что думаю об абстрактных классах и ОРМ в данном контексте, но не хочу устраивать на чужом блоге очередной холивар :)
Библиотека очень похожа на DBSimple Котерова.
Не понимаю, зачем нужно …Array(1, “А это ‘два’”, 3)) в функции, когда есть func_get_args() ?
Какая выгода по скорости от использования MySQLi ?
Денис, по скорости mysqli помедленней будет, но там помоему не надо делать real_escape_string + то что она объектная
>Денис, по скорости mysqli помедленней будет, но там помоему не надо делать real_escape_string + то что она объектная
php_mysqli быстрее php_mysql. Местами в десятки раз. escape_string() всё же приходится делать, так как объектная структура и экранирование данных совершенно разные вещи :)
>Не понимаю, зачем нужно …Array(1, “А это ‘два’”, 3)) в функции, когда есть func_get_args() ?
А зачем нужно func_get_args, когда есть Array()? :)
Прошу прощения
“не надо делать real_escape_string + то что она объектная” прочитал как “потому что она объектная”
но escape всё равно делать надо
Спасибо за интересную информацию. Пхп начинаю только изучать, перехожу с С++, очень похоже, но любая информация очень полезна. Еще раз спасибо.
Очень нечитабельны запросы приведенного в доке типа:
$db->query(“select ?c from ?t where ?c=?i”, Array(“name”, “table”, “id”, $id), “el”);
ИМХО плейсхолдеры уместны, если в качестве параметров подставляем переменные. Все-таки имена таблиц и полей привычнее и удобнее видеть в теле запроса, а не как параметр.
Я неправ?
Так оно и так работает:
$db->query(”select name from table where id=?i”, Array($id), “el”);
А в примерах показан путь максимального приведения в порыве программазма =)
О том и речь :)
Понятное дело, что работает, но ведь:
1. Лишние символы в коде
2. Сложнее читать
3. Еще и подставить надо -> дольше работает код
Потому и спросил, что излишества какие-то получаются…
1. Наоборот. Получаем значение – не нужно больше ничего делать – короче код. Эта строчка даёт строку из выборки, конкретную.
2. Да не, просто всё. Сам пишешь – сам читаешь.
3. Опять нет, если я правильно понял =)
В общем, все, что я писал – про заранее известные параметры (названия таблиц, полей и т.д.).
Остальное – да, конечно: проверять, подставлять и т.п.
Короче, надо будет потестить на досуге..
>Здыхлик
Где это может пригодится написано здесь – http://pyha.ru/go/godb/query/ в разделе “Плейсхолдеры таблиц и столбцов”.
А кто-то может внятно пояснить, чем кастомный класс будет лучше того же PDO? Я не думаю, что в скорости выигрыш будет на стороне этого набора для работы с MySQL.
Переубедите меня :)
Посмотрите ещё на класс MysqlRapid, http://forum.dklab.ru/viewtopic.php?p=139350