Осмелюсь кинуть ссылу на свою библиотечку. Работа только с одной базой в сценарии. Только MySQL. Экранирование данных, разбор результата, плюс пара фишек. PHP5-only Качать здесь (5K). Дока тут.
Быстро пробежался и вот какое предложение возникло. В методе delete, если не указано $where делать TRUNCATE, а не DELETE.
>С другой стороны это же позволяет работать только с одной базой данных, что, впрочем, подходит для большинства средних проектов. боже упаси, если какой-нибудь из твоих проектов станет крупным проклянёшь сам себя...
> DB::select('tbl', '*', 1, '`ordr` asc', Array('?i, ?i', Array(0, 10))); // select * from 'tbl' where 1 order by `ordr` asc limit 0, 10 второй вариант понятней и короче. первый - птичий язык.
Примеры просто показываются синтаксис. Несомненно, в большинстве случаев так писать в рабочем сценарии не нужно. Формировать массивы от руки из заранее известных данных прямо в аргументе метода бессмысленно. Однако, часто данные берутся уже из готовых структур. Здесь, гораздо легче кинуть эту структуру в соответствующий метод, чем на её основе формировать запрос вручную.
а без разницы. больше трёх параметров - уже каша. а чтобы избавиться от каши начинаешь разбивать на строчки... короче, в таких случаях предпочтительнее, что-то типа: $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()' )); или их комбинация
Лично мне вломак для одного запроса, городить десять строчек кода, когда хватает одной. Так же вломак создавать ассоциативные массивы, прописывать их индексы и т.п, когда можно просто передать значения через запятую. В абсолютном большинстве случаев в этих функциях как раз 2-3 аргумента и используется.
>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...
А вы осилили доку? У данной либы основная задача одна — облегчить основную рутину: 1. Бесконечные mysql_escape на входе 2. Бесконечные mysql_fetch на выходе + еще фишка для меня удобная - автоматическое добавление префиксов к таблицам. Основной метод - DB::query(), который получает обычный запрос в том формате, каком хотите. Те функции за которые вы тут "взялись" просто как бонус идут.
ага, сначала всега вломак писать наглядно, а потом открываешь свой исходник через пару месяцев и думаешь, что же означает единичка третьим параметром
Гражданин, проблем с наглядностью своих исходников у меня не уже достаточное количество лет. Про формат вызова данных функций, когда их стоит вызывать, а когда нет, я уже ответил.
Нет, я почитал о селекте ничего не нашел сделал поиск по COUNT и DATE_FORMAT По Having и LIMIT еще надо было поискать И по рандому А не проще использовать пользовательский объект базы, который будет иметь свой коннект и с одноименными методами PHP: <? $DB->setTablePrefix('mycms_'); mysql_query($sql) == $DB->query($sql); mysql_fetch_assoc($result) == $DB->fetch_assoc($result); etc..?> vasa_c не ругайтесь, поймите простую вещь - чем больше вы расширите свою библиотеку тем тормознутее она будет. Что лучше написать один раз обращение на настоящем SQL или каждый раз получать тормоза в результате формирования каждого запроса, к тому же если вы расширете ее до способностей всего SQL вы в ней потеряетесь совсем как только прекратите с ней работать хотя бы месяца на три.... Я уже вроде говорил... писал так, пробовал... но пришел к выводу - лучше чем писать на языке а не на псевдо языке ничего нет... Не та задача, чтобы такие вещи делать... если вам совсем лень лучше напишите свой компилятор который будет преобразовывать ваш псевдо язык в код для интерпритатора пхп, и тогда вам по крайней мере не придется обучать ваших последователей дополнительному языку Хотя и это конечно маразм Но о вкусах не спорят ведь
Я не ругался. Я кротко высказал неприятие критики, со стороны тех, кто не разобрался в вопросе. "О селекте" составляет примерно 10% от общего объема доки и находится где-то в середине, а основная суть описана в начале. Я это понимаю. И именно это, практически такими же словами, я на этом же самом форуме неоднократно объяснял другим. Даже если вы не осилили, что я там написал, я ответил вам здесь 5 постами выше. Повторяю: основная фишка не в "псевдоязыке" и не в надстройке над SQL, а в изменении интерфейса доступа. Интерфейса, предоставляемыми стандартными mysql_*()-функциями. То что вы с Даркдемоном выудили из середины текста, просто несколько вспомогательных функций, иногда бывающими полезными, просто довесок. PS. Еще раз: если бы мнение общественности было выражено в форме, типа, "ф топку", "атцой", то я бы ничего здесь разводить не стал. Ни на что большое этот скриптик не претендует и, понятно, что у людей вашего уровня есть куда лучше. Кинул — может новичкам понравится. Но критику не по теме, повторяю, не люблю.
а куда можно кинуть файл? я тоже хотел для сравнения дать свой класс доступа к бд, с простейшими функциями.. функции класса: Код (Text): function getrecord($number) function getrecords($from,$count) function getall() function getrecordby($field,$value) function setsort($sort,$asc="ASC") function clearsort() function setfilter($filter) function clearfilter() function recordcount() function makeselect($selectedvalue,$valuefield,$titlefield,$controlname) function save($param) function delete($id) или можно сюда код? 245 строк..
Думаю для этого лучше создать отдельную тему. Если код занимает не больше двух экранов кидайте его прямо в сообщение, если больше, лучше дать ссылку. Если те функции, которые вы привели и есть основные, советую прислушаться к сообщению vb (выше, адресованное мне), про надстройки над языком SQL.
простой класс доступа к бд. а для сложных (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 Спасибо.
vb какие есть варианты? что конкретнее скажете? код маленький, разобраться не сложно, как и расширить.
Kanat Taumenov долго искал где происходит подключение к базе. Не нашёл. Расстроился. Работать можно только с одной таблицей. Тащить всю информацию о таблице в объект - ИМХО излишество. SQL инъекция. почти везде, а как вытащить значения определёного поля? ошибки могут быть не только в запросе, mysql_error() явно недостаточно PHP: <?php // создать список выбора function makeselect($selectedvalue,$valuefield,$titlefield,$controlname){ $rows = $this->getrecords(0,$this->recordcount()); $retselect = <<<T <select id="$controlname" name="$controlname">\n T; foreach($rows as $row){ $selected = ""; if ($row[$valuefield] == $selectedvalue){ $selected = " selected="selected""; } $retselect .= " <option value="{$row[$valuefield]}"$selected>{$row[$titlefield]}</option>\n"; } $retselect .= <<<T </select> T; return $retselect; } ?> что здесь делает? При достаточно ощутимых запросах из БД mysql_free_result делать не будем? в каком методе писать свой запрос? ИМХО намного проще написать один запрос, чем собирать его из кусочков, причём быть ограниченным особенностями данного класса.
AlexGousev, видимо тем, что чистый sql нигде не реализован, а то, что реализовано, не совместимо между собой. ps: ссылка на код - http://pastebin.mozilla-russia.org/90119