Форум 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: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Feb 17, 2006 12:23 am (написано за 48 секунд)
   Post subject:
Reply with quote

Потому что в PEAR есть пакет DB, но туда я пихать ничего не могу, ибо там внутри его собственные кишки. Ну в Database - слишком длинно и малоинформативно. Раньше называлось DbTiny, но потом переименовал в DbSimple.
Back to top
View user's profile Send private message Send e-mail
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Sat Feb 25, 2006 5:20 pm (спустя 8 дней 16 часов 57 минут; написано за 2 минуты 34 секунды)
   Post subject:
Reply with quote

Нигде не нашел, как использовать именованные плейсхолдеры, то есть что-то типа этого:
Code (php): скопировать код в буфер обмена
$sql  = sql_placeholder(
  'SELECT * FROM t WHERE a=?vA b=?vB',
  array (www.php.net/array)(
    'vA' => "cat's house",
    'vB' => "dog's house",
  )
);
Есть ли подобная возможность в DBSimple?
Точно такое же выражение компилируется в следующее:
'SELECT * FROM t WHERE a=ERROR_PLACEHOLDER_VALUE_NOT_SCALARvA b=?vB'
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



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

Location: 007 495

PostPosted: Sat Feb 25, 2006 8:20 pm (спустя 2 часа 59 минут; написано за 15 секунд)
   Post subject:
Reply with quote

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



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Sun Feb 26, 2006 12:10 am (спустя 3 часа 49 минут; написано за 7 минут 24 секунды)
   Post subject:
Reply with quote

Юpий Насрeтдинов wrote:
y0prst wrote:
Есть ли подобная возможность в DBSimple?
Видимо, нет. А Вы часто используете эти самые именованные плейсхолдеры?
Вот сегодня как раз пытался использовать в поиске объявлений.
У пользователя есть возможность выбрать множество независимых параметров в фильтре. Если же в каком-то поле он не ввел значение, или выбрал "все", то, вероятно, из соображений быстродействия соответствующий кусок в условии WHERE в SQL-запросе лучше удалить.
То есть из следующего "запроса"
Code (SQL): скопировать код в буфер обмена
SELECT ... WHERE fPrice>=0 AND fPrice<=1000000 AND idRegion IN (1,2,3,4,5,6,7,8) AND fHeight < 10
оставить только
Code (SQL): скопировать код в буфер обмена
SELECT ... WHERE fHeight < 10
С помощью именованных плейсхолдеров такую оптимизацию можно было бы реализовать так:
Code (php): скопировать код в буфер обмена
...

if (!empty (www.php.net/empty)($fPrice))
{
        $query .= " and fPrice >= ?fPrice ";
        $params["fPrice"] = $fPrice;
}
...

