Пыха всегда с тобой

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 26 Май, 2012, 04:33:29

Страниц: 1 [2] 3 4 ... 23
Печать
Автор Тема: goDB — библиотека работы с MySQL  (Прочитано 29767 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Serj    ↓ 
07 Март, 2008, 10:56:30
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 23
Сила слова: 0

Сенкс ;)
Записан
roksar    ↓ 
12 Август, 2008, 09:03:38 , спустя 158 дней 9 часов 7 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 2
Сила слова: 0

Почему в запросе query('SELECT COUNT(*) FROM ?t',array('news'),'no'); возвращается просто объект?
 
//пс. поставил 'el' теперь работает правильно..жаль что такой хорший класс не развиваеться..и мануал скудный
« Последнее редактирование: 12 Август, 2008, 09:13:54 от roksar » Записан
adw0rd    ↓ 
12 Август, 2008, 09:41:17 , спустя 37 минут 39 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

roksar, он не скудный, он краткий! Ничего лишнего и все по существу. А чего именно в мануале не хватает?
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
roksar    ↓ 
12 Август, 2008, 09:54:29 , спустя 13 минут 12 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 2
Сила слова: 0

Он по существу я согласен и сделан грамотно, но живых примеров надо побольше, какой разбор где лучше применять (я имею ввиду конкретные примеры а не описание их работы) см. пример описания класса dbsimple :)
Записан
adw0rd    ↓ 
12 Август, 2008, 10:02:10 , спустя 7 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

roksar, по поводу примеров поддерживаю, больше примеров это только к лучшему! ;)
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
bvn    ↓ 
22 Сентябрь, 2008, 11:30:10 , спустя 40 дней 13 часов 28 минут
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 7
Сила слова: 0

Есть предложение немного расширить функциональность модуля. Не знаю, почему автором была проигнорирована столь удобная функциональность, предоставляемая методом fetch_object... Я без претензий на соавторство, прошу рассмотреть возможность применения следующего патча (см. вложение), оформленного в виде diff-файла. Собственно, не знаю, какие мотивы мною движут, есть ли в них хоть доля тщеславия ;) ведь ничто не мешает мне юзать втихаря у себя исправленную версию, но что-то заставляет меня поделиться с миром данными исправлениями. Буду очень рад, если эти исправления будут учтены :)
 
PS: Ах, да, чуть не забыл. За сам модуль огромное спасибо, я не далее как неделю назад изобрел свой велосипед для старого mysql, а потом понял, что есть mysqli и собирался изобретать подобный же велосипед для него, а оказалось, что есть готовый вполне рабочий велосипед :) За него автору низкий поклон, вот если бы еще глянуть в сторону dbal... пока для себя не определился, что можно в этой обалсти заюзать готовенького :)

* godb_patch.diff.gz (0.27 Кб - загружено 153 раз.)
Записан

von-hamster    ↓ 
02 Октябрь, 2008, 05:38:01 , спустя 10 дней 6 часов 7 минут 51 секунду
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 4
Сила слова: 0

По поводу расширения функционала есть еще предложение (я у себя поправил).
 
Предистория: нужно делать инсерт с заранее неизвестным количеством полей (ну или влом перечислять вначале поля, а потом подставлять массив результатов). Идею взял из dbsimple.
 
Было раньше:
PHP
$db->query("insert into ?t (?c,?c,?c) values(?i,?i,?i)", Array("table", "one", "two", "three", 1, 2, 3));

При этом чтобы добавить поле нужно было добавить ?с и ?i Ну или если запрос:
PHP
$db->query("insert into ?t (?c,?c,?c) values(?a)", Array("table", "one", "two", "three", array(1, 2, 3)));

После моих изменений можно сделать так:
PHP
$db->query("insert into ?t (?ca) values (?a)", Array("table", array("one", "two", "three"), array(1, 2, 3)));

Ну или как я обычно делаю:
PHP

