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

DbSimple v2.x: лаконичная работа с различными СУБД (Дмитрий Котеров, оценка: 10)
Goto page Previous  1, 2, 3, 4, 5 ... 13, 14, 15  Next
Author Message
Vesna
Guest





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


PostPosted: Mon May 28, 2007 2:24 pm (написано за 1 минуту 26 секунд)
   Post subject:
Reply with quote

А какие базы данных планируется еще поддерживать в DbSimple? Например, Oracle?
Back to top
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Tue May 29, 2007 1:17 am (спустя 10 часов 53 минуты; написано за 6 минут 29 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Юрик wrote:
Пример - универсальный модуль авторизации
Я думаю, если модуль по-настоящему универсален, то он должен хранить имена таблиц не в константах, а в свойствах объекта. Так что смысла в константах все равно нет...
Ok, но остаётся проблема отделения имён таблиц и полей от добавляемых данных. Уж очень привлекательно в параметрах передавать только данные, а структурные элементы добавлять каким-то другим способом. Пока идей нет, кроме как через константы (
Back to top
View user's profile Send private message
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Sat Jun 02, 2007 3:31 pm (спустя 4 дня 14 часов 13 минут; написано за 6 минут 7 секунд)
   Post subject:
Reply with quote

Пара предложений

1.
вместо
Code (php): скопировать код в буфер обмена
define (www.php.net/define)('DBSIMPLE_SKIP', log (www.php.net/log)(0));
делать что-то вроде такого
Code (php): скопировать код в буфер обмена
define (www.php.net/define)('DBSIMPLE_SKIP', md5 (www.php.net/md5)(uniqid (www.php.net/uniqid)(microtime (www.php.net/microtime)(), 1)) );
имхо, так потенциально безопасней, хотя и передать значение log(0) через входные параметры пока неудаётся никаким способом

2.
Для MySQL добавить метод, который бы выбирал кодировку соединения (вроде бы такого пока нет), примерно так:
Code (php): скопировать код в буфер обмена
mysql_query (www.php.net/mysql_query)("SET NAMES '" . addslashes (www.php.net/addslashes)($this->charset) . "'");
На иностранных хостингах с этим всё время проблемы - если не указывать кодировку явно, результат выборки (текст в кириллице) будет нечитаемым

~ add
3.
Был немного удивлён, когда увидел, что обработка запроса в select() и selectRow() по сути ничем не отличается:
Code (php): скопировать код в буфер обмена
$this->_query($args, $total);
Т.е. даже если выбирается только одна строка, всё равно формируется массив с полной выборкой (в случае, если она больше 1 строки)
Было бы неплохо для selectRow() либо возвращать из метода _query() гарантированно только одну строку, не обрабатывая остальные строки вообще (если они есть). Либо (что, на мой взгляд, лучше), добавлять в конец LIMIT 1 (если его ещё нет :-) ).
Back to top
View user's profile Send private message
Grafs
Заглянувший



Joined: 04 Jun 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Mon Jun 04, 2007 1:49 am (спустя 1 день 10 часов 18 минут)
   Post subject: Не работает $DB->link
Reply with quote

Здравствуйте.
Нt могу понять почему не работает такая конструкция:
Code (php): скопировать код в буфер обмена
$rowdd = $db->query('SELECT name FROM table');
echo (www.php.net/echo) mysql_field_type (www.php.net/mysql_field_type)($db->link,0);
Хочу получить тип поля, но на такой вопрос выдает ошибку:
Quote:
Warning: mysql_field_type(): supplied resource is not a valid MySQL
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Jun 04, 2007 2:29 am (спустя 39 минут; написано за 26 секунд)
   Post subject:
Reply with quote

Grafs wrote:
Хочу получить тип поля, но на такой вопрос выдает ошибку:
Вы научитесь отличать идентификатор соединения с базой данных и идентификатор результата запроса.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Mon Jun 04, 2007 10:38 am (спустя 8 часов 8 минут; написано за 5 минут 25 секунд)
   Post subject:
Reply with quote

Юрик wrote:
Для MySQL добавить метод, который бы выбирал кодировку соединения
Нарушает идеологию DbSimple.
Просто нужно вручную выполнить этот запрос после подключения.
Юрик wrote:
что обработка запроса в select() и selectRow() по сути ничем не отличается ... добавлять в конец LIMIT 1
Также нарушает идеологию, ИМХО.
Ведь раз программист пишет SelectRow, значит он точно знает что в результате выборки будет 1 строка. Следовательно, установит в SQL-запрос LIMIT 1 (FIRST 1 и проч). А метод создан только чтобы трансформировать двухмерный массив с одной строкой в ассоциативный, т.е. немного облегчить рутину тому же программисту.

Прикол-то как раз в том, что DbSimple создана не для выравнивания диалектов.
Back to top
View user's profile Send private message Send e-mail
Grafs
Заглянувший



Joined: 04 Jun 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Mon Jun 04, 2007 11:56 am (спустя 1 час 17 минут; написано за 1 минуту 44 секунды)
   Post subject: Как можно при помощи данного класса получить свойства полей
Reply with quote

Юpий Насрeтдинов wrote:
Grafs wrote:
Хочу получить тип поля, но на такой вопрос выдает ошибку:
Вы научитесь отличать идентификатор соединения с базой данных и идентификатор результата запроса.
Ок, я не говорю что я спец, я прошу помощи. Как можно при помощи данного класса получить свойства полей (тип, коментарий и т.д.)?
Back to top
View user's profile Send private message
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Mon Jun 04, 2007 3:52 pm (спустя 3 часа 56 минут; написано за 6 минут 35 секунд)
   Post subject:
Reply with quote

Quote:
Quote:
Для MySQL добавить метод, который бы выбирал кодировку соединения
Нарушает идеологию DbSimple.
Как знать, это может быть просто необязательный параметр при инициализации соединения
Quote:
Quote:
что обработка запроса в select() и selectRow() по сути ничем не отличается ... добавлять в конец LIMIT 1
Также нарушает идеологию, ИМХО.
Вот здесь не соглашусь - если нужно выбрать один ряд, значит, должен быть выбран ровно один ряд. Спорным является добавление LIMIT 1, а вот полный массив формировать точно не нужно.

Пример глюка:
вместо
Code (SQL): скопировать код в буфер обмена
SELECT * FROM USERS WHERE id=?
программист напишет, например, так:
Code (SQL): скопировать код в буфер обмена
SELECT * FROM USERS WHERE groupid=?
в результате в массиве выборки может быть хоть миллион записей.
При этом могут быть такие ошибки в логике, которые явно не проявят себя в работе программы, но лишняя память будет выделяться.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon Jun 04, 2007 7:17 pm (спустя 3 часа 25 минут; написано за 1 минуту 17 секунд)
   Post subject:
Reply with quote

Юрик wrote:
define('DBSIMPLE_SKIP', md5(uniqid(microtime(), 1)) );
имхо, так потенциально безопасней
Непонятно, ПОЧЕМУ так безопасней.
Юрик wrote:
Для MySQL добавить метод, который бы выбирал кодировку соединения
Нет смысла - не тот слой абстракции.
Юрик wrote:
Либо (что, на мой взгляд, лучше), добавлять в конец LIMIT 1 (если его ещё нет :-) )
А смысл? Если делают selectRow, это подразумевает, что строка всего одна. Кроме того, DbSimple не изменяет внешний вид SQL-запросов (в частности, не добавляет limit) - не тот слой абстракции. В документации об этом написано.
Back to top
View user's profile Send private message Send e-mail
Vesna
Guest





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