$DB->select($query, $params);
Хотя, может быть, эту задачу можно решить другим способом?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Sun Feb 26, 2006 8:40 am (спустя 8 часов 29 минут; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
if (!empty (www.php.net/empty)($fPrice))
{
        $query .= " and fPrice >= ? ";
        $params[] = $fPrice;
}
...
array_unshift (www.php.net/array_unshift)($params, $query);
$result = call_user_func_array (www.php.net/call_user_func_array)(array (www.php.net/array)(&$DB, 'select'), $params);
Back to top
View user's profile Send private message Send e-mail
Efreeti
Guest





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


PostPosted: Sun Feb 26, 2006 3:18 pm (спустя 6 часов 37 минут; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Не поддерживаеться порт в dsn (т.е. он разбираеться, но в mysql_connect не попадает.

Надо заменить в конструкторе MySQL
Code (php): скопировать код в буфер обмена
$ok = $this->link = @mysql_connect (www.php.net/mysql_connect)(
   $p['hostspec'],
   $p['username'],
   $p['password']
);
на
Code (php): скопировать код в буфер обмена
$ok = $this->link = @mysql_connect (www.php.net/mysql_connect)(
   $p['port']?$p['hostspec'].':'.$p['port']:$p['hostspec'],
   $p['username'],
   $p['password']
);
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Mon Feb 27, 2006 11:34 am (спустя 20 часов 16 минут; написано за 44 секунды)
   Post subject:
Reply with quote

version 1.34
Учтено замечание насчет port в MySQL.
Примечательно, что я 4 дня назад это изменение независимо сделал, но не выкладывал просто.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Fri Mar 03, 2006 12:10 am (спустя 3 дня 12 часов 35 минут; написано за 2 минуты 44 секунды)
   Post subject:
Reply with quote

version 1.35
- новый тип placeholder-а - ссылочный (?n), см. статью
- выправлены placeholder-ы ?f (для всех СУБД разделитель - только точка) и ?# (для MySQL backtick удваивается)
- в статью добавлено подробное описание placeholder-ов: dklab.ru/lib/DbSimple/
- добавлена возможность вводить классы-исключения и функции-исключения при поиске контекста генерации SQL-запроса (см. addIgnoreInTrace())
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Fri Mar 03, 2006 12:12 am (спустя 2 минуты; написано за 20 секунд)
   Post subject:
Reply with quote

Вот тебе и симпл :).
Back to top
Guest






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


PostPosted: Fri Mar 03, 2006 3:38 am (спустя 3 часа 26 минут; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

Ссылочный placeholder помойму совершенно непрактичная штука. Я не пойму как parent_id равный 0 может "нарушить ссылочную целостность"? Нет же строки с id = 0, так как автоинкримент начинается с 1.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Fri Mar 03, 2006 10:22 am (спустя 6 часов 43 минуты; написано за 2 минуты 39 секунд)
   Post subject:
Reply with quote

Никто не принуждает использовать весь этот набор placeholder-ов. Они просто покрывают все возможные варианты, даже если эти варианты минимальны по частоте использования.
Гость wrote:
Я не пойму как parent_id равный 0 может "нарушить ссылочную целостность"?
Читайте про constraints в базах данных.

Самый простой пример: скрипт, который использует myisam и вставляет 0 в parent_id, не будет работать, если его перенести на innodb - будет ошибка при вставке записи ("неверный внешний ключ"), что совершенно справедливо, кстати.
Back to top
View user's profile Send private message Send e-mail
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Sat Mar 04, 2006 7:18 pm (спустя 1 день 8 часов 56 минут; написано за 33 секунды)
   Post subject:
Reply with quote

А что мешает добавить счетчик запросов в библиотеку?
Время-то ведь считается.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Sun Mar 05, 2006 1:44 am (спустя 6 часов 25 минут; написано за 4 минуты 4 секунды)
   Post subject:
Reply with quote

y0prst wrote:
А что мешает добавить счетчик запросов в библиотеку?
А так ли уж это нужно? Общее время я, кстати, считаю только из-за одного: чтобы можно было его получить, не назначая вообще обработчика журнала (для скорости), и вывести где-нибудь на странице. Нехорошее это построение, ох нехорошее... не задача слоя абстракции библиотеки.

Еще чуть-чуть дописал статью. На этот раз добавил про placeholder ?_, а также - описание всех основных методов DbSimple (select и т.д.).
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Tue Mar 07, 2006 9:49 am (спустя 2 дня 8 часов 4 минуты; написано за 2 минуты 23 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Никто не принуждает использовать весь этот набор placeholder-ов. Они просто покрывают все возможные варианты, даже если эти варианты минимальны по частоте использования.
Насколько я помню основоной принцип вашей библиотеки - simple. Тоесть что-то вроде: "мой простой ответ сложным PEAR::DB и ADODB". И эта идея мне очень понравилась. Но зачем же добавлять в библиотеку то, с чем вы сами боретесь, с мало юзабельными "фичами".
Back to top
Guest






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


PostPosted: Tue Mar 07, 2006 1:00 pm (спустя 3 часа 11 минут; написано за 23 секунды)
   Post subject:
Reply with quote

В статье очепятка

Листинг 13 скопировать код в буфер обмена

$DB->select('SELECT #? FROM tbl', 'date');
// MySQL: SELECT `date` FROM tbl
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Mar 07, 2006 9:13 pm (спустя 8 часов 12 минут; написано за 24 секунды)
   Post subject:
Reply with quote

Гость wrote:
Но зачем же добавлять в библиотеку то, с чем вы сами боретесь, с мало юзабельными "фичами".
А потому что выбора нет: все эти placeholder-ы, хоть и редко, но бывают нужны.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Wed Mar 08, 2006 12:47 am (спустя 3 часа 34 минуты; написано за 23 секунды)
   Post subject:
Reply with quote

Еще дописал чуть-чуть статью (с раздела "Оптимизация prepare+execute").
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Fri Mar 10, 2006 4:08 pm (спустя 2 дня 15 часов 20 минут; написано за 53 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
А потому что выбора нет: все эти placeholder-ы, хоть и редко, но бывают нужны.
Возможно, таким же принципом руководствовались разработчики ADODB и PEAR::DB.
Back to top
Путник
Guest





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


PostPosted: Fri Mar 17, 2006 2:12 am (спустя 6 дней 10 часов 4 минуты; написано за 6 минут 23 секунды)
   Post subject:
Reply with quote

Дмитрий, было бы здорово, если бы ваша библиотека поддерживала placeholder-ы, которые бы позволяли динамически измененять запрос, примерно так, как в библиотеке SafeSql (www.phpinsider.com/php/code/SafeSQL/). Т.е., если placeholder-у не присваивается значение, соответствующий участок SQL-запроса игнорируется.
Например, если placeholder-у присваивается значение, запрос вида
Code (SQL): скопировать код в буфер обмена
SELECT * FROM TABLE [WHERE id = ?]
выглядел бы:
Code (SQL): скопировать код в буфер обмена
SELECT * FROM TABLE WHERE id = 1
, если нет - так:
Code (SQL): скопировать код в буфер обмена
SELECT * FROM TABLE
.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Fri Mar 17, 2006 12:26 pm (спустя 10 часов 13 минут; написано за 3 минуты 4 секунды)
   Post subject:
Reply with quote

Да, это весьма интересная идея. Только не
Путник wrote:
если placeholder-у присваивается значение
а "если placeholder-у присваивается null.

Возникает только вопрос: лучше null или все же false. Могут ведь быть ситуации, когда null преобразуется в NULL базы, а вот чтобы false передали в placeholder - это что-то странное. Например:

SELECT * FROM tbl WHERE 1=1 [ AND n<=>?r ]

Здесь <=> - это оператор "NULL-нечувствительной эквивалентности", который поддерживается в MySQL. Здесь null на месте placeholder-а имеет вполне законный смысл.
Back to top
View user's profile Send private message Send e-mail
ysv
Заглянувший



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


PostPosted: Fri Mar 17, 2006 3:49 pm (спустя 3 часа 23 минуты; написано за 1 минуту 31 секунду)
   Post subject:
Reply with quote

А можно пример на "Выборка связанного дерева" с описанием таблиц и PHP-выводом дерева?
Back to top
View user's profile Send private message
Путник
Guest





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


PostPosted: Fri Mar 17, 2006 8:11 pm (спустя 4 часа 21 минуту; написано за 5 минут 17 секунд)
   Post subject:
Reply with quote

Да, пожалуй, Дмитрий, вы правы, может потребоваться, чтобы placeholder и содержал значение NULL. Но тогда возникает другая проблема - необходимость предварительной проверки значения переменной, которая присваивается placeholder-у, и замена этого значения на FALSE, что тоже несколько коряво.

А может быть поступить также, как это реализовано в библиотеке SafeSql - создать аналоги для уже существующих placeholder-ов, которые бы, принимая значение NULL, исключали соответствующую часть SQL-запроса, а стандартные placeholder-ы могли бы принимать NULL в качестве значения.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Sat Mar 18, 2006 2:46 am (спустя 6 часов 35 минут; написано за 8 минут 17 секунд)
   Post subject:
Reply with quote

Путник wrote:
А может быть поступить также, как это реализовано в библиотеке SafeSql - создать аналоги для уже существующих placeholder-ов, которые бы, принимая значение NULL, исключали соответствующую часть SQL-запроса, а стандартные placeholder-ы могли бы принимать NULL в качестве значения.
Ну, во-первых, таких "соответствующих placeholder-ов" весьма много (см. dklab.ru/lib/DbSimple/#cont7). Делать для них всех замену не очень бы хотелось. К тому же, мне кажется, это бы все равно не решило проблему: в пределах необязательной части SQL-запроса может потребоваться вставить NULL.
Путник wrote:
Но тогда возникает другая проблема - необходимость предварительной проверки значения переменной, которая присваивается placeholder-у, и замена этого значения на FALSE, что тоже несколько коряво.
А чем принципиальным отличается false от null? Ведь в программе эти null-ы тоже сами собой ниоткуда не возьмутся - они могут быть сгенерированы только динамически, каким-то куском. Соответственно, написать в этом куске null или false или еще что-нибудь - разница не очень большая.

Плохо только то, что false может являться результатом работы той или иной встроенной функции, и его очень легко спутать с нулем (echo false и выводит 0). В то время как null с нулем не спутаешь (echo null выводит пустую строку).

Можно даже пойти дальше и ввести константу SKIP. Присвоить ей какое-нибудь длинное уникальное значение (типа md5(microtime())), вероятность встречи которого в скрипте исчезающе мала. Впрочем, что я такое говорю! Есть же еще одна константа в PHP, ru.php.net/manual/ru/function.is-nan.php - NAN.

<?php
define('SKIP', acos(1.01));
var_dump(SKIP);
echo is_nan(SKIP);
?>

Она-то уж точно ну никак не может в базу попасть, и из базы получиться - тоже. Соответственно, вот ее-то и можно использовать в качестве индикатора пропуска. Думаю, можно считать задачу решенной.
Back to top
View user's profile Send private message Send e-mail
Путник
Guest





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


PostPosted: Sun Mar 19, 2006 1:59 pm (спустя 1 день 11 часов 13 минут; написано за 2 минуты 34 секунды)
   Post subject:
Reply with quote

Чем хорош NULL - не пришла переменная из POST или GET запроса - вот и получается значение NULL, и соответствующий фрагмент SQL запроса игнорируется. А с дополнительной константой придется писать дополнительный код проверки. Как найти компромисс между простотой и универсальностью?
Back to top
WingedFox
Профессионал



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

Location: Питер

PostPosted: Mon Mar 20, 2006 2:32 am (спустя 12 часов 32 минуты; написано за 4 минуты 23 секунды)
   Post subject:
Reply with quote

Вообще... ведь NULL в запросе может присутствовать только в сочетании с IS[ NOT].
Так что достаточно добавить проверку...
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon Mar 20, 2006 11:47 am (спустя 9 часов 15 минут; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

Путник wrote:
Чем хорош NULL - не пришла переменная из POST или GET запроса - вот и получается значение NULL
Не NULL получается, а notice+NULL. Конечно, можно поставить и собаку, но неудобно это.
WingedFox wrote:
NULL в запросе может присутствовать только в сочетании с IS[ NOT]
Неправда. Во-первых, существуют UPDATE-запросы. Во-вторых, в MySQL есть оператор <=> (сравнение без учета специального поведения NULL).

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



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


PostPosted: Wed Mar 22, 2006 12:02 am (спустя 1 день 12 часов 15 минут; написано за 9 минут 14 секунд)
   Post subject:
Reply with quote

Грядет DbSimple 2.0. Что будет:
  1. Placeholder-ы обрабатываются только вне строковых констант и комментариев.
  2. Еще больше упрощен интерфейс (оказалось, что схему "1 коннект - много транзакций" поддерживает только ibase, а все остальные базы работают по схеме "1 коннект - 1 транзакция"). Теперь будет только объект DB, объекта "транзакция" - не будет.
  3. Файлов будет на 1 меньше.
  4. Поддержка "необязательных" SQL-блоков (в фигурных скобках {}, а не в квадратных - а то квадратные в MSSQL используются).
  5. Счетчик запросов в статистике.
  6. Возможность указывать атрибуты у запросов (примеры атрибутов: "результат кэшируется" (на будущее), "объектные BLOB-поля" и т.д.). С синтаксисом еще не определился: либо так:
    Code (php): скопировать код в буфер обмена
    $DB->query('
      -- BLOB_OBJ: true
      SELECT * FROM table_with_blobs
    '
    );
    либо так:
    Code (php): скопировать код в буфер обмена
    $DB->query(array (www.php.net/array)(DBSIMPLE_ATTR, 'BLOB_OBJ'), '
      SELECT * FROM table_with_blobs
    '
    );
    Второе кажется несколько более уродливым, но зато в перспективе можно сделать через такой синтаксис то, что раньше делалось в selectPage() - в PHP поддерживается синтаксис array(&$total).
  7. DSN парсится через parse_url().
Самое сложное - все это протестировать как следует.
Back to top
View user's profile Send private message Send e-mail
y0prst
Участник форума



Joined: 20 May 2004
Posts: 101
Карма: 9
   поощрить/наказать

Location: Вологда

PostPosted: Wed Mar 22, 2006 8:40 am (спустя 8 часов 37 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

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



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


PostPosted: Wed Mar 22, 2006 11:51 am (спустя 3 часа 10 минут; написано за 1 минуту 31 секунду)
   Post subject:
Reply with quote

Ждем с нетерпением :-)
y0prst wrote:
Кстати, будет ли поддержка вложенности таких блоков?
А не будет ли это перебором ;-) ?
Back to top
View user's profile Send private message Send e-mail
ysv
Заглянувший



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


PostPosted: Wed Mar 22, 2006 11:58 am (спустя 7 минут)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Грядет DbSimple 2.0.
А можно предложение:
Добавить добавление префикса для таблиц (т.е. ко всем таблицам доб. префикс стандартный, это как в CMS(там можно при инсталяции указать префикс для всех таблиц)
Для упрощения реализации можно для таблиц завести правило - имя таблицы начинается с _
SELECT * FROM _table1, _table2

Таким образом мы в добавок узнаем какие таблицы будут задествованы в запросе...

Если запрос UPDATE то можно помечать какие таблицы менялись... Подготовка к кэшированию...
При SELECT проверить менялись ли таблицы участвующие в запросе, если нет, то считать массив сохраненный от предыдущего запроса...

Запрос сохранять в виде файлов типа номер запроса (добавить в текст номер запроса - константы) и значения плейсхолдеров...
NOzapr_PlaceHold1_PlaceHold2_PlaceHold3.cash
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Mar 22, 2006 12:23 pm (спустя 25 минут; написано за 1 минуту 12 секунд)
   Post subject:
Reply with quote

y0prst wrote:
Кстати, будет ли поддержка вложенности таких блоков?
Да, и это уже реализовано. К счастью, в preg-функциях есть (?R) для рекурсивного поиска.
ysv wrote:
Добавить добавление префикса для таблиц
Это и в той версии, что на сайте, кажется, есть. Placeholder ?_:

SELECT * FROM ?_table1, ?_table2
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Mar 22, 2006 1:09 pm (спустя 45 минут; написано за 5 минут 15 секунд)
   Post subject:
Reply with quote

ysv
префиксы добавляются - читайте сюда dklab.ru/lib/DbSimple/#list12

Дмитрий Котеров
вместо этого dklab.ru/lib/DbSimple/#list19

может быть лучше добавить уже ставшие стандартом
опциональный параметр $fetchMode для DBSimple->select()
и метод DBSimple->fetchMode()

и соответствующие константы
DBSIMPLE_FETCH_ARRAY
DBSIMPLE_FETCH_ASSOC

а то ну очень коряво выглядит конструкция запроса в примере 19
Back to top
View user's profile Send private message
as0ft
Заглянувший



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


PostPosted: Wed Mar 22, 2006 1:38 pm (спустя 29 минут; написано за 55 секунд)
   Post subject: DB
Reply with quote

Извиняюсь конечно, но помогите разобраться:
Вот код: Как он должен быть оформлен если использовать DBSimple?
$sql = $db->query("SELECT img_path,area_template,active,user_lang,admin_lang,cursymb FROM " . PREFIX . "_areas WHERE area_id='1'");
$row = $sql->fetchrow();
$sql->close();
$THEME = $row->area_template;
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Mar 22, 2006 1:41 pm (спустя 2 минуты; написано за 56 секунд)
   Post subject:
Reply with quote

as0ft wrote:
Как он должен быть оформлен
А для начала свой код оформить в соотвествии с forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html Вам лень? Секундное дело!
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Mar 22, 2006 1:59 pm (спустя 17 минут; написано за 4 минуты 44 секунды)
   Post subject:
Reply with quote

Rumata wrote:
DBSIMPLE_FETCH_ARRAY
DBSIMPLE_FETCH_ASSOC
Да ни за что на свете этого в библиотеке не будет. Цифровые индексы сильно снижают читабельность кода. В крайнем случае, если кто-то хочет цифры, всегда можно сделать
Code (SQL): скопировать код в буфер обмена
SELECT a AS `0`, b AS `1` ...
Тем более я не понимаю, что там в примере 19 выглядит некрасиво. Там вроде все в порядке. Возможно, ты перепутал номер листинга?

Аналогично, не будет FETCH_OBJ. Как вообще можно создавать объект непонятно какого класса с непонятно какими свойствами? Для этого существуют ассоциативные массивы, а FETCH_OBJ впервые родился в чьем-то чрезвычайно эклектичном уме.
as0ft wrote:
$sql = $db->query("SELECT img_path,area_template,active,user_lang,admin_lang,cursymb FROM " . PREFIX . "_areas WHERE area_id='1'");
$row = $sql->fetchrow();
$sql->close();
$THEME = $row->area_template;
Примерно вот так:
Code (php): скопировать код в буфер обмена
$THEME = $DB->selectCell('SELECT area_template FROM ?_areas WHERE area_id=?', 1);
Или так:
Code (php): скопировать код в буфер обмена
$row = $DB->selectRow('SELECT img_path,area_template,active,user_lang,admin_lang,cursymb FROM ?_areas WHERE area_id=?', 1);
$THEME = $row['area_template'];
Могли бы и сами, кстати, догадаться, прочитав статью.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



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


PostPosted: Wed Mar 22, 2006 2:27 pm (спустя 28 минут; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

Дмитрий, еще раз хотелось бы задать вопрос о "хитром" способе подключения DbSimple. Не кажется ли вам лишним использовать дополнительный конфигурационный файл для определения include_path? Почему бы в PHP-скрипте просто не указать путь к DSN.php?
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Mar 22, 2006 2:35 pm (спустя 8 минут; написано за 3 минуты 46 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Дима, сравни, что лучше?
Code (php): скопировать код в буфер обмена
//
$rows = $DB->select('SELECT user_id AS ARRAY_KEY, * FROM ?_users');

//
$DB->fetchMode(DBSIMPLE_FETCH_ARRAY);
$rows = $DB->select('SELECT user_id, * FROM ?_users');

//
$rows = $DB->select('SELECT user_id, * FROM ?_users', DBSIMPLE_FETCH_ARRAY);
Дмитрий Котеров wrote:
Да ни за что на свете этого в библиотеке не будет
Дмитрий Котеров wrote:
Аналогично, не будет FETCH_OBJ
будь внимательнее я не говорю ни слова о FETCH_OBJ.

хотя тебе пользовать библиотеку по своему разумению
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Mar 22, 2006 4:07 pm (спустя 1 час 31 минуту; написано за 2 минуты 38 секунд)
   Post subject:
Reply with quote

Путник wrote:
еще раз хотелось бы задать вопрос о "хитром" способе подключения DbSimple
Это не "хитрый способ", и отношения к DbSimple он не имеет. Читайте pear.php.net/manual/en/standards.naming.php
Rumata wrote:
// мое предложение 1
$DB->fetchMode(DBSIMPLE_FETCH_ARRAY);
$rows = $DB->select('SELECT user_id, * FROM ?_users');

// мое предложение 2
$rows = $DB->select('SELECT user_id, * FROM ?_users', DBSIMPLE_FETCH_ARRAY);
По-моему, ужасно.
1. Что делать с PARENT_KEY?
2. Как определить, какое поле является ключевым? То, которое стоит первым?
3. В #2: как отличить DBSIMPLE_FETCH_ARRAY от значения, подставляемого на место placeholder-а?

Вариант #1 вообще не годится:
1. Лишняя функция в интерфейсе.
2. Надо будет либо делать fetchMode локальной в пределах единственной следующей операции, либо сохранять старое значение.

Не понимаю, чем не нравится AS ARRAY_KEY?
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Mar 22, 2006 4:56 pm (спустя 48 минут; написано за 6 минут 48 секунд)
   Post subject:
Reply with quote

DBSimple->fetchMode глобальна по отношению ко всем выполняемым запросам. если необходима локальность - использовать соответствующие константы в методе запроса
пример
Code (php): скопировать код в буфер обмена
// все запросы возвращают ассоц.массивы
$DB->fetchMode(DBSIMPLE_FETCH_ASSOC);

// здесь - результат ассоц.массив
$assoc = $DB->select('SELECT user_id, * FROM ?_users');

// здесь - результат список
$array = $DB->select('SELECT user_id, * FROM ?_users', DBSIMPLE_FETCH_ARRAY);
1. не понятно про PARENT_KEY
2. что значит ключевым? если требуется массив с ключами, то и берем массив с ключами, если нужен список, то и берем список. в настоящее время у тебя получается мешанина. не лучше чем результат
Code (php): скопировать код в буфер обмена
mysql_fetch_array (www.php.net/mysql_fetch_array)($sql_link, MYSQL_BOTH)
3. лучше было бы использовать массив значений

1. лучше лишний функционально понятный метод, чем - непонятное
Code (SQL): скопировать код в буфер обмена
SELECT user_id AS ARRAY_KEY AS number FROM users
2. сказал выше
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Mar 22, 2006 6:39 pm (спустя 1 час 43 минуты; написано за 3 минуты 20 секунд)
   Post subject:
Reply with quote

Rumata wrote:
не понятно про PARENT_KEY
Документация (статья) не помогает?
Rumata wrote:
в настоящее время у тебя получается мешанина
Где же мешанина? То, что помечено как ARRAY_KEY, из результата изымается и становится первым ключом двумерного массива. Если нет ARRAY_KEY - в качестве ключей идут 0, 1 и т.д. (обычный список). В качестве ключей для строк этого двумерного массива и в том, и в другом случае выступают имена полей (или то, что в AS указано). По-моему, очень логичное поведение. При чем тут mysql_fetch_array()?
Rumata wrote:
лучше было бы использовать массив значений
Синтаксис ненужно усложняется. В DbSimple рутина сведена к минимуму.
Rumata wrote:
лучше лишний функционально понятный метод, чем - непонятное
SELECT user_id AS ARRAY_KEY AS number FROM users
Кому непонятное? Тому, кто не читал инструкцию?
Back to top
View user's profile Send private message Send e-mail
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 3 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