$insert = array("one" => 1,
                     "two" => 2,
                     "three" => 3,
);
$db->query("insert into ?t (?ca) values (?a)", Array("table", array_keys($insert), array_values($insert)));
 

При этом, если изменить таблицу (добавить поле) - достаточно добавить запись в массив...
 
Вобщем, если кому так будет удобно, то вносим следующие изменения:
1. добавить в private function _makeQuery($ph) после описания case ('c'): ...
 
PHP

            case ('ac'):
            case ('ca'):
                foreach ($el as &$e) {
                    $e = "`{$e}`";
                }
                return implode(',', $el);
 

2. Добавить в регэксп в public function makeQuery($pattern, $data, $prefix = '') одну букву с во вторые скобки, чтобы получилось следующее:
PHP

$q = @preg_replace_callback('/\?([int?ca]?[inac]?);?/', Array($this, '_makeQuery'), $pattern);
 
       
И все...
 
ЗЫ... В этом случае, нельзя указать таблицу для поля, кроме как вручную без крайних апострофов, например (один из вариантов),
PHP

$insert = array("table`.`one" => 1,
                     "table`.`two" => 2,
                     "table`.`three" => 3,
);
$db->query("insert into ?t (?ca) values (?a)", Array("table", array_keys($insert), array_values($insert)));
 
Ну или
PHP

$table = 'table';
$insert = array("{$table}`.`one" => 1,
                     "{$table}`.`two" => 2,
                     "{$table}`.`three" => 3,
);
$db->query("insert into ?t (?ca) values (?a)", Array($table, array_keys($insert), array_values($insert)));
 
Записан
adw0rd    ↓ 
02 Октябрь, 2008, 05:49:15 , спустя 11 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

von-hamster, да, бывает иногда не хватает....
 
PHP
$db->query("insert into ?t (?ca) values (?a)", Array("table", array("one", "two", "three"), array(1, 2, 3)));
а как данный запрос оформить?
Text
insert into `table` set `one` = 1, `two` = 2, `three` = 3
тоже самое и с update
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
von-hamster    ↓ 
03 Октябрь, 2008, 09:44:43 , спустя 15 часов 55 минут 28 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 4
Сила слова: 0

Например, так:
 
1. в в private function _makeQuery($ph):
PHP

            case ('sa'):
                foreach ($el as $k => &$e) {
                    $e = "`{$k}` = '" . $this->real_escape_string($e) . "'";
                }
                return implode(',', $el);
 

2. в public function makeQuery($pattern, $data, $prefix = '')
PHP
        $q = @preg_replace_callback('/\?([int?cas]?[inac]?);?/', Array($this, '_makeQuery'), $pattern);

Тогда запрос будет выглядеть, как:
PHP

$insert = array("one" => 1,
                     "two" => 2,
                     "three" => 3,
);
$db->query("UPDATE ?t SET ?sa;", Array("table", $insert));
 

Но в этом случае, все значения заключаются в одинарные кавычки, что для числовых значений mysql вобщем-то не критично...
 
Вообще слишком много получается букав для плейсхолдеров - можно запутаться...
Например, для порядка лучше оставить только один вариант двойных...
Записан
adw0rd    ↓ 
03 Октябрь, 2008, 09:58:39 , спустя 13 минут 56 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

Вообще слишком много получается букав для плейсхолдеров - можно запутаться...
Например, для порядка лучше оставить только один вариант двойных...

угу. и я об этом
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
vasa_c    ↓ 
12 Ноябрь, 2008, 06:35:06 , спустя 40 дней 9 часов 36 минут 27 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

Ждал и надеялся, что в ближайшее выйдет таки 5.3, чтобы переписывать библиотечки уже под него. Как видно, надеялся зря. Поэтому перепишу goDB под старый добрый 5.2.
 
TODO на версию 1.1. Кто заинтересован, дополняйте.
 
1. Сделать отложенное подключение к базе (если в сценарии запросов может вообще не быть):
PHP