PostPosted: Tue Jun 05, 2007 2:40 pm (спустя 19 часов 23 минуты; написано за 7 секунд)
   Post subject:
Reply with quote

А какие базы данных планируется еще поддерживать в DbSimple? Например, Oracle?
Back to top
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Tue Jun 05, 2007 8:37 pm (спустя 5 часов 56 минут; написано за 4 минуты 35 секунд)
   Post subject:
Reply with quote

Quote:
Непонятно, ПОЧЕМУ так безопасней.
Если удастся передать в качестве параметра значение, соответствующее log(0) в PHP (в текущих версиях PHP этого сделать пока нельзя), то возможно несанкционированное изменение логики работы выборки.
Quote:
А смысл? Если делают selectRow, это подразумевает, что строка всего одна.
Программист может ошибиться, и будет сгенерирован массив из 1000000 записей (=> перерасход памяти), а вернётся всё равно всего одна строка.
Quote:
Кроме того, DbSimple не изменяет внешний вид SQL-запросов (в частности, не добавляет limit) - не тот слой абстракции. В документации об этом написано.
Ок, но хотя бы не обрабатывать все строки результата, а только первую?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Jun 05, 2007 10:30 pm (спустя 1 час 53 минуты; написано за 7 секунд)
   Post subject:
Reply with quote

