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

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



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

Location: Киев

PostPosted: Tue Apr 03, 2007 5:22 pm (написано за 14 секунд)
   Post subject:
Reply with quote

Выборка одномерного/многомерного массива в зависимости от макроподстановок - возможно ли это?
К примеру, так:
Code (SQL): скопировать код в буфер обмена
    SELECT
        t.topic_id AS ARRAY_KEY
        ,t.topic_name
      { ,message_id AS ARRAY_KEY_1, message_subject, message_text }
    FROM ?_topics t
      { INNER JOIN ?_message m ON t.topic_id=m.topic_id }
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Tue Apr 03, 2007 6:10 pm (спустя 48 минут; написано за 2 минуты 51 секунду)
   Post subject:
Reply with quote

Возможно, почему нет.
Code (php): скопировать код в буфер обмена
$DB->select("
    SELECT
        t.topic_id AS ARRAY_KEY
        ,t.topic_name
      { ,message_id AS ARRAY_KEY_1, message_subject, message_text, ? AS dummy }
    FROM ?_topics t
      { INNER JOIN ?_message m ON t.topic_id=m.topic_id AND ? }
  "
,
  ($multi? 1 : DBSIMPLE_SKIP),
  ($multi? 1 : DBSIMPLE_SKIP)
);
Вообще, похоже, надо делать оператор {? ... }, который будет работать так: если вместо ? идет DBSIMPLE_SKIP, то блок пропускается, иначе - "{?" и "}" просто удаляются. А то надоело писать всякие "AND ?" и "? AS dummy"
Back to top
View user's profile Send private message Send e-mail
Журавлёв Сергей
Guest





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


PostPosted: Tue Apr 10, 2007 7:39 pm (спустя 7 дней 1 час 29 минут; написано за 1 минуту 2 секунды)
   Post subject: работа с деревом
Reply with quote

Интересует, если возможность в DBSimple не только смотреть деревья, но и аккуратно удалить ветвь со связанными веточками и листочками

Спасибо
Back to top
Антон Макаренко
Участник форума



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

Location: Киев

PostPosted: Wed Apr 11, 2007 10:21 am (спустя 14 часов 41 минуту; написано за 3 минуты 16 секунд)
   Post subject:
Reply with quote

Code (any language): скопировать код в буфер обмена
PHP Warning:  Call-time pass-by-reference has been deprecated;  If you would like to pass it by reference, modify the declaration of [runtime function name]().
If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file.
in C:\www\_lib\DbSimple2\Generic.php on line 134
Это критично? Наверняка можно переписать объявление метода без ущерба функциональности:
Code (php): скопировать код в буфер обмена
//
    function setCacher($cacher)
    {
        $prev = $this->_cacher;
        $this->_cacher = $cacher;
        return $prev;
    }
// ...
    $object->setCacher(&$t);

//
    function setCacher(&$cacher)
// ...
    $object->setCacher($t);
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



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

Location: Москва

PostPosted: Wed Apr 11, 2007 6:51 pm (спустя 8 часов 30 минут; написано за 5 минут 59 секунд)
   Post subject:
Reply with quote