$db = new goDB($host, $username /*, ... */ )
/* ... */
$db->query($query); // Подключение происходит только здесь
 

2. Возможность передавать параметры подключения также и в виде ассоциативного массива. Как в конструктор, так и в makeDB.
PHP

$configDB = Array(
    'host'     => 'localhost',
    'username' => 'vasa',
    'passwd'   => 'peta',
);
/* ... */
$db = new goDB($configDB);
 

3. Возможность использовать sizeOf() и count() так же и для результатов-итераторов. Сейчас только $res->count().
 
4. Наследовать исключений не от Exception, а от LogicException
 
5. Плейсхолдер "?set":
PHP

$set = Array(
    'one' => 1,
    'two' => 2,
    'three' => 3,
);
$db->query('UPDATE `table` SET ?set WHERE `id`=?i', Array($set, $id)); // `one`=1,`two`=2,`three`=3
 

6. Плейсхолдер "?where". Для раздела WHERE. Хз пока как лучше.
 
7. Метод insertRows() для запросов типа:
SQL

INSERT INTO `table` (`one`,`two`) VALUES (1,2), (3,4), (5,6)
 

Два варианта:
PHP

// 1
$cols = Array('one', 'two');
$values = Array(Array(1,2), Array(3,4), Array(5,6));
$db->insertRows('table', $cols, $values);
 
// 2
$rows = Array(
    Array(
        'one' => 1,
        'two' => 2,
    ),
    Array(
        'one' => 3,
        'two' => 4,
    ),
);
$db->insertRows('table', $rows);
 

8. Форматы результата "kcol", "kassoc", "krow". Вместо порядковых массивов в качестве ключа используется значение первого столбца (обычно это `id`).
 
9. Что-нибудь по транзакциям. Возможно, сопру у AlexB.
 
10. Что-нибудь по мультизапросам.
Записан

adw0rd    ↓ 
12 Ноябрь, 2008, 07:26:24 , спустя 51 минуту 18 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

vasa_c, плейсхолдеры:
 

для списков ?a
для хэшей ?h
для двумерных массивов ?sa (можно и по другому)

?set == ?h
?where - не надо
insertRows() - не надо, для него есть ?sa
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
adw0rd    ↓ 
12 Ноябрь, 2008, 07:27:23 , спустя 59 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17634
Сила слова: 1.67

Вообще ?a лучше бы быть ?l... но для совместимости лучше оставить
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
vasa_c    ↓ 
09 Декабрь, 2008, 07:07:51 , спустя 26 дней 23 часа 40 минут 28 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

Так как goDB2.0 с кучей всякого барахла откладывается в силу действия сил неодолимого характера (неодолимая лень), выкладываю промежуточную 1.1
 
Плейсхолдер ?s - раздел SET
 
PHP

$set = Array(
    'one'   => 1,
    'two'   => 'two',
    'three' => null,
    'four'  => 'f"our"'
);
 
$pattern = 'INSERT INTO `table` SET ?s';
$data    = Array($set);
 
$db->query($pattern, $data);
 

SQL

INSERT INTO `table` SET `one`="1",`two`="two",`three`=NULL,`four`="f\"our\""
 

 
Плейсхолдер ?v - много строк одним INSERTом
 
PHP

$values = Array(
    Array(1, 2, 3),
    Array(3, 4, 5),
    Array(6, 7, 8),
);
 
$pattern = 'INSERT INTO `table` (`one`,`two`,`three`) VALUES ?v';
$data    = Array($values);
 
$db->query($pattern, $data);
 

SQL

INSERT INTO `table` (`one`,`two`,`three`) VALUES ("1","2","3"),("3","4","5"),("6","7","8")
 

 
Результат в виде объекта
 
Для особых гурманов добавлены форматы разбора - "object", "rowobject", "iobject"
 

Выборка переменных
 
Добавлен формат разбора "vars". При выборке по двум столбцам, первый становится ключем, второй - значением.
 
