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

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



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

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

PostPosted: Mon May 22, 2006 9:58 am (написано за 25 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров

404 File Not Found: The File files/dbsimple.zip does not exist.
Можно еще раз пожалуйста!
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon May 22, 2006 1:51 pm (спустя 3 часа 52 минуты; написано за 20 секунд)
   Post subject:
Reply with quote

Исправил.
Back to top
View user's profile Send private message Send e-mail
aleksey
Guest





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


PostPosted: Wed May 24, 2006 8:20 pm (спустя 2 дня 6 часов 29 минут; написано за 5 минут 39 секунд)
   Post subject:
Reply with quote

Если у меня есть несколько независимых класов в которых используются запросы к базе данных, нужно ли мене в каждом классе подключать данную библиотеку или нет. Если нет, то как правильно подключить?

например
Code (php): скопировать код в буфер обмена
$DB = $DATABASE->transaction();

class news
{
        function add()
        {
                $DB->??
                //
        }
       
}
Back to top
Иван Шумков
Участник форума



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

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

PostPosted: Wed May 24, 2006 8:37 pm (спустя 16 минут; написано за 1 минуту 39 секунд)
   Post subject:
Reply with quote

aleksey
Code (php): скопировать код в буфер обмена
class news
{
        var $db;

        function news(&$db)
        {
                $this->db = &$db;
        }
        function add()
        {
                $this->db->??
                // Так ее сделать доступной!!
        }
       
}
$DB = $DATABASE->transaction();
$news = &new news($DB);
Back to top
View user's profile Send private message
MpaK
Участник форума



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

Location: Ufa/Russia

PostPosted: Thu May 25, 2006 2:15 pm (спустя 17 часов 37 минут; написано за 45 секунд)
   Post subject:
Reply with quote

все гуд

не плохо бы еще добавить в логгер замеры времени на запрос, общее время на mysql и общее кол-во выполненных запросов
Back to top
View user's profile Send private message
MpaK
Участник форума



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

Location: Ufa/Russia

PostPosted: Thu May 25, 2006 2:33 pm (спустя 18 минут; написано за 38 секунд)
   Post subject:
Reply with quote

В документации мелкая ошибка

Выборка ячейки: selectCell()

листинг 22
$DB->selectRow - наверное надо заменить selectCell
Back to top
View user's profile Send private message
Alexander Sumskiy
Заглянувший



Joined: 30 May 2006
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Tue May 30, 2006 3:46 pm (спустя 5 дней 1 час 12 минут; написано за 5 минут 23 секунды)
   Post subject:
Reply with quote

Вчера поставил Firebird 2.0 (паралельно с 1.5), настроил для работы через порт 3051 и столкнулся с тем, что в библиотеке отсутствует возможность указать порт. Просмотрев исходники, выяснил что в модуле Ibase.php, в конструкторе класса DbSimple_Ibase необходимо стороку:
Code (php): скопировать код в буфер обмена
$p['hostspec'].":".$p['database'],
заменить на:
Code (php): скопировать код в буфер обмена
$p['hostspec'].(empty (www.php.net/empty)($p['port'])? "" : "/".$p['port']).":".$p['database'],
Работать это будет только для протокола tcp... :-)
Back to top
View user's profile Send private message
Kira
Guest





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


PostPosted: Fri Jun 02, 2006 4:05 pm (спустя 3 дня 19 минут; написано за 6 минут 30 секунд)
   Post subject:
Reply with quote

aleksey wrote:
Если нет, то как правильно подключить?
Можно так:
Code (php): скопировать код в буфер обмена
$DB = $DATABASE->transaction();

class news
{
        function add()
        {
        global (www.php.net/global) $DB;
                $DB->??
        }
       
}
Back to top
five
Заглянувший



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


PostPosted: Sat Jun 03, 2006 12:11 am (спустя 8 часов 5 минут; написано за 32 секунды)
   Post subject:
Reply with quote

А будет ли добавлена в библиотеку работа с Postgresql ? Если да, то когда можно ожидать?
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



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

Location: Киев