Журавлёв Сергей wrote:
Интересует, если возможность в DBSimple не только смот
Это не DbSimple смотрит деревья. Это запрос такой на БД отправляется. DbSimple просто преобразует данные в многомерный массив. Хотите удалить ветку дерева? Без проблем, если СУБД поддерживает (а все СУБД, для которых в дистрибутиве DbSimple есть драйвер, это делают) внешние ключи и события. Для Вашего дерева вешаете внешний ключ и ON DELETE CASCADE. Вот и все. Если непонятно, обратитесь к документации по Вашей СУБД.
О, как загнул! (-;
Антон Макаренко wrote:
Это критично?
Как я заметил, в библиотеках очень много чего deprecated, что не есть хорошо - надо исправлять. Все больше и больше серверов переходят на PHP 5.2.x, в котором, ой, как много чего поменялось.
Back to top
View user's profile Send private message
Kupuyc
Участник форума



Joined: 31 Mar 2006
Posts: 146
Карма: 5
   поощрить/наказать


PostPosted: Wed Apr 11, 2007 7:18 pm (спустя 26 минут; написано за 1 минуту 48 секунд)
   Post subject:
Reply with quote

Может быть поддерживать две (некоторые склоняются, что три - 4.х, 5.0.х и 5.2.х) ветки библиотек? Как это делаеют писатели php, замечая все еще высокую популярность четвертой ветки?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Apr 12, 2007 10:29 am (спустя 15 часов 11 минут; написано за 46 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
function setCacher(&$cacher)
Так делать нельзя точно, потому что в качестве параметра может быть передана константная строка.
Скорее всего, надо делать так:

Было:
                    $t =& new Cache_Lite(array('cacheDir' => $dir.'/', 'lifeTime' => null, 'automaticSerialization' => true));
                    $object->setCacher(&$t);

Стало:
                    $t =& new Cache_Lite(array('cacheDir' => $dir.'/', 'lifeTime' => null, 'automaticSerialization' => true));
                    $object->_cacher =& $t;
Back to top
View user's profile Send private message Send e-mail
Alexey_
Guest





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


PostPosted: Tue Apr 17, 2007 9:20 am (спустя 4 дня 22 часа 50 минут; написано за 25 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Посмотрите пожалуйста конструктор, он не работает.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Wed Apr 18, 2007 1:51 am (спустя 16 часов 30 минут; написано за 13 секунд)
   Post subject:
Reply with quote

Чего?
www.ln.com.ua/~openxs/articles/smart-questions-ru.html
Back to top
View user's profile Send private message Send e-mail
mailer84
Guest





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


PostPosted: Wed Apr 25, 2007 10:12 am (спустя 7 дней 8 часов 21 минуту; написано за 4 минуты)
   Post subject: PgSQL в DbSimple
Reply with quote

Пробую подконнектиться к Postgre-базе. Но без результатно. После строки "$DATABASE = DbSimple_Generic::connect('pgsql://test:test@localhost/t_main');" скрипт останавливает свою работу. В чем тут дело?

Код-приложен в конце поста.

ПС Логин, пароль и база все "рабочие".

Заранее благодарен.
____________________________________________________________
Code (php): скопировать код в буфер обмена
<?php #
require_once "../../lib/config.php";
require_once "DbSimple/Generic.php";

//
$DB = DbSimple_Generic::connect('pgsql://test:test@localhost/t_main');

//
$DB->setErrorHandler('databaseErrorHandler');

function databaseErrorHandler($message, $info)
{
        if (!error_reporting (www.php.net/error_reporting)()) return;
        echo (www.php.net/echo) "SQL Error: $message<br><pre>";
        print_r (www.php.net/print_r)($info);
        echo (www.php.net/echo) "</pre>";
        exit (www.php.net/exit)();
}
?>
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Wed Apr 25, 2007 11:52 am (спустя 1 час 39 минут; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

Очень странно - автоматически тесты ведь срабатывают. Попробуйте вставить наверх

error_reporting(E_ALL);
ini_set('display_errors', true);

и посмотреть, не выводятся ли какие-то ошибки.
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Wed Apr 25, 2007 1:06 pm (спустя 1 час 14 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Очень странно - автоматически тесты ведь срабатывают. Попробуйте вставить наверх

error_reporting(E_ALL);
ini_set('display_errors', true);

и посмотреть, не выводятся ли какие-то ошибки.
Fatal error: Error loading database driver: no file DbSimple/Pgsql.php in include_path; no file Pgsql.php
в 108 строке Generic.php

переименовать файл Postgresql.php в Pgsql.php?
Back to top
Guest






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


PostPosted: Wed Apr 25, 2007 2:19 pm (спустя 1 час 12 минут; написано за 2 минуты 8 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Очень странно - автоматически тесты ведь срабатывают. Попробуйте вставить наверх

error_reporting(E_ALL);
ini_set('display_errors', true);

и посмотреть, не выводятся ли какие-то ошибки.
Спасибо, разобрался! Вместо в connect вместо pgsql написал postgresql и все заработало.
Back to top
Guest






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


PostPosted: Thu Apr 26, 2007 7:45 pm (спустя 1 день 5 часов 25 минут; написано за 1 минуту 22 секунды)
   Post subject: модуль для Oracle
Reply with quote

Скажите, писал ли кто-нибудь модуль для работы с Oracle?
Если есть такие - поделитесь пожалуйста. На сайте не нашел. Гугл тоже молчит.
Back to top
Константин Жинько [tIT]
Сотрудник «Лаборатории»



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

Location: Москва

PostPosted: Sat Apr 28, 2007 10:53 am (спустя 1 день 15 часов 8 минут; написано за 21 секунду)
   Post subject:
Reply with quote

Мы не писали.
Back to top
View user's profile Send private message
five
Заглянувший



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


PostPosted: Sun Apr 29, 2007 12:53 am (спустя 13 часов 59 минут; написано за 1 минуту 55 секунд)
   Post subject:
Reply with quote

error code: 1135
message : Can't create a new thread (errno 35); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
query : mysql_connect()

Вот такое стало появляться после того как masterhost.ru переехал на mysql 5.0.33
До этого была mysql 4 и такого не было.

В какую сторону копать (мои скрипты или masterhost.ru) ?
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



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

Location: Москва

PostPosted: Mon Apr 30, 2007 11:34 am (спустя 1 день 10 часов 41 минуту; написано за 1 минуту 43 секунды)
   Post subject:
Reply with quote

five wrote:
Can't create a new thread (errno 35); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
Пошлите это вместе с участком кода в тех. поддержку. Полагаю, этого будет более чем достаточно для решения Вашей проблемы.
Back to top
View user's profile Send private message
Sandalik
Guest





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


PostPosted: Tue May 01, 2007 1:11 am (спустя 13 часов 37 минут; написано за 3 минуты 18 секунд)
   Post subject:
Reply with quote

Скажите пожалуйста, а есть ли в DbSimple функционал по статистике?
Чтобы библиотека сама считала количество запросов, время затраченное на них (возможно, по каждому из запросов), логи.
Ну и в таком духе.

Я раньше пользовался своими наработками, но поскольку теперь решил использовать DbSimple, то не хотелось бы вносить в него изменения, которые бы повлекли в будущем несовместимости при возможных обновлениях.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue May 01, 2007 11:25 am (спустя 10 часов 13 минут; написано за 1 минуту 34 секунды)
   Post subject:
Reply with quote

Есть, конечно.
Используйте $DB->getStatistics() - он возвращает суммарное время и число запросов.
А для логирования самих запросов и деталей их выполнения можно использовать setLogger(), в документации про него сказано.
Back to top
View user's profile Send private message Send e-mail
Sandalik
Guest





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


PostPosted: Wed May 02, 2007 2:53 pm (спустя 1 день 3 часа 28 минут; написано за 8 секунд)
   Post subject:
Reply with quote

спасибо)
Back to top
rusk
Guest





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


PostPosted: Mon May 07, 2007 8:14 am (спустя 4 дня 17 часов 21 минуту; написано за 2 минуты 48 секунд)
   Post subject:
Reply with quote

хм... может, я, конечно туплю, но у меня имя таблицы приходит из формы... соответственно если писать плэйсхолдер - то оно обрамляется кавычками... Если нет - то разрывать строку... Вроде бы эта библиотека и разрабатывалась для того, чтобы не разрывать строку и не заботиться об экранировании... специальных плэйсхолдеров для имён таблиц я не нашёл, а разрывать строку - лень...
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Mon May 07, 2007 9:23 am (спустя 1 час 8 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

1. На всякий случай: имя таблицы брать из формы небезопасно (как правило).
2. А чем не нравится такой вариант?

$DB->select("SELECT * FROM ?# WHERE ...", $_POST['tableName']);
Back to top
View user's profile Send private message Send e-mail
rusk
Guest





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


PostPosted: Mon May 07, 2007 11:56 am (спустя 2 часа 32 минуты; написано за 4 минуты 36 секунд)
   Post subject:
Reply with quote

Насчёт безопасности - думаю, если ввести ещё один тип плэйсхолдеров типа ?t для имён таблиц и вместо обрамления кавычками удалять из данных все символы отличные от a-z0-9_ то будет более чем безопасно. А насчёт нужности - весьма удобно работать с кучей таблиц, сходных по смыслу и структуре одним унифицированным способом. А ?# даст такой запрос: SELECT * FROM `tbl` WHERE ... Он хоть и работает, но выглядит несколько странно... В общем, пока буду так, а там посмотрим.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Mon May 07, 2007 10:41 pm (спустя 10 часов 45 минут; написано за 39 секунд)
   Post subject:
Reply with quote

Ничего не понял. Что странного в этом запросе? Может быть, Вам стоит почитать документацию MySQL на предмет оператора "бэк-тикм"?
www.ln.com.ua/~openxs/articles/smart-questions-ru.html
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Tue May 08, 2007 1:06 am (спустя 2 часа 25 минут; написано за 5 минут 25 секунд)
   Post subject:
Reply with quote

День добрый.

В связи с использованием библиотеки появились тормоза. Не могу сказать определенно после чего это началось и не было ли сразу. Простейший сценарий выполняется за 1-6 секунд (постоянно по разному). Причем запросы выполняются мгновенно (о чем говорит функция статистики), а вот сценарий встает на это время при выполнении DbSimple_Generic::connect. Стоит php4, mysql 5.0, версия библиотеки на данный момент последняя. При выполнении родных php запросов связанный с БД (в моем случае mysql) тормоза отсутствуют.
У меня что-то не правильно поставлено (даже уже не знаю что) или на самом деле существует такая проблема?
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue May 08, 2007 5:17 pm (спустя 16 часов 10 минут; написано за 1 минуту 59 секунд)
   Post subject:
Reply with quote

Скорее всего, дело не в DbSimple - DbSimple_Generic::connect очень простой и обращается напрямую к mysql_connect, можете посмотреть сами. Попробуйте локализовать место торможения. Кстати говоря, проверьте, не включили ли (или не выключили ли) Вы случайно pconnect.

Вероятнее всего, что-то с настройками хостинга. DbSimple накладных расходов дает очень мало (особенно если логирование запросов отключено).
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



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

Location: Москва

PostPosted: Tue May 08, 2007 6:03 pm (спустя 46 минут; написано за 29 секунд)
   Post subject:
Reply with quote

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



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


PostPosted: Wed May 09, 2007 1:15 am (спустя 7 часов 11 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Ну тогда выясни, пожалуйста, на каком этапе происходит замедление, и имеет ли это какое-то отношение к DbSimple (если у тебя воспроизводится).
Потому что у меня ничего подобного не наблюдается.
Back to top
View user's profile Send private message Send e-mail
Genuine
Участник форума



Joined: 08 Jul 2006
Posts: 29
Карма: 0
   поощрить/наказать

Location: Баку

PostPosted: Thu May 10, 2007 10:03 pm (спустя 1 день 20 часов 48 минут; написано за 3 минуты 31 секунду)
   Post subject:
Reply with quote

Всем привет!
У меня возник такой вопрос.
При выполнении инсертов в базу, если я хочу обращаться к MySQL фукнциям, как быть?
Code (php): скопировать код в буфер обмена
$this->db->query( '
INSERT
INTO `tableName` (?#)
VALUES (?a)'
, array (www.php.net/array)( 'accountHash', 'location', 'timestamp', 'mode' )
            , array (www.php.net/array)( $hash, implode (www.php.net/implode)( ':', $arrayLocation ), time (www.php.net/time)( ), 'region' ) );
Запрос, хотел бы иметь такой:
Code (SQL): скопировать код в буфер обмена
INTO `tableName` (`accountHash`, `location`, `timestamp`, `mode`)
VALUES ('sdsadas4d56as4d56as4', '1:2:3', UNIX_TIMESTAMP( ), 'region')
Есть какие-нибудь решения? :)
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



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

Location: 007 495

PostPosted: Thu May 10, 2007 10:13 pm (спустя 10 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Genuine wrote:
Запрос, хотел бы иметь такой:
Вы ведь уже придумали решение - использовать функцию time()
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



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

Location: Киев

PostPosted: Fri May 11, 2007 2:01 am (спустя 3 часа 48 минут; написано за 7 минут 51 секунду)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
$DB = DbSimple_Generic::connect($DSN, $link_id);
Что если при вызове DbSimple_Generic::connect() добавить необязательным параметром link identifier — готовый идентификатор подключения к БД? Допустим, если $link_id непустой, то $DSN будет использоваться только для выбора "правильного" модуля абстракции, пропуская этап подключения.

Возможно ли абстрагировать "link identifier" таким способом?

Часто приходится ковырять разные ужасные проекты — дописывать модули или хаки. И хочется при этом пользоваться не их "костылями", а DbSimple. И, соответственно, не делать дополнительных соединений.
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Fri May 11, 2007 3:41 pm (спустя 13 часов 39 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

Юpий Насрeтдинов wrote:
Genuine wrote:
Запрос, хотел бы иметь такой:
Вы ведь уже придумали решение - использовать функцию time()
Не совсем. Я бы хотел знать, как можно использовать в таком контексте, который я описал выше встроенные в mysql функции. Ведь вместо UNIX_TIMESTAMP( ) может быть что угодно.
Back to top
Genuine
Участник форума



Joined: 08 Jul 2006
Posts: 29
Карма: 0
   поощрить/наказать

Location: Баку

PostPosted: Fri May 11, 2007 10:00 pm (спустя 6 часов 19 минут; написано за 9 секунд)
   Post subject:
Reply with quote

Забыл авторизоваться. Гость выше - Я.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon May 14, 2007 2:07 am (спустя 2 дня 4 часа 6 минут; написано за 4 минуты 33 секунды)
   Post subject:
Reply with quote

Genuine wrote:
VALUES (?a)', array( 'accountHash', 'location', 'timestamp', 'mode' )
            , array( $hash, implode( ':', $arrayLocation ), time( ), 'region' ) );
Ваш вопрос относится не к DbSimple, а к тому, как Вы формируете запрос в базу. DbSimple - это не "SQL-конструктор", это более низкоуровневый слой абстракции. Так что конструктор Вам нужно будет написать самостоятельно соответственно Вашим желаниям.
Антон Макаренко wrote:
Часто приходится ковырять разные ужасные проекты — дописывать модули или хаки. И хочется при этом пользоваться не их "костылями", а DbSimple. И, соответственно, не делать дополнительных соединений.
Я в таком случае поступаю наоборот: соединяюсь с базой через DbSimple, а потом использую $DB->link в качестве соединения с БД (присваиваю его значение чему-то, что везде используется). В Вашем случае такое не подойдет?

В принципе, можно сделать доработку: если вместо $dns в конструктор DbSimple_Mysql передают is_resource(), то тогда напрямую передавать линк драйверам. Тогда, естественно, Вы не сможете использовать DbSimple_Generic::connect(), а придется писать

$DB =& new DbSimple_Mysql($link);

Но не думаю, что это свяжет Вам руки: если скрипты старые и кривые, там по любому завязка за БД, и можно вручную вызывать DbSimple_Mysql.
Доработка совсем простая, Вы ее можете самостоятельно сделать, а я потом включу в код.
Back to top
View user's profile Send private message Send e-mail
Юрик
Участник форума



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

Location: Питер

PostPosted: Wed May 23, 2007 9:50 pm (спустя 9 дней 19 часов 42 минуты; написано за 36 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Code (php): скопировать код в буфер обмена
$DB = DbSimple_Generic::connect($DSN, $link_id);
Что если при вызове DbSimple_Generic::connect() добавить необязательным параметром link identifier — готовый идентификатор подключения к БД?
Подписываюсь под просьбой, хотя в принципе $DB->link должно сработать.

Вопрос: а поддержка вставки констант не планируется? Давным-давно ведь было так: ' ?#SOME_CONST '.
Понимаю, что имена таблиц и т.п. можно добавлять по ?# , но это, как правило, не всегда удобно - хочется отделить имена и поля таблиц от данных, особенно в больших запросах, иначе входные параметры превращаются в кашу. Кроме того, обычно в константах находится заведомо "безопасный" текст (в плане sql-инжекций).
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu May 24, 2007 12:44 am (спустя 2 часа 54 минуты; написано за 2 минуты 40 секунд)
   Post subject:
Reply with quote

Мой опыт разработки показывает, что в константах для имен таблиц на практике нет необходимости. Точнее, конструкция ?_table_name, где ?_ - префиксный placeholder, на 99% покрывает реальные задачи, а для оставшегося процента можно в качестве исключения использовать и ?#. Собственно, хранить в константах PHP имя таблицы обычно бывает нужно как раз из-за варьируемого префикса. А если его можно варьировать другим способом (через ?_), константы не нужны.

Действительно, не делаете же Вы в скриптах константы

define("ONE", 1);
define("TWO", 2);

и т.д., чтобы потом писать не 1+2, а ONE+TWO...
Back to top
View user's profile Send private message Send e-mail
Юрик
Участник форума



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

Location: Питер

PostPosted: Thu May 24, 2007 1:09 pm (спустя 12 часов 25 минут; написано за 10 минут 45 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Мой опыт разработки показывает, что в константах для имен таблиц на практике нет необходимости. Точнее, конструкция ?_table_name, где ?_ - префиксный placeholder, на 99% покрывает реальные задачи, а для оставшегося процента можно в качестве исключения использовать и ?#.
Вы правы, хранить все таблицы в константах нет смысла, но иногда без этого трудно обойтись. Пример - универсальный модуль авторизации.
Он должен настраиваться на любую таблицу, чтобы можно было встроить его в форум или движок сайта, не меняя его код:
Code (php): скопировать код в буфер обмена
if (!defined (www.php.net/defined)('AUTH_USERS_TABLE')) define (www.php.net/define)('AUTH_USERS_TABLE', 'users');
if (!defined (www.php.net/defined)('AUTH_USERS_TABLE_LOGIN')) define (www.php.net/define)('AUTH_USERS_TABLE_LOGIN', 'username');
if (!defined (www.php.net/defined)('AUTH_USERS_TABLE_PASS')) define (www.php.net/define)('AUTH_USERS_TABLE_PASS', 'password');
if (!defined (www.php.net/defined)('AUTH_USERS_TABLE_ID')) define (www.php.net/define)('AUTH_USERS_TABLE_ID', 'userid');
(эти константы помещаются в начале модуля и их можно задать до его включения)

Или любой другой модуль - фотоальбом, гостевая книга также настраиваются на конкретную таблицу пользователей (иногда ещё и на таблицу групп пользователей), соответственно, любой sql, в котором надо выбрать юзера, идёт с несколькими константами.

В принципе, это не сильно ограничивает применение библиотеки, хотя, насколько понимаю, тех. вохможность добавить новый placeholder типа ?% есть? Или совместить с ?# - особых конфликтов вроде бы не должно быть (за исключением ?#a)?
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



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

Location: Москва

PostPosted: Sat May 26, 2007 1:26 am (спустя 1 день 12 часов 16 минут; написано за 23 секунды)
   Post subject:
Reply with quote

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



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

Location: Питер

PostPosted: Sat May 26, 2007 2:01 am (спустя 35 минут; написано за 1 минуту 58 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
Юрик
Не хочу показаться старомодным, но ничего универсального нет )))
Думаю, это философия, отстранённая от конкретных реалий :-)

А конкретный пример: модуль/движок, настраиваемый на чужую таблицу пользователей. По-моему, весьма актуально.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon May 28, 2007 12:21 pm (спустя 2 дня 10 часов 20 минут; написано за 38 секунд)
   Post subject:
Reply with quote

Юрик wrote:
Пример - универсальный модуль авторизации
Я думаю, если модуль по-настоящему универсален, то он должен хранить имена таблиц не в константах, а в свойствах объекта. Так что смысла в константах все равно нет...
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 ... 13, 14, 15  Next
Page 3 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