Например, таблица переменных связанных с пользователем:
SQL

CREATE TABLE `users_vars` (
    `user`  INT UNSIGNED NOT NULL,
    `name`  VARCHAR(50) NOT NULL,
    `value` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`user`,`name`)
);
 

Выбираем переменные принадлежащие пользователю в ассоциативный массив:
PHP

$vars = $db->query('SELECT `name`,`value` FROM `users_vars` WHERE `user_id`=?i', Array($userId), 'vars');
 

 
Интерфейс countable для итераторов
 
Теперь получать количество записей в итераторах ("iassoc", "irow", "icol", "iobject") можно, как и в обычных массивах - count($result).
 

Формат подключения
 
Ещё один вариант конструктора - ассоциативный массив одним аргументом. Удобно при хранении конфигурации в массивах.
 
PHP

/* Конфигурационный массив */
$configDB = Array(
    'host'     => 'localhost',
    'username' => 'user',
    'passwd'   => 'qwerty',
    'dbname'   => 'db',
    'prefix'   => 'prefix_',
);
 
/* Старый вариант */
$db = new goDB($configDB['host'], $configDB['username'], $configDB['passwd'], $configDB['dbname']);
if ($configDB['prefix']) {
    $db->setPrefix($configDB['prefix']);
}
 
/* Новый вариант */
$db = new goDB($configDB);
 

Возможные поля конфигурационного массива - host, username, passwd, dbname, port, socket (аргументы конструктора), prefix, debug (сами догадайтесь).
Все поля необязательны.
 
Так же массив можно использовать при создании БД в пространстве имён:
PHP
goDB::makeDB($configDB);
Но аргументы $name (имя базы) и $postmake (отложенное подключение) должны идти полями массива.
 

Порт в хосте
 
В любом из вариантов создания базы порт можно указывать в параметре host ("localhost:3307").
 

Ассоциация баз в пространстве имён
 
На сайте используется две базы (теоретически):
PHP

$db1 = goDB::makeDB($host, $username, $passwd, $dbname, 'base'); // Основная база
$db2 = goDB::makeDB($host, $username, $passwd, $dbname, 'forum'); // База форума
 

Хотим указать, чтобы форум использовал основную базу:
PHP

$db1 = goDB::makeDB($host, $username, $passwd, $dbname, 'base'); // Основная база
$db2 = goDB::assocDB('forum', 'base'); // Ассоциировали их
goDB::queryDB($pattern, $data, $fetch, null, 'forum'); // Запросы пойдут к основной базе
 

 
Декоратор запросов
 
PHP
goDB::queryDecorated("wrapper");

Теперь все запросы через query() будут валиться первым делом в функцию wrapper.
 
PHP

function wrapper($query, $fetch)
{
    print 'Запрос: '.$query.'<br />';
    print 'Разбор: '.$fetch.'<br />';
    return true;
}
 

Запрос приходит уже сформированным (pattern + data). Его можно изменить:
 
PHP

function wrapper(&$query, $fetch)
{
    $query = 'TRUNCATE TABLE `users`'; // В итоге выполнится эта гадость
    return true;
}
 

Если вернуть false, то запрос не будет выполнен.
 

По мелочам
 
Имена итераторов скопипастил из старого в виде DBResult, теперь исправил на goDBResult.
goDBException наследуется от LogicException.
« Последнее редактирование: 09 Декабрь, 2008, 07:12:16 от vasa_c » Записан

Timur    ↓ 
09 Декабрь, 2008, 07:29:14 , спустя 21 минуту 23 секунды
НЕ ХУЕТА! ХУЕТА!

NullPointerException
Группа: в ухо

Карма: 56
Сообщений: 1009
Сила слова: 5.55

гуд! )
Записан
Страниц: 1 [2] 3 4 ... 23
Печать
 

Перейти в:  

Этот топик скрыли: NRG, adw0rd, artoodetoo