PostPosted: Mon Jun 12, 2006 4:32 pm (спустя 9 дней 16 часов 21 минуту; написано за 3 минуты 19 секунд)
   Post subject:
Reply with quote

Что если сделать возможность идентификаторному плейсхолдеру присваивать массив?
Например
Code (php): скопировать код в буфер обмена
$to_insert=array (www.php.net/array)('field_1'=>'value_1', 'field2'=>'value_2');
$DB->query('INSERT INTO ?_table (?#) VALUES (?a)', array_keys (www.php.net/array_keys)($to_isnert), array_values (www.php.net/array_values)($to_insert));
Кажется, достаточно чуть подправить _expandPlaceholdersCallback()
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Mon Jun 12, 2006 9:31 pm (спустя 4 часа 58 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

В принципе, да, можно.

В MySQL, правда, можно так писать:
Code (SQL): скопировать код в буфер обмена
$DB->query('INSERT INTO ?_table SET ?a', $to_isnert);
Back to top
View user's profile Send private message Send e-mail
test
Заглянувший



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


PostPosted: Wed Jun 21, 2006 5:29 pm (спустя 8 дней 19 часов 58 минут; написано за 16 минут 29 секунд)
   Post subject:
Reply with quote

А можно ли все же сблизить стандарты DbSimple и Database Placeholder (например ?@ вместо ?a, если уж работа с именованными плэйсхолдерами вам не нравится)? И почему собственно именованные плейсхолдеры исключены - они очень удобны для прямого указания переменного числа параметров, берущихся прямо из $_POST - когда динамически конструируется шаблон для query(). А здесь я еще не разобрался, как записывать query() при переменном числе параметров/плейсхолдеров... надо давать вторым параметром массив ($_POST['P1'],$_POST['P2'],...), строящийся одновременно с шаблоном?
Я например пользуюсь вашими плейсхолдерами с небольшой модификацией (новый тип ?$ для строк, которые не должны обрамляться апострофами - пример "Date < '?$DatY-?$DatM-?$DatD'", где DatM и DatD не числа, а строки с ведущим нулем - ключи разных <select> заполняемой пользователем формы), и своим классом-оберткой для MySQL, немного похожим на этот. Но с удовольствием перешел бы с чистого MySQL на ваш полный и универсальный DbSimple!
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jun 22, 2006 10:24 am (спустя 16 часов 55 минут; написано за 2 минуты 7 секунд)
   Post subject:
Reply with quote

test wrote:
например ?@ вместо ?a
Честно говоря, не вижу уже смысла что-то менять в этой области.
test wrote:
И почему собственно именованные плейсхолдеры исключены - они очень удобны для прямого указания переменного числа параметров
Потому что именованные placeholder-ы ведут к многократному дублированию идентификаторов. И на практике они оказались не так удобны, как казались.
test wrote:
А здесь я еще не разобрался, как записывать query() при переменном числе параметров/плейсхолдеров
Code (php): скопировать код в буфер обмена
$DB->query('UPDATE tbl SET ?a', array (www.php.net/array)('a' => 'aaa', 'b' => 'bbb'));
test wrote:
новый тип ?$ для строк, которые не должны обрамляться апострофами
Это очень плохое решение, безопасность хромает.
Back to top
View user's profile Send private message Send e-mail
test
Заглянувший



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


PostPosted: Thu Jun 22, 2006 1:12 pm (спустя 2 часа 48 минут; написано за 21 минуту 19 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
test wrote:
А здесь я еще не разобрался, как записывать query() при переменном числе параметров/плейсхолдеров
Code (php): скопировать код в буфер обмена
$DB->query('UPDATE tbl SET ?a', array (www.php.net/array)('a' => 'aaa', 'b' => 'bbb'));
А в SELECT? Разве не
Code (php): скопировать код в буфер обмена
$DB->query('SELECT * FROM tbl WHERE ID=? '.' AND Typ=? '.' AND Num<? '.''.''.''array (www.php.net/array)($_POST['ID'],$_POST['Typ'],$_POST['Num'],,,));
, где число параметров аналогичных Num переменно и зависит от Typ??? Ладно, сам проверю...
  1. Далее...
Дмитрий Котеров wrote:
test wrote:
новый тип ?$ для строк, которые не должны обрамляться апострофами
Это очень плохое решение, безопасность хромает.
Почему хромает? Я же не убираю экранирование спецсимволов внутри строки, мне надо только чтобы внешних апострофов не было, поскольку с аргументом-строкой что-то делается прямо в SQL. Вот вам другой, более наглядный пример:
Code (php): скопировать код в буфер обмена
$DB->query("SELECT * FROM tbl WHERE List LIKE '%?$%'", $_POST['Variant']);
Можно, конечно, в данном случае вначале до запроса написать оператор
Code (php): скопировать код в буфер обмена
$_POST['Variant']='%'.$_POST['Variant'].'%';
, тогда новый спецтип не нужен. Но не для всех случаев так можно и не всегда так удобнее.

Last edited by test on Thu Jun 22, 2006 1:52 pm; edited 2 times in total
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jun 22, 2006 1:19 pm (спустя 6 минут; написано за 3 минуты 26 секунд)
   Post subject:
Reply with quote

test wrote:
А в SELECT?
А в SELECT Вы должны четко представлять, какое именно условие в запросе, а не полагаться на список полей, пришедших извне. А то Вам там такое заселектят, мало не покажется...

В DbSimple2 планируется сделать возможность у ?# указывать не только скаляр, но и список, чтобы писать:
Code (php): скопировать код в буфер обмена
$DB->query('INSERT INTO t(?#) values(?a)', array_keys (www.php.net/array_keys)($data), array_values (www.php.net/array_values)($data));
Но это самый максимум. Все, что сверх, уже, на мой взгляд, излишество.
test wrote:
Можно, конечно, в данном случае вначале до запроса написать оператор
$_POST['Variant']='%'.$_POST['Variant'].'%';
Вот именно так и надо писать этот оператор.
Кроме того, у MySQL есть функция CONCAT, а в стандарте SQL - оператор || для конкатенации. Вставка placeholder-ов, не обрамленных апострофами или бэктиками, в любом случае - плохая идея. Если не чуствуете, почему, попробуйте просто поверить на слово и больше так не делать - с опытом поймете.
Back to top
View user's profile Send private message Send e-mail
test
Заглянувший



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


PostPosted: Thu Jun 22, 2006 1:36 pm (спустя 17 минут; написано за 11 минут 14 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
А в SELECT Вы должны четко представлять, какое именно условие в запросе, а не полагаться на список полей, пришедших извне. А то Вам там такое заселектят, мало не покажется...
Так вот проверять список полей и динамически строить sql-шаблон намного удобнее с именованными плэйсхолдерами. А так придется строить и шаблон, и массив.

А насчет "заселектят" - так благодаря экранированию ВНУТРИ плейсхолдеров все равно будет только список полей. Ну получат они в ответе "нет такого поля" в WHERE - это их личное дело. Я ведь им и так отдаю * - все поля, проверка полномочий в другом месте идет, ограниченным фиксированный запрос показывается, а полномочным надо всё знать.
Дмитрий Котеров wrote:
Вот именно так и надо писать этот оператор.
Кроме того, у MySQL есть функция CONCAT, а в стандарте SQL - оператор || для конкатенации. Вставка placeholder-ов, не обрамленных апострофами или бэктиками, в любом случае - плохая идея. Если не чуствуете, почему, попробуйте просто поверить на слово и больше так не делать - с опытом поймете.
Буду ждать понимания... :-)
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jun 22, 2006 2:18 pm (спустя 41 минуту; написано за 3 минуты 32 секунды)
   Post subject:
Reply with quote

test wrote:
Так вот проверять список полей и динамически строить sql-шаблон намного удобнее с именованными плэйсхолдерами.
Если есть {}-блоки (читайте топик выше) - то ничего подобного.

Пример большого динамического запроса:
Code (php): скопировать код в буфер обмена
        list ($skeleton, $page_nav['total']) = $tableTree->getSkeletonToShow(
            $parent_id, "
                  { INNER JOIN ?_fn_task2tag t2t ON t2t.TASK_ID=##.ID AND t2t.TAG_ID IN(?a) }
                    LEFT JOIN ?_fn_user u ON u.UID = ##.TO_UID
                WHERE
                    (
                        1
                      { AND (##.CREATOR_UID=? OR ##.TO_UID=?) }
                      { AND ##.CSTATUS IN(?a)  }   { AND ##.CSTATUS NOT IN(?a)  }
                      { AND ##.PRIORITY IN(?a) }   { AND ##.PRIORITY NOT IN(?a) }
                      { AND ##.TO_UID IN(?a) }
                      { AND ? AND ##.DEADLINE }
                      { AND ##.DEADLINE > ? }
                      { AND ##.DEADLINE < ? }
                      { AND ##.MODIFIED > UNIX_TIMESTAMP(?) }
                      { AND ##.MODIFIED < UNIX_TIMESTAMP(?)+24*60*60 }
                      { AND u.COMPANY_ID <=> ?n }
                      { AND ? AND "
. sqlFulltextClause(array (www.php.net/array)('##.CAPTION'), $keywords) . " }
                    )
                ORDER BY
                    $order
                    ##.IS_GROUP DESC,
                    ##.CSTATUS,
                    IF(NOT ##.IS_GROUP AND ##.DEADLINE=0, 1, 0),
                    IF(##.IS_GROUP, 0, ##.DEADLINE), 
                    IF(##.IS_GROUP, -1, ##.PRIORITY+0), -- PRIORITY has ASC order: HIGHEST ... LOWEST
                    ##.CAPTION ASC,
                    ##.PROJECT_ID,
                    ##.ID ASC
              { LIMIT ?d, ?d }
            "
,
            @$filter['tags'],
            DBSIMPLE_SKIP, $nsUser->UserId(),
            $listStatus['yes'], $listStatus['no'],
            $listPrior['yes'], $listPrior['no'],
            @$filter['users'],
            (@$filter['from'] || @$filter['till']? 1 : DBSIMPLE_SKIP),
            (@$filter['from']? $filter['from'] : DBSIMPLE_SKIP),
            (@$filter['till']? $filter['till'] : DBSIMPLE_SKIP),
            (@$filter['from_ch']? $filter['from_ch'] : DBSIMPLE_SKIP),
            (@$filter['till_ch']? $filter['till_ch'] : DBSIMPLE_SKIP),
            DBSIMPLE_SKIP,
            ($keywords? 1 : DBSIMPLE_SKIP),
            intval (www.php.net/intval)(@$_GET['p']), ($spread == "flat"? $page_nav['per_page']=GetParam('page_size', 'INTVAL') : DBSIMPLE_SKIP)
        );
В 99% случаев {}-блоки позволяют очень сильно увеличить читабельность. В частности, у именованных placeholder-ов остается только одно применение: чтобы не перепутать порядок следования параметров. Но двукратное дублирование идентифиакторов (даже чаще всего четырехкратное: имя поля в таблице, имя placeholder-а, имя параметра в array(), имя параметра в $_POST или где-нибудь еще - чаще всего все это совпадает с точностью до буквы) сводит пользу от них на нет.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Thu Jun 22, 2006 4:18 pm (спустя 1 час 59 минут; написано за 23 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров
Какова функциональность плэйсхолдера ##?
Back to top
View user's profile Send private message
test
Заглянувший



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


PostPosted: Thu Jun 22, 2006 5:48 pm (спустя 1 час 30 минут; написано за 3 минуты 37 секунд)
   Post subject:
Reply with quote

Иван Шумков wrote:
Какова функциональность плэйсхолдера ##?
Это не плейсхолдер, это что-то связанное с шаблонами (скелетонами) - перед исполнением очевидно заменяется именем таблицы. Поищите в Гугле "skeleton PHP".
Дмитрий Котеров wrote:
 В частности, у именованных placeholder-ов остается только одно применение: чтобы не перепутать порядок следования параметров.
В частности, в вашем примере! :-) Очень знаете ли легко искать вопросики и фигурные скобки и соотносить их со списком параметров... на мой взгляд без распечатки и проставления карандашиком цифр (порядковых номеров) не обойдешься. :-(
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jun 22, 2006 11:13 pm (спустя 5 часов 24 минуты; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

test wrote:
Это не плейсхолдер, это что-то связанное с шаблонами (скелетонами) - перед исполнением очевидно заменяется именем таблицы.
Угадали. К DbSimple отношение это не имеет.
test wrote:
Поищите в Гугле "skeleton PHP"
Хе-хе, это бесполезно. Просто так называется функция и переменная в конкретном участке кода, никаких концепций. :-)
test wrote:
Очень знаете ли легко искать вопросики и фигурные скобки и соотносить их со списком параметров...
Как ни странно, достаточно легко. И это лучше, чем все же 4 раза дублировать идентификаторы.
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Tue Jul 04, 2006 10:16 am (спустя 11 дней 11 часов 3 минуты; написано за 20 секунд)
   Post subject:
Reply with quote

А планируется ли поддержка SQLite ?
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Jul 04, 2006 10:19 am (спустя 2 минуты; написано за 23 секунды)
   Post subject:
Reply with quote

Я думаю, будет просто поддержка PDO (ru.php.net/pdo), а уж через нее - все остальное.
Back to top
View user's profile Send private message Send e-mail
ZuXuL
Заглянувший



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

Location: Bологда

PostPosted: Wed Jul 12, 2006 2:21 pm (спустя 8 дней 4 часа 2 минуты; написано за 3 минуты 29 секунд)
   Post subject:
Reply with quote

В статье сказано, что null значения заменяются на NULL баз данных, и (!)
Quote:
Это же верно и для всех остальных типов placeholder-ов
.
Вот косяк:
Code (php): скопировать код в буфер обмена
<?php
/*
CREATE TABLE `TEST` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`field0` VARCHAR( 255 ) ,
`field1` VARCHAR( 255 ) ,
PRIMARY KEY ( `id` )
)
*/

require_once('lib/php/config.php');
require_once('connect.php');

$arr = array (www.php.net/array)();
$arr['field1'] = 'AAA';
$arr['field0'] = null;

$DB->query('UPDATE TEST SET ?a WHERE id=?d',$arr,1);

echo (www.php.net/echo) 'test';
?>
Из логов:
message:
  UPDATE TEST SET `field1`='AAA', `field0`='' WHERE id=1
    -- 3 ms; returned '1'

PHP Version 5.0.2, MySQL 3.23.53
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Jul 12, 2006 8:12 pm (спустя 5 часов 50 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Поправил, спасибо.
Но, вообще-то, версия 1.x уже практически не поддерживается, а 2.x у меня никак не доходят руки выложить по-нормальному и сделать поддержку IBase и PgSQL.
Back to top
View user's profile Send private message Send e-mail
Валенок
Участник форума



Joined: 06 Apr 2006
Posts: 520
Карма: -3
   поощрить/наказать


PostPosted: Wed Jul 12, 2006 11:53 pm (спустя 3 часа 41 минуту; написано за 19 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
поддержка txtSQL?
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



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

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

PostPosted: Thu Jul 13, 2006 7:34 am (спустя 7 часов 41 минуту; написано за 30 секунд)
   Post subject:
Reply with quote

Валенок wrote:
txtSQL
Вы своими сообщениями порой, мягко сказать, удивляете...
Back to top
View user's profile Send private message
Валенок
Участник форума



Joined: 06 Apr 2006
Posts: 520
Карма: -3
   поощрить/наказать


PostPosted: Thu Jul 13, 2006 10:09 am (спустя 2 часа 34 минуты; написано за 42 секунды)
   Post subject:
Reply with quote

Миша Спларов
а что?
вам так не нравится txtSQL?
или он уже поддерживается? (вроде нет, я смотрел...)
Back to top
View user's profile Send private message
Дмитрий Агафонов
Guest





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


PostPosted: Mon Jul 17, 2006 5:57 pm (спустя 4 дня 7 часов 47 минут; написано за 1 минуту 3 секунды)
   Post subject: А зачем тогда DBSimple?
Reply with quote

Дмитрий Котеров wrote:
Я думаю, будет просто поддержка PDO (ru.php.net/pdo), а уж через нее - все остальное.
Хм, а в нем уже и так есть плейсхолдеры...
Back to top
Дмитрий Агафонов
Guest





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


PostPosted: Mon Jul 17, 2006 6:15 pm (спустя 18 минут; написано за 3 минуты 36 секунд)
   Post subject: DBSimple2 и немного про лес
Reply with quote

Дмитрий Котеров wrote:
Да увидеть-то можно прямо сейчас (прикладываю), только вот пока что есть версия исключительно для MySQL. До релизного варианта доделать пока руки не дошли. По-хорошему надо писать систему автоматических тестов (phpUnit?), но нужно вначале со всем этим разобраться...
Не было ли обновлений в MySQL или Generic частях?
Может выложите, если были...

И еще.
Можно ли добавить в фунцию постоения Леса элемент parentNode, а то искать трудновато в однонаправленном лесу...
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Mon Jul 17, 2006 10:35 pm (спустя 4 часа 20 минут; написано за 2 минуты 44 секунды)
   Post subject:
Reply with quote

Дмитрий Агафонов wrote:
Хм, а в нем уже и так есть плейсхолдеры...
Они там крайне неудобные - слишком код громоздкий. Кроме того, там нет списковых placeholder-ов, а также условных блоков (появится в DbSimple2, как только выложу). Короче, еще раз: "simple" - не в смысле "мало кода в библиотеке", а в смысле "исключительно простой и удобный интерфейс".
Дмитрий Агафонов wrote:
Не было ли обновлений в MySQL или Generic частях?
Были. Сейчас выложу.
Дмитрий Агафонов wrote:
Можно ли добавить в фунцию постоения Леса элемент parentNode
Это не требуется:
Code (SQL): скопировать код в буфер обмена
SELECT PID AS PARENT_KEY, ID AS ARRAY_KEY, PID AS parentNode FROM ...



DbSimple.zip
 Description:

Download
 Filename:  DbSimple.zip
 Filesize:  10.67 KB
 Downloaded:  616 Time(s)

Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Tue Jul 18, 2006 1:12 pm (спустя 14 часов 37 минут; написано за 8 минут 13 секунд)
   Post subject:
Reply with quote

Дмитрий Агафонов wrote:
Не было ли обновлений в MySQL или Generic частях?
Были. Сейчас выложу.

Большое спасибо!
Дмитрий Агафонов wrote:
Можно ли добавить в фунцию постоения Леса элемент parentNode
Это не требуется:
Code (SQL): скопировать код в буфер обмена
SELECT PID AS PARENT_KEY, ID AS ARRAY_KEY, PID AS parentNode FROM ...
[/quote]

Я имел в виду именно нод как элемент, а не его ID (т.е. нечто типа $xxx['parentNode']=&$parent;)
Хотя в данном случае мне понятно, что хорошего тут мало, ибо нельзя будет вывести ничего из-за рекурсии...

Но задача вообщем проста - найти парента - а приходится весь лес парсить и искать этот PID в рекурсивной функции.
Или я не совсем освоил методы программирования PHP...
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Jul 18, 2006 3:08 pm (спустя 1 час 55 минут; написано за 37 секунд)
   Post subject:
Reply with quote

Гость wrote:
$xxx['parentNode']=&$parent;
Мне это сильно не нравится: ссылки - зло.

Какую именно задачу Вы решаете, что нужно искать PID?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Wed Jul 19, 2006 12:51 pm (спустя 21 час 43 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Отложенное копирование переменных в PHP»,
расположенную в форуме Разное :: PHP (19 Июля 2006, 12:51).
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



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

Location: Киев

PostPosted: Thu Jul 20, 2006 11:31 am (спустя 22 часа 39 минут; написано за 6 минут 20 секунд)
   Post subject:
Reply with quote

Раз уж добавляем (не так ли?) возможность передавать массив идентификаторному плейсхолдеру ?#, то может еще добавить такие возможности:
Code (php): скопировать код в буфер обмена
$DB->query('SELECT id FROM tb WHERE id IN (?d)', array (www.php.net/array)(1, 'a_key'=>2, '3'));
//

$DB->query('SELECT id FROM tb WHERE textfield IN (?)', array (www.php.net/array)(1, 'a_key'=>'', '3'));
//
 
соответственно:
Code (SQL): скопировать код в буфер обмена
SELECT id FROM tb WHERE id IN (1, 2, 3)
SELECT id FROM tb WHERE textfield IN ('1', '', '3')
Немного дублирует функциональность плейсхолдера ?a, зато можно скармливать массивы с разными ключами и не экранировать (приводить тип принудительно) без необходимости.
К тому же, если передавать массив через ?d, то размер SQL-запроса уменьшится за счет отсутствия кавычек вокруг цифр.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jul 20, 2006 1:55 pm (спустя 2 часа 23 минуты; написано за 2 минуты 10 секунд)
   Post subject:
Reply with quote

Нельзя для ? и ?d делать неявную поддержку массивов. Иначе возможны грязные хаки, когда в URL пишут: abc.php?id[]=1&id[]=2&id[]=3
а итоговый запрос, который выглядит как SELECT * FROM t WHERE id=?, превращается в

SELECT * FROM t WHERE id=1,2,3

и вылезает синтаксическая ошибка.

Вот для ?# - можно, т.к. передать в ключе массив через URL не удастся ну никак.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Fri Jul 21, 2006 9:54 pm (спустя 1 день 7 часов 58 минут; написано за 6 минут 9 секунд)
   Post subject:
Reply with quote

Дмитрий, а что вы думаете на счет возможности передавать параметры для всех плейсхолдеров в виде одного массива:
Code (php): скопировать код в буфер обмена
$db->select('SELECT FROM table WHERE field = ?', array (www.php.net/array)($field));
...
$db->select('SELECT FROM table WHERE param1 = ? OR param2 =?', array (www.php.net/array)($param1, $param2));
...
$params = array (www.php.net/array)('param1'=>1, 'param2'=>2);
$db->query('INSERT INTO table SET ?a', array (www.php.net/array)($params));
Это бы позволило передавать в запрос любое количество переменных в виде одного единственного массива, что, как мне кажется, облегчило бы написание кода.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Mon Jul 24, 2006 12:10 pm (спустя 2 дня 14 часов 16 минут; написано за 52 секунды)
   Post subject:
Reply with quote

Путник
Облегчило? Вы шутите? Писать каждый раз дополнительное array() не облегчает написание, а скорее наоборот.
Back to top
View user's profile Send private message
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Tue Jul 25, 2006 6:29 am (спустя 18 часов 19 минут; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Ну каждый раз писать array() вовсе не обязательно. Это так, для наглядности. Можно написать так:
Code (php): скопировать код в буфер обмена
$db->query($sql, $params);
Где $params - массив, содержащий все переменные запроса.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



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

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

PostPosted: Tue Jul 25, 2006 7:55 am (спустя 1 час 26 минут; написано за 1 минуту 49 секунд)
   Post subject:
Reply with quote

Путник
Ну в таком случае надо писать:
Code (php): скопировать код в буфер обмена
$params = array (www.php.net/array)('param1', 'param2');
$query = 'INSERT ...';
$db->query($sql, $params);
Вместо:
Code (php): скопировать код в буфер обмена
$db->query('INSERT ...', 'param1', 'param2');
Тоже удобней?
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



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

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

PostPosted: Tue Jul 25, 2006 9:16 am (спустя 1 час 20 минут; написано за 1 минуту 5 секунд)
   Post subject:
Reply with quote

В случаем если значение плэйсхолдера (буть это просто скалярный плейсхолдер или один из элементов масива) равен NULL то он тоже эскейпится?
Back to top
View user's profile Send private message
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 Previous  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  Next
Page 5 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