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

6_DbSimple version 1.x: лаконичная работа с различными СУБД (Дмитрий Котеров, оценка: 6)
Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
Author Message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Nov 10, 2005 4:42 pm (написано за 22 секунды)
   Post subject: 6_DbSimple: лаконичная работа с различными СУБД
Reply with quote

dklab.ru/lib/DbSimple/
(Статья пока еще недописана, в процессе. Однако библиотека готова.)
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Thu Nov 10, 2005 4:47 pm (спустя 4 минуты; написано за 11 секунд)
   Post subject:
Reply with quote

Предыдущие обсуждения: Проектирование простейшего (!) модуля для абстракции от SQL-сервера. (forum.dklab.ru/sql/php/ProektirovanieProsteyshegoModulyaDlyaAbstraktsiiOtSql-servera.html)
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Fri Nov 11, 2005 10:16 pm (спустя 1 день 5 часов 28 минут; написано за 1 минуту 22 секунды)
   Post subject:
Reply with quote

В архиве нерабочая библиотека. Ошибка в 48 строчке кода:
Code (php): скопировать код в буфер обмена
require_once str_replace (www.php.net/str_replace)('_', '/', $class) . ".php";
Если убрать str_replace('_', '/', $class) то вроде все заработает.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Fri Nov 11, 2005 10:18 pm (спустя 2 минуты; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

Возможно ли выполнять запросы не использую транзакции, тоесть не создавая новый обьект транзакций?

Наверно надо создать одну транзакцию, и использовать ее, а когда действительно нужны транзакции создавать дополнительно. Такая идея?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Sat Nov 12, 2005 1:32 am (спустя 3 часа 14 минут; написано за 2 минуты 52 секунды)
   Post subject:
Reply with quote

Иван Шумков wrote:
В архиве нерабочая библиотека.
Ой, да неправда. Все там рабочее. Просто надо include_path прописывать, как надо, а не как попало. Смотрите примеры лучше.
Иван Шумков wrote:
Наверно надо создать одну транзакцию, и использовать ее, а когда действительно нужны транзакции создавать дополнительно. Такая идея?
Идея ужасная. Какие параметры транзкции использовать? В FireBird, по крайней мере, это ОЧЕНЬ важно. Например, у меня сейчас в начале работы создается транзакция только для чтения IBASE_READ | IBASE_COMMITTED | IBASE_REC_VERSION, минимально нагружающая базу, а при записи (которая встречается значительно реже) - создаются и тут же коммитятся транзакции IBASE_WRITE | IBASE_COMMITTED | IBASE_WAIT | IBASE_REC_NO_VERSION. Но, естественно, такой набор не обязательно единственный, на чтение может понадобиться открыть и транзакцию другого вида.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Sat Nov 12, 2005 2:19 am (спустя 46 минут; написано за 4 минуты 3 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Ой, да неправда. Все там рабочее. Просто надо include_path прописывать, как надо, а не как попало. Смотрите примеры лучше.
Вы правы, простите, потерял config.php.
Дмитрий Котеров wrote:
Идея ужасная.
А в случае MySQL? У меня например при интерации скрипт делает несколько запросов рабочих (лоигн, записывается дата логина, получается инфа в каких группах состоит юзер и т.п.). Мне для этого создавать отдельную транзакцию? И есть сами хэндлеры например страница новостей. Пару запросов на чтение и пару запросов на запись статистика. Как тут с транзакциями? Я понимаю когда я данные добавляю, там можно их использовать, чтобы, если, что - откатить.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Sat Nov 12, 2005 1:14 pm (спустя 10 часов 54 минуты; написано за 43 секунды)
   Post subject:
Reply with quote

Вы примеры смотрели? Там создается в connect.php объект $DATABASE (база данных) и $DB (транзакция). Вот и используйте $DB везде, где хотите.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Sun Nov 13, 2005 8:09 pm (спустя 1 день 6 часов 55 минут; написано за 1 минуту 9 секунд)
   Post subject:
Reply with quote

Странно не удается установить логгер.
Code (php): скопировать код в буфер обмена
<?php
/*

        Класс обеспечивает совместимость DBAL и DbSimple

*/

class DbSimpleWrapper
{
        var $rh; // обьект RequestHandler
        var $database; // обьект DbSimple

        var $simple; // транзакция по умолчанию

        function DbSimpleWrapper(&$rh)
        {
                $this->rh =& $rh;

                // подключаем библиотеку
                $this->rh->UseLib('DbSimple', 'DSN');
                $this->database = DbSimple_DSN::connect(array (www.php.net/array)(
                                                                                                                                                                                                'phptype'                => $rh->db_al,
                                                                                                                                                                                                'username'        => $rh->db_user,
                                                                                                                                                                                                'password'        => $rh->db_password,
                                                                                                                                                                                                'hostspec'        => $rh->db_host,
                                                                                                                                                                                                'database'        => $rh->db_name,
                                                                                                                                                                        )
                );

                // указываем обработчик ошибок
                $this->database->set_error_handler(array (www.php.net/array)(&$this, 'ErrorHandler'));

                // указываем логгер
                $this->database->setLogger(array (www.php.net/array)(&$this, 'Logger'));

                // создаем умолчательную транзакцию
                $this->simple = $this->database->transaction();
        }

        // обертка для вывода ошибки
        function ErrorHandler($message, $info)
        {
                if (!error_reporting (www.php.net/error_reporting)()) return;

                $this->rh->debug->Error_R($info);
        }

        function Logger($args)
        {
                die (www.php.net/die)($args);
        }

        function Quote($value)
        {
                return $this->simple->database->escape($value);
        }
}
При любом запросе логер не срабатывает :(.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 12:36 am (спустя 4 часа 27 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Хм. Чудеса. Теперь работает.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 1:42 am (спустя 1 час 6 минут; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

Было бы здорово добавить что-то вроде ARRAY_VALUE. Например: нужен масив где ключ это id, а значение название:
Code (php): скопировать код в буфер обмена
$sectionsSql = $db->simple->Select('SELECT `id` AS ARRAY_KEY, `title` AS ARRAY_VALUE FROM `structure` WHERE `deleted` = 0 AND `disabled` = 0 ORDER BY `order`');
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 2:33 am (спустя 50 минут; написано за 1 минуту 17 секунд)
   Post subject:
Reply with quote

Как получить просто от запроса ресурс а не уже собранный масив данных из этого ресурса?
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 2:34 am (спустя 1 минуту 7 секунд; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

Не нашел возможности получения последнего id в таблице, или вы решили что это лишний функционал? Помойму очень полезный.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon Nov 14, 2005 9:27 am (спустя 6 часов 53 минуты; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

Иван Шумков wrote:
Было бы здорово добавить что-то вроде ARRAY_VALUE. Например: нужен масив где ключ это id, а значение название:
Code (php): скопировать код в буфер обмена
$DB->selectCol('SELECT ID AS ARRAY_KEY, title FROM table');
Иван Шумков wrote:
Как получить просто от запроса ресурс а не уже собранный масив данных из этого ресурса?
Никак, это и не нужно в скриптах. Данный слой абстракции попросту исключен.
Иван Шумков wrote:
Не нашел возможности получения последнего id в таблице
$id = $DB->query('INSERT ...'); # это будет вставленный ID
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 1:32 pm (спустя 4 часа 4 минуты; написано за 38 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
$id = $DB->query('INSERT ...'); # это будет вставленный ID
А помимо? Не вставляя запись?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon Nov 14, 2005 1:41 pm (спустя 8 минут; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

Не вставляя запись, получить "последний id" невозможно. Вы неправильно понимаете, что это такое - это не "последний id", а "id, использованный последней операцией insert". Читайте документацию MySQL.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 6:31 pm (спустя 4 часа 49 минут; написано за 47 секунд)
   Post subject:
Reply with quote

SELECT max(id) + 1 FROM table != следующий автоинкремент?
Back to top
View user's profile Send private message
WingedFox
Профессионал



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

Location: Питер

PostPosted: Mon Nov 14, 2005 6:40 pm (спустя 9 минут; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

Иван Шумков
Следующий - да.
Но неизвестно, кто будет следующим.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Mon Nov 14, 2005 8:13 pm (спустя 1 час 33 минуты; написано за 41 секунду)
   Post subject:
Reply with quote

WingedFox wrote:
Следующий - да.
Но неизвестно, кто будет следующим.
Не совсем вас понял.
Back to top
View user's profile Send private message
WingedFox
Профессионал



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

Location: Питер

PostPosted: Mon Nov 14, 2005 8:35 pm (спустя 22 минуты; написано за 1 минуту 14 секунд)
   Post subject:
Reply with quote

Иван Шумков
Всё просто.
Вы получили последний ID, а в следующий момент другой скрипт добавил запись.
Всё. Ваш ID неверен.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Wed Nov 16, 2005 6:23 pm (спустя 1 день 21 час 47 минут; написано за 3 минуты 37 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
$this->rh->db->simple->Query('UPDATE `table` SET ?a', array (www.php.net/array)('left' => 1, 'right' => 2));
Получаем SQL:
Code (SQL): скопировать код в буфер обмена
UPDATE `table` SET LEFT = '1', RIGHT = '2'
И ошибку, что left - зарезервированное слово. Имена полей предлагаю обертывать в одиночные кавычки (`left`), тогда можно избежать много проблем.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Nov 17, 2005 3:12 am (спустя 8 часов 49 минут; написано за 51 секунду)
   Post subject:
Reply with quote

Это в MySQL - кавычки одиночные. А в Ibase, например, для этого применяются двойные: ["].
TODO: сделать второй параметр в escape(): если true, обертывает идентификатор.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Thu Nov 17, 2005 2:21 pm (спустя 11 часов 8 минут; написано за 18 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Но как передать этот параметр в select ?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Nov 17, 2005 5:04 pm (спустя 2 часа 43 минуты; написано за 50 секунд)
   Post subject:
Reply with quote

Никак не передать. В случае вставки ассоциативных массивов все идентификаторы будут в любом случае обрамляться в ``. Да, читабельность снизится, но зато - универсально.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Wed Nov 23, 2005 6:58 pm (спустя 6 дней 1 час 54 минуты; написано за 21 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров
Когда думаете дописать статью? Очень жду продолжения.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Dec 07, 2005 12:16 pm (спустя 13 дней 17 часов 18 минут; написано за 2 минуты 22 секунды)
   Post subject:
Reply with quote

version 1.23:
* Расширен измеритель времени запроса: теперь это выглядит как ВремяВсего = ВремяЗапроса+ВремяПолученияПервойСтроки+ВремяПолученияОстальныхСтрок.
* Унифицирован интерфейс драйверов работы с BLOB-ами (в драйверах добавился виртуальный метод _getBlobFieldNames()). API библиотеки не изменился.

Вероятно, в ближайшее время будет драйвер для работы с pgSQL.
Back to top
View user's profile Send private message Send e-mail
zarusjamer
Guest





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


PostPosted: Thu Dec 08, 2005 11:50 am (спустя 23 часа 33 минуты; написано за 8 минут 9 секунд)
   Post subject: Обертка имен
Reply with quote

Я для своих таблиц в БД использую предпопределенные константы и соответственно, вставляю их в текст запроса
Code (any language): скопировать код в буфер обмена
$DB->query("SELECT * FROM `".BASE_NAME1."` ....");
было бы очень удобно, если бы подобно плейсхолдерам для переменных, были сделаны плейсхолдеры для имен таблиц с другим символом и обязательной оберткой (`` для MySQL, [] для MsSQL и т.д.
Code (any language): скопировать код в буфер обмена
$DB->query("SELECT * FROM ?B? ....",BASENAME1,...);
=>
$DB->query("SELECT * FROM `<basename1>` ....");
Это повысить степень абстракции, так как в разных СУБД обертка таблиц и идентификаторов полей выглядит по-разному
И
Quote:
TODO: сделать второй параметр в escape(): если true, обертывает идентификатор.
было бы очень здорово, но лучше не делать тру/фолс, а просто для каждого типа СУДБ обертывать все поля в "родные" обертки. Например, поле в MySQL ID в запросе воспримется нормально, а в MsSQL вызовет ошибку исполнения, так как это директива.
Back to top
Дмитрий Котеров
Администратор



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


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

zarusjamer wrote:
$DB->query("SELECT * FROM ?B? ....",BASENAME1,...);
=>
$DB->query("SELECT * FROM `<basename1>` ....")
На крайний случай можно сделать что-то типа
Code (php): скопировать код в буфер обмена
define (www.php.net/define)("BASENAME", "user");
$DB->setIdentPrefix("phpbb_");
$DB->query("SELECT * FROM ?#BASENAME ....");
# -> "SELECT * FROM `phpbb_user` ..."
 
Или даже
Code (php): скопировать код в буфер обмена
$DB->query("SELECT * FROM ?BASENAME ....");
(так будет на 1 символ короче, но возможен конфликт с ?a, ?d, ?f и др. placeholder-ами, если кто-то вздумает называть константы a, d и f).

Но вообще, мне кажется, Вы зря храните имена таблиц в константах. В самом деле, Вы же не храните имена переменных программы и функций в константах:
Code (php): скопировать код в буфер обмена
define (www.php.net/define)("MY_FUNC", "something");
call_user_func (www.php.net/call_user_func)(MY_FUNC, ...);
#
 
Соответственно, если понять необходимость использования префиксов я еще могу, то вставки имени таблицы как единого целого - вряд ли (мне кажется, это излишество; я сами никогда не применяю). Ну а для вставки префикса можно сделать как-то так:
Code (php): скопировать код в буфер обмена
$DB->setIdentPrefix("phpbb_");
$DB->query("SELECT * FROM ?_user ...."); # (placeholder '?_', соответственно)
# -> "SELECT * FROM `phpbb_user` ..."
 
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Fri Dec 09, 2005 2:48 pm (спустя 1 день 1 час 8 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Злостный оффтопик от нежелания прочитать документацию»,
расположенную в форуме Лень сходить в Поиск или почитать документацию (09 Декабря 2005, 14:48).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sat Dec 10, 2005 4:39 pm (спустя 1 день 1 час 51 минуту)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Оффтопик от непонимания главной идеи библиотеки»,
расположенную в форуме Лень сходить в Поиск или почитать документацию (10 Декабря 2005, 16:39).
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Mon Dec 12, 2005 11:17 am (спустя 1 день 18 часов 38 минут; написано за 3 минуты 24 секунды)
   Post subject:
Reply with quote

Дим, когда допишешь статью?
есть несколько вопросов, но пока их придержу. Единственно что:
Code (php): скопировать код в буфер обмена
function _transform2hash($rows, $ak)
{
  $result = array (www.php.net/array)();
  foreach ($rows as $row) {
    $k = $row[$ak];
    unset (www.php.net/unset)($row[$ak]);
    $result[$k] = $row;
  }
  return $result;
}
насколько оправдана такая конструкция? В моей практике ни разу не было необходимости в unset($row[$ak]); В двух-мерных массивах все равно в 99% случаях обращение идет по ассоциативному ключу. Может все-таки
Code (php): скопировать код в буфер обмена
function _transform2hash($rows, $ak)
{
  foreach ($rows as $row) {$result[$row[$ak]] = $row;}
  return $result;
}
Back to top
Иван Шумков
Участник форума



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

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

PostPosted: Mon Dec 12, 2005 4:34 pm (спустя 5 часов 16 минут; написано за 32 секунды)
   Post subject:
Reply with quote

Quote:
Дим, когда допишешь статью?
Действительно: ждем недождемся!
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Tue Dec 13, 2005 12:41 pm (спустя 20 часов 7 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

Гость wrote:
насколько оправдана такая конструкция?
Я просто старался сделать так, чтобы не было лишнего мусора, а выборка в любом случае не содержала "зарезервированных" слов ARRAY_KEY и PARENT_KEY. Думаю, из соображения эстетики это оправдано. Хотите получить ARRAY_KEY-поле явно - так и пишите:
Code (SQL): скопировать код в буфер обмена
SELECT id AS ARRAY_KEY, id, name, ... FROM TABLE
Back to top
View user's profile Send private message Send e-mail
Лобач Олег
Участник форума



Joined: 05 May 2003
Posts: 72
Карма: 6
   поощрить/наказать

Location: Новокузнецк

PostPosted: Wed Dec 14, 2005 8:13 am (спустя 19 часов 32 минуты; написано за 5 минут 52 секунды)
   Post subject:
Reply with quote

Обнаружил баг в функции _performTotal для MySQL.
При попытке выполнить selectPage скрипт валится из-за ошибки в SQL - инвалидный запрос при определении количества записей.
Для исправления бага заменить:
Code (php): скопировать код в буфер обмена
$query[0] = $m[1] . "COUNT(*) AS C" . $m[4]; //
 
на:
Code (php): скопировать код в буфер обмена
$query[0] = $m[1] . "COUNT(*) AS C" . $m[3];
Что логично, если посмотреть на шаблон парой строчек выше. Дмитрий, видимо Вы скопировали эту функцию из IB, но забыли поставить нужный индекс элемента.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Dec 14, 2005 3:54 pm (спустя 7 часов 40 минут; написано за 4 секунды)
   Post subject:
Reply with quote

Спасибо, исправил.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


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

version 1.30
- Добавился новый тип placeholder-а: ?#. Пример:
Code (php): скопировать код в буфер обмена
$field = 'someField';
$DB->query("UPDATE tbl SET ?#=10", $field);
# -> UPDATE tbl SET `someField`=10 - для MySQL
# -> UPDATE tbl SET "someField"=10 - для FireBird

$table = 'someTable';
$DB->query("UPDATE ?# SET a=10", $table
# -> UPDATE `someTable` SET a=10 - для MySQL
 
- Добавился параметр $isIdent в escape(): если true, она квотит строку как идентификатор.
Back to top
View user's profile Send private message Send e-mail
Mich
Участник форума
Warnings: 1


Joined: 15 Jun 2005
Posts: 197
Карма: -3
   поощрить/наказать


PostPosted: Sun Dec 25, 2005 8:23 pm (спустя 9 дней 4 часа 6 минут; написано за 7 минут 30 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
У вас, по-видимому, опечатка-недосмотр:
Code (php): скопировать код в буфер обмена
class DbSimple_Mysql_Blob extends DbSimple_Abstract_Database_Blob
{
    // MySQL does not support separate BLOB fetching.
    var $blobdata = null;
    var $curSeek = 0;

    function DbSimple_Ibase_Blob(&$database, $blobdata=null)
    {
Конструктор забыли переименовать...

Я тут пытаюсь понять, как вы сделали транзакции... Тема для меня абсолютно новая, поэтому требую снисхождения ;) В MySQL таблицы типа MyIsam транзакции не поддерживают (commit, rollback). Что делает в этом случае библиотека? Эксперимент ничего не говорит.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sun Dec 25, 2005 9:29 pm (спустя 1 час 6 минут; написано за 1 минуту 28 секунд)
   Post subject:
Reply with quote

Mich wrote:
Конструктор забыли переименовать...
Да, так и есть, спасибо. Новая версия - 1.31.
Mich wrote:
В MySQL таблицы типа MyIsam транзакции не поддерживают
Соответственно, транзакции и не будут работать, чудес не бывает. Правда, ошибки тоже, скорее всего, выдаваться не будет. Команды просто проигнорируются. Так уж устроен MySQL.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Thu Dec 29, 2005 5:37 pm (спустя 3 дня 20 часов 8 минут; написано за 38 секунд)
   Post subject:
Reply with quote

version 1.32
- исправлен баг с $DB->database->blob(): в блобах не сохранялся линк на объект - базу данных.
Back to top
View user's profile Send private message Send e-mail
aross
Участник форума



Joined: 14 May 2005
Posts: 48
Карма: 3
   поощрить/наказать

Location: Вологда

PostPosted: Thu Jan 12, 2006 10:52 am (спустя 13 дней 17 часов 14 минут; написано за 1 минуту 26 секунд)
   Post subject:
Reply with quote

Абстрагирование от параметров подключения к СУБД: подключение к СУБД использует единообразную строку коннекта (DSN — Data Source Name):
connech("mysql://login:password@database?options").
Наверно, опечатка connect
Back to top
View user's profile Send private message
Albatros2001
Guest





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


PostPosted: Wed Jan 18, 2006 4:09 pm (спустя 6 дней 5 часов 17 минут; написано за 21 минуту 18 секунд)
   Post subject:
Reply with quote

Иван Шумков wrote:
 Котеров
Иван Шумков wrote:
Как получить просто от запроса ресурс а не уже собранный масив данных из этого ресурса?
Никак, это и не нужно в скриптах. Данный слой абстракции попросту исключен.
Дмитрий, если я правильно понял, получить сырой result нельзя? А как быть, если необходимо в полученном массиве выполнять поиск и получение ключа по value? К примеру, необходмимо получить из базы данных все названия рубрик каталога, их id и поле parent, опрелеляющее вложенность их друг друга и поле hide, определяющее публикуется эта рубрика или скрыта. Затем в решаемой задаче возникает ситуация, когда необходимо в одном месте скрипта узнать все id скрытых рубрик, а в другом месте получить все id с одним значением parent (всех детей рубрики)?

Оптимальный вариант решения - запросить сырой result из базы данных и самостоятельно его разобрать, сформировав на выходе два одномерных массива id=>name и id=>parent и работать с ними.

При работе же с библиотекой мы получаем или двухмерный массив с ключом по id (и мучаемся с перереборкой всех его элементов) или же выполяем два запроса: один для формирования одного двухмерного массива, второй - для второго. А если нужных полей, будет не два, а больше? Делаем для каждого из них отдельные запросы?

Может быть есть какое-нибудь грамотное решение, а я просто неправильно решаю поставленные задачи?

Еще, Дмитрий. Для получения результата в виде значения одной ячекйи мы запрашиваем одну функцию, для получения столбца - вторую, для получения двух столбцов третью, для двухмерного массива - четвертую. Дополнительно еще одна функция преобразования массива.

Разве нельзя вызывать одну единственную функцию, в параметрах которых указать что мы хотим получить:
value - значение ячейки
row - одномерный массив строки таблицы (как вариант с выбором ассоциированный массив на выходе или числовой)
col - одномерный массив столбца таблицы
2col - одномерный массив двух столбцов с ключом по первому
array - двухмерный массив
key_array - тоже, но с ключом по id

Интерфейс запросов тогда будет единым.

Возможно я что-то снова не понял и это не будет удобнее?
Тогда прошу меня извинить, объясните, пожалуйста.
Back to top
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Goto page 1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
Page 1 of 10    Email to a Friend.
You cannot post new topics in this forum. You can 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 can download files in this forum.
XML