За последние 24 часа нас посетили 11302 программиста и 806 роботов. Сейчас ищут 394 программиста ...

Либа для работы с БД

Тема в разделе "Решения, алгоритмы", создана пользователем vasa_c, 14 сен 2007.

  1. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Осмелюсь кинуть ссылу на свою библиотечку.

    Работа только с одной базой в сценарии. Только MySQL.
    Экранирование данных, разбор результата, плюс пара фишек.

    PHP5-only

    Качать здесь (5K).
    Дока тут.
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Быстро пробежался и вот какое предложение возникло. В методе delete, если не указано $where делать TRUNCATE, а не DELETE.
     
  3. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Хм, логично )
     
  4. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    >С другой стороны это же позволяет работать только с одной базой данных, что, впрочем, подходит для большинства средних проектов.

    боже упаси, если какой-нибудь из твоих проектов станет крупным :) проклянёшь сам себя...
     
  5. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    На крупных ПГ используем. Там схемы и вся фигня.
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    > DB::select('tbl', '*', 1, '`ordr` asc', Array('?i, ?i', Array(0, 10))); // select * from 'tbl' where 1 order by `ordr` asc limit 0, 10

    второй вариант понятней и короче. первый - птичий язык.
     
  7. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Примеры просто показываются синтаксис.
    Несомненно, в большинстве случаев так писать в рабочем сценарии не нужно.
    Формировать массивы от руки из заранее известных данных прямо в аргументе метода бессмысленно.
    Однако, часто данные берутся уже из готовых структур. Здесь, гораздо легче кинуть эту структуру в соответствующий метод, чем на её основе формировать запрос вручную.
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а без разницы. больше трёх параметров - уже каша.
    а чтобы избавиться от каши начинаешь разбивать на строчки...
    короче, в таких случаях предпочтительнее, что-то типа:
    $db->settable( 'u' => 'mo_users' );
    $db->setfields( array( 'id' => 'user_id', 'name' => 'user_name' );
    $db->addfilter( 'u.name = ?', $name );
    или:
    echo $db->select( array(
    'table' => 'mo_users as u',
    'fields' => 'user_time as time',
    'filter' => 'u.time>now()'
    ));
    или их комбинация
     
  9. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Лично мне вломак для одного запроса, городить десять строчек кода, когда хватает одной.
    Так же вломак создавать ассоциативные массивы, прописывать их индексы и т.п, когда можно просто передать значения через запятую.
    В абсолютном большинстве случаев в этих функциях как раз 2-3 аргумента и используется.
     
  10. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    >DB::select('tbl', '*', 1, '`ordr` asc', Array('?i, ?i', Array(0, 10)));

    Жесть... говорят это проходит при повышении уровня дзен :))))
    У меня прошло, больше не болею :)))

    Может я плохой программист... или задачи не те? :) Периодически возьмет да возникнет задача в которой треба запрос, чуть сложнее обычного SELECT ... FROM ... WHERE ...
    Как быть?
    Делать пять обращений к базе посредством простых запросов используя эту библиотеку?
    Скажем может ли библиотека работать с запросами вида
    [SQL]SELECT ... FROM .... LEFT JOIN ... ON ... WHERE ...[/sql]
    [sql]INSERT .... (....) SELECT ... FROM.... WHERE ....[/sql]
    и т. д.

    В доке я ничего такого не нашел :(
    Так же не понял работает ли, данная библиотека с SQL-евскими функциями COUNT(), DATE_FORMAT(), etc...
     
  11. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    А вы осилили доку?
    У данной либы основная задача одна — облегчить основную рутину:
    1. Бесконечные mysql_escape на входе
    2. Бесконечные mysql_fetch на выходе

    + еще фишка для меня удобная - автоматическое добавление префиксов к таблицам.

    Основной метод - DB::query(), который получает обычный запрос в том формате, каком хотите.

    Те функции за которые вы тут "взялись" :) просто как бонус идут.
     
  12. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ага, сначала всега вломак писать наглядно, а потом открываешь свой исходник через пару месяцев и думаешь, что же означает единичка третьим параметром :)
     
  13. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Гражданин, проблем с наглядностью своих исходников у меня не уже достаточное количество лет.
    Про формат вызова данных функций, когда их стоит вызывать, а когда нет, я уже ответил.
     
  14. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Мышы плакали, причитали, но продолжали есть выращенный собственными руками кактус :)
     
  15. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Нет, я почитал о селекте ничего не нашел сделал поиск по COUNT и DATE_FORMAT
    По Having и LIMIT еще надо было поискать :) И по рандому :)
    А не проще использовать пользовательский объект базы, который будет иметь свой коннект и с одноименными методами
    PHP:
    1. <?
    2. $DB->setTablePrefix('mycms_');
    3. mysql_query($sql) == $DB->query($sql);
    4. mysql_fetch_assoc($result) == $DB->fetch_assoc($result);
    5. etc..?>
    vasa_c
    не ругайтесь, поймите простую вещь - чем больше вы расширите свою библиотеку тем тормознутее она будет. Что лучше написать один раз обращение на настоящем SQL или каждый раз получать тормоза в результате формирования каждого запроса, к тому же если вы расширете ее до способностей всего SQL вы в ней потеряетесь совсем как только прекратите с ней работать хотя бы месяца на три....

    Я уже вроде говорил... писал так, пробовал... но пришел к выводу - лучше чем писать на языке а не на псевдо языке ничего нет... Не та задача, чтобы такие вещи делать... если вам совсем лень лучше напишите свой компилятор который будет преобразовывать ваш псевдо язык в код для интерпритатора пхп, и тогда вам по крайней мере не придется обучать ваших последователей дополнительному языку :) Хотя и это конечно маразм :) Но о вкусах не спорят ведь ;)
     
  16. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Я не ругался. Я кротко высказал неприятие критики, со стороны тех, кто не разобрался в вопросе. :)

    "О селекте" составляет примерно 10% от общего объема доки и находится где-то в середине, а основная суть описана в начале.

    Я это понимаю. И именно это, практически такими же словами, я на этом же самом форуме неоднократно объяснял другим.

    Даже если вы не осилили, что я там написал, я ответил вам здесь 5 постами выше. Повторяю: основная фишка не в "псевдоязыке" и не в надстройке над SQL, а в изменении интерфейса доступа. Интерфейса, предоставляемыми стандартными mysql_*()-функциями.

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

    PS. Еще раз: если бы мнение общественности было выражено в форме, типа, "ф топку", "атцой", то я бы ничего здесь разводить не стал. Ни на что большое этот скриптик не претендует и, понятно, что у людей вашего уровня есть куда лучше. Кинул — может новичкам понравится.
    Но критику не по теме, повторяю, не люблю. :)
     
  17. Kanat Taumenov

    Kanat Taumenov Активный пользователь

    С нами с:
    16 сен 2007
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Казахстан, Уральск
    а куда можно кинуть файл?
    я тоже хотел для сравнения дать свой класс доступа к бд, с простейшими функциями..
    функции класса:
    Код (Text):
    1.   function getrecord($number)
    2.   function getrecords($from,$count)
    3.   function getall()
    4.   function getrecordby($field,$value)
    5.   function setsort($sort,$asc="ASC")
    6.   function clearsort()
    7.   function setfilter($filter)
    8.   function clearfilter()
    9.   function recordcount()
    10.   function makeselect($selectedvalue,$valuefield,$titlefield,$controlname)
    11.   function save($param)
    12.   function delete($id)
    или можно сюда код? 245 строк..
     
  18. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Думаю для этого лучше создать отдельную тему.
    Если код занимает не больше двух экранов кидайте его прямо в сообщение, если больше, лучше дать ссылку.

    Если те функции, которые вы привели и есть основные, советую прислушаться к сообщению vb (выше, адресованное мне), про надстройки над языком SQL.
     
  19. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
  20. Kanat Taumenov

    Kanat Taumenov Активный пользователь

    С нами с:
    16 сен 2007
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Казахстан, Уральск
    простой класс доступа к бд. а для сложных (join,having) проще самому писать запрос.
    обычно использую в глобальном классе sys,например:
    $sys = sys::create();
    $table = $sys->table("tablename");
    $table->setfilter("cat=4");
    $table->setsort("subcat","DESC");
    $records = $table->getall();
    foreach($record as $record){
    // обработка $record, представляющей хэш массив
    }
    удобно, не заморачиваешся по поводу как сформировать select update итд
    файл тут
    http://pastebin.mozilla-russia.org/pastebin.php?dl=90119
    dark-demon
    Спасибо.
     
  21. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Это извращение :) Лучше выпить Йаду сразу :)
     
  22. Kanat Taumenov

    Kanat Taumenov Активный пользователь

    С нами с:
    16 сен 2007
    Сообщения:
    16
    Симпатии:
    0
    Адрес:
    Казахстан, Уральск
    vb
    :D какие есть варианты?
    что конкретнее скажете?
    код маленький, разобраться не сложно, как и расширить.
     
  23. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    0
    Адрес:
    Минск
    Kanat Taumenov
    долго искал где происходит подключение к базе. Не нашёл. Расстроился.
    Работать можно только с одной таблицей. Тащить всю информацию о таблице в объект - ИМХО излишество.
    SQL инъекция.
    почти везде, а как вытащить значения определёного поля?
    ошибки могут быть не только в запросе, mysql_error() явно недостаточно
    PHP:
    1. <?php
    2. // создать список выбора
    3.   function makeselect($selectedvalue,$valuefield,$titlefield,$controlname){
    4.     $rows = $this->getrecords(0,$this->recordcount());
    5.     $retselect = <<<T
    6.  
    7.     <select id="$controlname" name="$controlname">\n
    8. T;
    9.     foreach($rows as $row){
    10.       $selected = "";
    11.       if ($row[$valuefield] == $selectedvalue){
    12.         $selected = " selected="selected"";
    13.       }
    14.       $retselect .= "      <option value="{$row[$valuefield]}"$selected>{$row[$titlefield]}</option>\n";
    15.     }
    16.     $retselect .= <<<T
    17.       </select>
    18. T;
    19.     return $retselect;
    20.   }
    21. ?>
    что здесь делает?
    При достаточно ощутимых запросах из БД mysql_free_result делать не будем?

    в каком методе писать свой запрос?

    ИМХО намного проще написать один запрос, чем собирать его из кусочков, причём быть ограниченным особенностями данного класса.
     
  24. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Чем вам так SQL не нравится, что вы пытаетесь от него избавиться?
     
  25. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    AlexGousev, видимо тем, что чистый sql нигде не реализован, а то, что реализовано, не совместимо между собой. :)

    ps: ссылка на код - http://pastebin.mozilla-russia.org/90119