Юрик wrote:
Программист может ошибиться, и будет сгенерирован массив из 1000000 записей (=> перерасход памяти), а вернётся всё равно всего одна строка.
Вы, видимо, так и не поняли суть этого метода :).
Back to top
View user's profile Send private message Send e-mail
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Tue Jun 05, 2007 11:53 pm (спустя 1 час 23 минуты; написано за 3 минуты 21 секунду)
   Post subject:
Reply with quote

Юpий Насрeтдинов wrote:
Юрик wrote:
Программист может ошибиться, и будет сгенерирован массив из 1000000 записей (=> перерасход памяти), а вернётся всё равно всего одна строка.
Вы, видимо, так и не поняли суть этого метода :).
Может быть, пока мне действительно непонятно, зачем делать именно так:
Code (php): скопировать код в буфер обмена
    function selectRow()
    {
        $args = func_get_args (www.php.net/func_get_args)();
        $total = false;
        $rows = $this->_query($args, $total);
        if (!is_array (www.php.net/is_array)($rows)) return $rows;
        if (!count (www.php.net/count)($rows)) return array (www.php.net/array)();
        reset (www.php.net/reset)($rows);
        return current (www.php.net/current)($rows);
    }
т.е. сама функция selectRow() работает с полученным массивом не как с гарантированно-одним массивом-строкой таблицы, а как с потенциально-многострочным. Вот и думаю - не лучше ли в функции _query() для метода selectRow() гарантированно выбирать из БД не более одной строки, не засоряя память другими лишними строками (если они вдруг будут).
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Jun 06, 2007 4:13 pm (спустя 16 часов 19 минут; написано за 6 минут 2 секунды)
   Post subject:
Reply with quote

Юрик wrote:
не как с гарантированно-одним массивом-строкой таблицы, а как с потенциально-многострочным.
Скажу более, с гарантированно многострочным по структуре (-;
Юрик wrote:
не лучше ли в функции _query() для метода selectRow() гарантированно выбирать из БД не более одной строки
И что за гарантия? автоконкатенация LIMIT 1? Тогда тут же получаем:
 * слет всех проектов при обновлении;
 * возведенную в примерно 10-ю степень и без того громадную кучу жалоб: почему ничего не работает (ведь не все читают документацию внимательно и даже надпись LIMIT в запросе selectRow() писать нельзя, иначе получите SQL-еггог);
 * еще что-нибудь нехорошее, что сразу в голову не лезет.
Юрик wrote:
не засоряя память другими лишними строками (если они вдруг будут).
От кривых рук спасает только топор. Конечно нехорошо заставлять программиста думать о таких мелочах, как работа с памятью, но только в том случае, когда он с ней работать уже умеет!
Back to top
View user's profile Send private message
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Wed Jun 06, 2007 7:35 pm (спустя 3 часа 22 минуты; написано за 2 минуты 57 секунд)
   Post subject:
Reply with quote

Quote:
И что за гарантия? автоконкатенация LIMIT 1?
я же писал: не помещать в выходной массив функции _query() более одной строки результата, чтобы не забивать память.
Подумайте сами, решение беспроигрышное, т.к. selectRow() всё равно возвращает только первую строку. Про LIMIT можно забыть, это был альтернативный спорный вариант.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Wed Jun 06, 2007 10:18 pm (спустя 2 часа 42 минуты; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Юрик
Предложите свою реализацию, и она будет принята к рассмотрению.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Jun 07, 2007 9:48 am (спустя 11 часов 30 минут; написано за 3 минуты 15 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
$IBASE->select('
        SELECT u.UPD_ID, u.UPD_CAPTION, COUNT(m.MR_ID) AS MIRRORS_QTY
        FROM PRODUCT_UPDATES u
                LEFT JOIN PRODUCT_UPDATES_MIRRORS m ON u.UPD_ID=m.UPD_ID
        GROUP BY 1, 2
        ORDER BY 1 ASC
        '

);
/*
    SELECT u.UPD_ID, u.UPD_CAPTION, COUNT(m.MR_ID) AS MIRRORS_QTY
    FROM PRODUCT_UPDATES u
        LEFT JOIN PRODUCT_UPDATES_MIRRORS m ON u.UPD_ID=m.UPD_ID
    GROUP BY 1, 2
    ORDER BY 1 ASC
   
  -- 7 ms; returned 0 row(s)
*/
Теперь тот же запрос, только ORDER BY с плейсхолдером:
Code (php): скопировать код в буфер обмена
$IBASE->select('
        SELECT u.UPD_ID, u.UPD_CAPTION, COUNT(m.MR_ID) AS MIRRORS_QTY
        FROM PRODUCT_UPDATES u
                LEFT JOIN PRODUCT_UPDATES_MIRRORS m ON u.UPD_ID=m.UPD_ID
        GROUP BY 1, 2
        ORDER BY ?d ASC
        '
, 1
);
/*
    SELECT u.UPD_ID, u.UPD_CAPTION, COUNT(m.MR_ID) AS MIRRORS_QTY
    FROM PRODUCT_UPDATES u
        LEFT JOIN PRODUCT_UPDATES_MIRRORS m ON u.UPD_ID=m.UPD_ID
    GROUP BY 1, 2
    ORDER BY 1 ASC
   
  -- error #-804: Dynamic SQL Error SQL error code = -804 Data type unknown
  -- 6 ms; returned ''
*/
DbSimple2, Generic.php 186, Ibase.php 163
PHP 5.2.x, Firebird 1.5.x

Насколько я понял, ошибка возникает на этапе "родного" ibase_prepare(), вот только что с этим делать?
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Jun 07, 2007 4:59 pm (спустя 7 часов 10 минут; написано за 59 секунд)
   Post subject:
Reply with quote

О, нашел атрибут DbSimple_Ibase_USE_NATIVE_PHOLDERS
Моя проблема лечится так:
Code (php): скопировать код в буфер обмена
$IBASE->DbSimple_Ibase_USE_NATIVE_PHOLDERS = false;
(конечно, это борьба с симптомами, не с причиной заболевания)
Back to top
View user's profile Send private message Send e-mail
LoopCircle
Заглянувший



Joined: 05 Jun 2007
Posts: 4
Карма: 0
   поощрить/наказать


PostPosted: Fri Jun 08, 2007 11:00 am (спустя 18 часов 1 минуту; написано за 2 минуты 22 секунды)
   Post subject: ошибка Cannot redeclare class dbsimple_generic_database in z:\home\nik\www\lib\DbSimple\Generic.php
Reply with quote

Здравствуйте, коллеги!
Помогите пожалуйста разобраться: выдаёт сабж, на денвере с 4-м PHP всё ОК, на хостинге (Дебиан) с 4-м PHP тоже ОК, а на апаче с 5-м PHP - собственно сабж. Может кто уже сталкивался?
Заранее благодарен!
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Jun 08, 2007 12:12 pm (спустя 1 час 12 минут; написано за 2 минуты 28 секунд)
   Post subject:
Reply with quote

LoopCircle
В php5 все работает. Ищите объявление класса:
Code (Bash): скопировать код в буфер обмена
for i in `find /path/to/your/document/root/* -iname '*.php'`; do echo $i; grep 'DbSimple_Generic_Database' $i; done;
Back to top
View user's profile Send private message
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Fri Jun 08, 2007 4:11 pm (спустя 3 часа 58 минут; написано за 31 секунду)
   Post subject:
Reply with quote

Quote:
Fatal error: Call to undefined function: setcacheprefix() in DbSimple/Generic.php on line 117
свежескачанная библиотека
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Jun 08, 2007 4:51 pm (спустя 40 минут; написано за 18 секунд)
   Post subject:
Reply with quote

RTFM!
setCachePrefix()
Back to top
View user's profile Send private message
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Fri Jun 08, 2007 5:49 pm (спустя 57 минут; написано за 1 минуту 53 секунды)
   Post subject:
Reply with quote

простите, не понял Вашего ответа.

Я ведь что сделал - поставил библиотеку as is, запустил тестовый файл. получил вот такое сообщение об ошибке. почему без сохранения регистра - для меня загадка. в файл лазил - там вроде нормально: $object->setCachePrefix(md5(serialize($parsed['dsn'])));
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Sat Jun 09, 2007 2:09 pm (спустя 20 часов 19 минут; написано за 1 минуту 9 секунд)
   Post subject:
Reply with quote

Никита Косолaпов
Ответ про чувствительность к регистру.
Попробуйте так:
Code (Bash): скопировать код в буфер обмена
for i in `find /path/to/your/document/root/* -iname '*.php'`; do echo $i; grep 'setcacheprefix' $i; done;
(-;
Back to top
View user's profile Send private message
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Sat Jun 09, 2007 3:00 pm (спустя 51 минуту; написано за 1 минуту 14 секунд)
   Post subject:
Reply with quote

web/lib/DbSimple/Generic.php: $object->setCachePrefix(md5(serialize($parsed['dsn'])));
web/lib/DbSimple/Generic.php: function setCachePrefix($prx)

только 2 вхождения. оба - внутри библиотеки...
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Mon Jun 11, 2007 11:48 am (спустя 1 день 20 часов 47 минут; написано за 10 минут 14 секунд)
   Post subject:
Reply with quote

У меня по DbSimple накопилось много вопросов, и решился задать их все сразу.

1. Стоит ли использовать класс, если я не собираюсь работать с разными базами, а просто из-за удобства в написании запросов? Прошу поправить меня, но говорят работа с классами нагружает CPU сервака.

2. Мне очень интересен запрос
Code (php): скопировать код в буфер обмена
foreach ($array as $item) {
  // DbSimple понимает, что prepare нужно выполнить всего один раз!
  $DB->query('INSERT INTO tbl(field) VALUES(?)', $item);
}
используя этот подход скорость добавления значительно меньше чем
Code (php): скопировать код в буфер обмена
for ($i = 1, $max = $view, $s = ''; $i <= $max; $i++) {\
  $DB->query('INSERT INTO view(id_account) VALUES(?)', $id');
}
за 30 сек при первом запросе в базу я успеваю добавить 30 000 записей, а при втором ~ 85 000

может я ошибся. Помогите, пожалуйста, переписать мой insert как нужно.

3. Для подсчёта статистики я делаю запрос с count(*) , а вот правильно ли я его делаю (через selectCell)?
Code (php): скопировать код в буфер обмена
$r1 = $DB->selectCell(
  'SELECT count(*) FROM stat WHERE id_account=? AND action=? AND date>=?', $account['id'], 'view', $today
);
Back to top
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Jun 13, 2007 3:02 pm (спустя 2 дня 3 часа 14 минут; написано за 52 секунды)
   Post subject:
Reply with quote

Гость wrote:
Стоит ли использовать класс, если я не собираюсь работать с разными базами, а просто из-за удобства в написании запросов?
Библиотека собственно для этого и создана.
Гость wrote:
а 30 сек при первом запросе в базу я успеваю добавить 30 000 записей, а при втором ~ 85 000
Насколько я помню, foreach в принципе медленнее, чем for.
Гость wrote:
а вот правильно ли я его делаю (через selectCell)?
Правильно.
Back to top
View user's profile Send private message
five
Заглянувший



Joined: 31 Jul 2003
Posts: 9
Карма: 0
   поощрить/наказать


PostPosted: Wed Jun 13, 2007 6:18 pm (спустя 3 часа 16 минут; написано за 2 минуты 50 секунд)
   Post subject: проблема с ARRAY_KEY
Reply with quote

есть запрос:
Code (php): скопировать код в буфер обмена
$this->res=$this->db->select('SELECT
   aw.wname as ARRAY_KEY,
   awc.name,
   wf.name
FROM rc_work AS aw
LEFT JOIN rc_sp_category awc ON ( awc.id=aw.wtype )
LEFT JOIN rc_work_files wf ON ( wf.uid = aw.uid AND wf.wid = aw.id )
WHERE aw.id >0 AND aw.uid =?d'
,$uid);
возвращает след.
[img]imageshost.ru/links/0613191358[/img]
но переменная $this->res почему-то получается такой:
Code (php): скопировать код в буфер обмена
array (www.php.net/array)(4) { ["a"]=>  array (www.php.net/array)(1) { ["name"]=>  NULL } ["o"]=>  array (www.php.net/array)(1) { ["name"]=>  string(16) "118174268914.jpg" } ["z"]=>  array (www.php.net/array)(1) { ["name"]=>  string(15) "11817418442.jpg" } ["qq"]=>  array (www.php.net/array)(1) { ["name"]=>  string(15) "11817426167.jpg" } }
где я не прав?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jun 14, 2007 1:26 am (спустя 7 часов 7 минут; написано за 3 минуты 48 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
ORDER BY ?d ASC
Попробуйте ?n - по идее, он не должен в "родной" превращаться. Правда, он подставит NULL, если ему передать 0, но вряд ли Вам это помешает?
Никита Косолaпов wrote:
Fatal error: Call to undefined function: setcacheprefix() in DbSimple/Generic.php on line 117
Не воспроизводится. Уточните, в какой момент возникает ошибка, а также приведите кусок кода, в котором она возникает. Желательно поподробнее.
На той строке стоит $object->setCachePrefix(...), при чем тут "undefined function", вообще непонятно.
Гость wrote:
за 30 сек при первом запросе в базу я успеваю добавить 30 000 записей
Вообще говоря, DbSimple затачивалась на работу с типичными скриптами. Т.е. со скриптами, выполняющими максимум несколько сотен запросов к базе за раз. Там и кэширование тоже на это рассчитывает, так что в случае, когда надо вставлять тысячи записей в базу, надо быть аккуратным - возможна жручесть памяти.

five
А что не нравится? Поле ARRAY_KEY должно быть уникальным в выборке, в этом весь смысл создания ассоциативного массива.
Back to top
View user's profile Send private message Send e-mail
five
Заглянувший



Joined: 31 Jul 2003
Posts: 9
Карма: 0
   поощрить/наказать


PostPosted: Thu Jun 14, 2007 2:16 pm (спустя 12 часов 50 минут; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

Понятно, а мне показалось, чтобы ARRAY_KEY по другому работает.
Back to top
View user's profile Send private message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 184
   поощрить/наказать

Location: Москва

PostPosted: Fri Jun 22, 2007 6:35 pm (спустя 8 дней 4 часа 19 минут; написано за 15 минут 35 секунд)
   Post subject:
Reply with quote

Я пишу шаблонизатор SQL кода, в процессе решил немного поизучать DbSimple.
И вот что обнаружилось.

В функции _expandPlaceholdersFlow($query) файла Generic.php у меня возникли сомнения на счет правильного использования регулярного выражения с рекурсией. Здесь рекурсия не работает (попробуйте ее убрать).
Code (php): скопировать код в буфер обмена
...
                # Optional blocks
                \{
                    ( (?> (?>[^{}]*)  |  (?R) )* )             #1
                \}
...
Как я понял, алгоритм обрабатывает блоки вида {...} от внутренних к внешним.
Это так и задумано?

По идее, должно быть так:
Code (php): скопировать код в буфер обмена
...
                # Optional blocks
                \{
                    ( (?> (?>[^{}]+)  |  (?R) )* )             #1
                \}
...
Но в этом случае меняется направление обработки блоков: от внешних к внутренним.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sun Jun 24, 2007 4:43 pm (спустя 1 день 22 часа 8 минут; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Непонятно, что Вы имеете в виду.
Синтаксис ?R описан тут: hu2.php.net/manual/ru/reference.pcre.pattern.syntax.php

Захватывается МАКСИМАЛЬНОЕ скобочное выражение, разве нет?
Ваш вариант отличается от имеющегося только тем, что там + вместо *.
Back to top
View user's profile Send private message Send e-mail
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 184
   поощрить/наказать

Location: Москва

PostPosted: Sun Jun 24, 2007 6:06 pm (спустя 1 час 22 минуты; написано за 4 минуты 2 секунды)
   Post subject:
Reply with quote

В том то и дело, что в Вашем рег. выражении захватывается минимальное скобочное выражение вместо максимального, а виной тому * вместо +, до ?R дело не доходит.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sun Jun 24, 2007 11:25 pm (спустя 5 часов 18 минут; написано за 2 минуты 35 секунд)
   Post subject:
Reply with quote

Погодите. Я не понимаю, как там может захватываться минимальное выражение.
Можно пример строки, для которой выражение работает неправильно?

Вообще, задача данного выражения - захватить ОДИН МАКСИМАЛЬНЫЙ кусок строки. Если там вложенные скобки, то - захватить самые ВНЕШНИЕ скобки. Внутренние будут обработаны позже, когда произойдет рекурсивный вызов _expandPlaceholdersFlow. На данном этапе они НЕ захватываются, а просто проверяется балансировка.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



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

Location: Питер

PostPosted: Mon Jun 25, 2007 1:08 am (спустя 1 час 43 минуты; написано за 2 минуты 11 секунд)
   Post subject:
Reply with quote

Вся разница между
Code (any language): скопировать код в буфер обмена
[^{}]*
и
Code (any language): скопировать код в буфер обмена
[^{}]+
в том, + требует минимум 1 совпадение с паттерном, а * - 0.
Минимальностью квантификаторов рулит флаг U и модификатор ?.
Back to top
View user's profile Send private message
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 184
   поощрить/наказать

Location: Москва

PostPosted: Mon Jun 25, 2007 9:52 am (спустя 8 часов 44 минуты; написано за 1 минуту 17 секунд)
   Post subject:
Reply with quote

Смотрим и удивляемся (PHP Version 5.2.1)

t_regexp_R.php:
Code (php): скопировать код в буфер обмена
<?
$re = '{
    (?>
        # Ignored chunks.
        (?>
            # Comment.
            -- [^\r\n]*
        )
          |
        (?>
            # DB-specifics.

            #this regexp from DbSimple_Mysql::_performGetPlaceholderIgnoreRe()
            "   (?> [^"\\\\]+|\\\\"|\\\\)*    "   |
            \'  (?> [^\'\\\\]+|\\\\\'|\\\\)* \'   |
            `   (?> [^`]+ | ``)*              `   |   # backticks
            /\* .*?                          \*/      # comments
        )
    )
      |
    (?>
        # Optional blocks
        \{
            ( (?> (?>[^{}]*)  |  (?R) )* )             #1
        \}
    )
      |
    (?>
        # Placeholder
        (\?) ( [_dsafn\#]? )                           #2 #3
    )
}sx'
;

$sql = 'SELECT *
          FROM t1
         WHERE 1 {AND a = ?d {AND b=?s}}'
;

preg_match_all (www.php.net/preg_match_all)($re, $sql, $m, PREG_SET_ORDER);

echo (www.php.net/echo) '<pre>';
print_r (www.php.net/print_r)($m);
echo (www.php.net/echo) '</pre>';
?>
actual result:
Code (html): скопировать код в буфер обмена
Array
(
    [0] => Array
        (
            [0] => ?d
            [1] =>
            [2] => ?
            [3] => d
        )

    [1] => Array
        (
            [0] => {AND b=?s}
            [1] => AND b=?s
        )

)
expected result:
Code (html): скопировать код в буфер обмена
Array
(
    [0] => Array
        (
            [0] => {AND a = ?d {AND b=?s}}
            [1] => AND a = ?d {AND b=?s}
        )

)
Back to top
View user's profile Send private message Send e-mail
Arcanum
Заглянувший



Joined: 24 Jun 2007
Posts: 10
Карма: 0
   поощрить/наказать

Location: Новосибирск

PostPosted: Thu Jun 28, 2007 5:44 am (спустя 2 дня 19 часов 51 минуту; написано за 6 минут 21 секунду)
   Post subject:
Reply with quote

Здравствуйте.

Недавно наткнулся на эту замечательную библиотеку ... в принципе все понятно относительно работы, но все таки у меня остался один непонятный момент ... нужно ли в запросах переменные скажем $_REQUEST обрабатывать addslashes для безопасности?

Ну если взять простой пример
$query = db->query("SELECT * FROM tbl WHERE id = $_REQUEST['id'] ");
В настоящий момент, чтобы обезопасить скрипт, приходилось как минимум писать вот так
$query = db->query("SELECT * FROM tbl WHERE id = addslashes($_REQUEST['id']) "); дабы исключить SQL-иньекции. Ну смысл я думаю понятен. Теперь если я напишу такой запрос $DB->select('SELECT * FROM tbl WHERE a=?, $_REQUEST['a']); мне нужно параметр $_REQUEST['a'] обрабатывать через addslashes или это уже стопроцентная гарантия безопасности?

Спасибо.
Back to top
View user's profile Send private message Send e-mail
ZuXuL
Заглянувший



Joined: 21 Feb 2006
Posts: 15
Карма: 1
   поощрить/наказать

Location: Bологда

PostPosted: Thu Jun 28, 2007 9:54 am (спустя 4 часа 9 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

Пользуйтесь так:
Code (php): скопировать код в буфер обмена
$query = db->query("SELECT * FROM tbl WHERE id = ? ",$_REQUEST['id']);
Либо поставьте вместо "?" другой нужный Вам плейсхолдер...и лучше читайте документацию...
Back to top
View user's profile Send private message
iljasp
Заглянувший



Joined: 03 Sep 2006
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Sun Jul 01, 2007 11:56 pm (спустя 3 дня 14 часов 2 минуты; написано за 13 минут 43 секунды)
   Post subject:
Reply with quote

Предлагаю 2 фичи:

1. Для решения проблемы уникальности полей
Code (php): скопировать код в буфер обмена
$db->query("SELECT ?# FROM users JOIN ...", array (www.php.net/array)('users'=>'user_id','foo','bar'));
на выходе получается:
Code (SQL): скопировать код в буфер обмена
SELECT `users`.`user_id`, `foo`, `bar` FROM users JOIN ...
Патч (к svn://dklab.ru/lib//DbSimple/tags/2.32):
Code (any language): скопировать код в буфер обмена
Index: Generic.php
===================================================================
--- Generic.php (revision 200)
+++ Generic.php (working copy)
@@ -824,9 +824,9 @@
                     // Identifier.
                     if (!is_array($value)) return $this->escape($value, true);
                     $parts = array();
-                    foreach ($value as $identifier) {
+                    foreach ($value as $table=>$identifier) {
                         if (!is_string($identifier)) return 'DBSIMPLE_ERROR_ARRAY_VALUE_NOT_STRING';
-                        $parts[] = $this->escape($identifier, true);
+                        $parts[] = (!is_int($table) ? $this->escape($table, true).'.' : '') . $this->escape($identifier, true);
                     }
                     return join(', ', $parts);
                 case 'n':
2. Для возможности добавления функций не лишаясь прелестей ?a предлагаю ввести что-то вроде вложенных подстановок, это позволит не отступаясь от нынешней лаконичности решать примерно следующую проблему
Code (php): скопировать код в буфер обмена
$db->query(
        "INSERT INTO users(?#) VALUES(?a)",
        array (www.php.net/array)('username','pass'),
        array (www.php.net/array)('vasya',array (www.php.net/array)('MD5(?)','mypass'))
);
на выходе должно получаться:
Code (SQL): скопировать код в буфер обмена
INSERT INTO users('username','pass') VALUES('vasya',MD5('mypass'))
Конечно в данном примере пароль можно зашифровать и на php-стороне, но вообщем в итоге у нас появится возможность использовать в ?a mysql-функции, а библиотека приобритет очень большую гибкость.
Просто пропатчить тут уже не получится, т.к. аргументы сохраняются в самом классе, и при разборе запроса достаются оттуда array_pop'ом, следовательно запустить вложенный _expandPlaceholders не получится, как я понимаю.
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Mon Jul 02, 2007 12:08 pm (спустя 12 часов 12 минут; написано за 1 минуту 53 секунды)
   Post subject:
Reply with quote

Рекомендую при использовании DbSimple с Firebird отключать использование родных плейсхолдеров. Уже второй раз наткнулся на ошибку, которая на данный момент лечится только таким образом:
Code (php): скопировать код в буфер обмена
$DB->DbSimple_Ibase_USE_NATIVE_PHOLDERS = false;
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
Goto page Previous  1, 2, 3, 4, 5 ... 13, 14, 15  Next
Page 4 of 15    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

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

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
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