Началось это тут http://php.ru/forum/viewtopic.php?p=50534#50534 но чтоб не засорять и без того мусорную тему решил создать отдельную. Учитывая всяческую критику (хотя так и не нашёл нормальной критики) написал вторую версию. PHP: <?php Class Vladson_MySQL { var $link; function Vladson_MySQL() { if (!extension_loaded('mysql')) die('MySQL extension is not loaded.'); } function connect($host="localhost", $user="root", $pass="", $base="test") { if (is_resource($this->link = @mysql_connect($host, $user, $pass))) { return @mysql_select_db($base, $this->link); } else { return false; } } function single_query($sql) { return $this->query($sql, false, false); } function list_query($sql) { return $this->query($sql, false, true); } function row_query($sql) { return $this->query($sql, true, false); } function rowset_query($sql) { return $this->query($sql, true, true); } function disconnect() { return @mysql_close($this->link); } function error() { return is_resource($this->link) ? mysql_error($this->link) : mysql_error(); } function query($sql, $flag1=false, $flag2=false) { if (is_resource($result = @mysql_unbuffered_query($sql, $this->link))) { return $this->fetch($result, $flag1, $flag2); } else { return false !== $result ? mysql_affected_rows($this->link) : false; } } function fetch($result, $flag1, $flag2) { $array = array(); while ($temp = @mysql_fetch_assoc($result)) { $array[] = $flag1 ? $temp : current($temp); } return $flag2 ? $array : current($array); } } ?> Собственно пример использования (только пример, не более) PHP: <?php header('Content-type: text/plain'); include 'vladson_mysql.php'; $mysql = & new Vladson_MySQL(); // ссоединяемся (TRUE || FALSE) var_dump($mysql->connect()); echo "single_query1\n"; // стандартный запрос, возвращает отчёт о затронутых рядах var_dump($mysql->single_query("INSERT INTO `asd` VALUES (CEIL(RAND()*5000));")); var_dump($mysql->single_query("DELETE FROM `files` WHERE `id` > 99;")); var_dump($mysql->single_query("UPDATE `files` SET `id` = 1 WHERE `id` = 3;")); echo "single_query2\n"; // если запрос должен вернуть только одно значение var_dump($mysql->single_query("SELECT RAND();")); var_dump($mysql->single_query("SELECT COUNT(*) FROM `files`;")); var_dump($mysql->single_query("SELECT `name` FROM `files` WHERE `id` = 1;")); echo "row_query\n"; // или один ряд var_dump($mysql->row_query("SELECT UNIX_TIMESTAMP(), MD5(UNIX_TIMESTAMP());")); var_dump($mysql->row_query("SELECT `id`,`name` FROM `files` WHERE `id` = 1;")); echo "list_query\n"; // если нужен список var_dump($mysql->list_query("SHOW DATABASES;")); var_dump($mysql->list_query("SELECT `name` FROM `files`;")); echo "rowset_query\n"; // если нужна таблица var_dump($mysql->rowset_query("SELECT `id`,`name` FROM `files` WHERE `id` > 1;")); // отссоединяемся (TRUE || FALSE) var_dump($mysql->disconnect()); ?> Специально учитывая критику dark-demon-а (хотя я не считаю что это нормальная критика, уверен что он просто придрался) добавил 4 вида запросов к базе, хотя я считаю что гараздо удобнее пользоваться только одним способом (тем что с флагами) и если я буду использовать этот класс то просто вырежу строчки с 14 по 25-ю (включительно) Жду нормальной критики (а не придирок) особенно жду выявления каких нибудь ярко выраженных ошибок (а то самомнение уже начинает распирать, хочу чтоб меня кто нибудь на место поставил)
*тупо уставился в класс* Vladson, может я не понял, но смысл-то в чём этого класса? От ручного составления запросов никуда не ушли (кстати, может WHERE `id` = '1'; ? ), в обработке результата тоже не сильно далеко продвинулись — как обходили массив циклом, так и будем обходить Разница лишь в том, что вместо mysql_query() теперь $mysql-> * _query писать. P.S. не придираюсь, любопытство заело просто
Как и было сказано смысл не в абстракции !!! Я стремлюсь отделить всё лишнее и оставить на скрипт только "запрос->ответ" а всё что лишнее выкинуть в классы и функции. `id` это INTEGER кавычки не нужны Груши тяжелее, на голову упадёт больно будет...
Vladson Данные для добавления зачастую заполняются динамически, и ты сам заранее не знаешь, сколько там полей и какие типы имеют значения. Уважающий себя класс для работы с БД должен уметь формировать запрос INSERT по ассоциативному массиву, заодно экранируя значения.
Это абстракция, а я ярый её противник, кому она нужна пусть её сам и делает. Если программист не знает сколько там каких полей ему вставлять/брать значит одну из двух вещей: 1 - он один из тех немногих кому довелось написать такую систему в которой абстракция оправдана. 2 - ему надо менять профессию, заняться чем-то более спокойным и расслабляющим например боксом.
нежнее, еще нежнее. с таким подходом можно обсирать любой код и дое*аца до того, что первый тег с скрипте не <?php, а <? или наоборот.
Vladson Давай без маразма, OK? Ситуация, когда добавляется/обновляется динамический список полей, элементарна. Например, редактирование сообщения на форуме. В зависимости от прав участника и даты/времени, к сообщению добавляются поля "отредактировал такой-то" и "отредактировал тогда-то", либо эти поля остаются неизменными. Если ты с таким не встречался, это не значит, что никто не встретится, надо видеть чуть дальше своих же тестовых примеров. Либо сразу уточняй, мол "я написал класс, который не рекомендуется использовать на практике, поэтому не вздумайте критиковать." Кстати, предыдущая тема, "мусорная", как ты сам сказал, ушла во флуд в основном благодаря тебе и твоей привычке на любую критику смотреть как на неконструктивную. Нафиг выкладывать свое творчество, если ты не готов выслушать мнение окружающих.
Там была не критика а придирки "почему твой унитаз не работает как вертолёт ?" Кому нужна (имхо лишняя) абстракция используют различные "Груши" и тому подобное, мой класс предназначен для других целей !!!
так, Vladson упоминул бокс, кажется его уже длстало писать про то, что в качестве замены mysql_query() + while() очень даже не плохо, только в случае rowset_query при выводе информации придётся 2 раза перебирать массив в самом классе и позже при непосредственно выводе
Этот класс отправляет запросы и получает результаты, а генерацией самих запросов должны заниматься внешние от класса средства (будь то простой sprintf или внешние SQL-builder-ы) Мой класс не является "языком программирования" способным заменить РНР/SQL код на что-то типа и не надо критиковать его за это, это просто другая вещь (совсем) Ага, "вертолёт vs унитаз" клёвый "холивар"
Так вот их и критикуй а не то что у меня унитаз не имеет штурвала и не оснащён GPRS и лазерным прицелом
PHP: <?php static function __getConnection(){ static $DBc; if(isset($DBc))return $DBc; else{ $DBc = mysql_connect($host,$user,$pass); mysql_select_db($db); return $DBc; } } function query($query){ mysql_query($query,$this->__getConnection); } ?>
Vladson Без сомнения, без сомнения. Просто будь готов к тому, что кто-то посмотрит на твой класс и скажет: "а зачем мне унитаз Владсона, если есть вертолет от Имярек, и тоже забесплатно?" Тем более что и штурвал, и GPRS - не самые последние вещи во время полета. Использовать твой класс для реальных приложений сложно - многого не хватает, а заниматься расширением твоего класса дополнительным функционалом никто не станет (особенно зная как ты к этому относишься ), проще полноценное свое написать с нуля.
Код (Text): function fetch($result, $flag1, $flag2) { $array = array(); while ($temp = @mysql_fetch_assoc($result)) { $array[] = $flag1 ? $temp : current($temp); } return $flag2 ? $array : current($array); } ты всегда получаешь все записи, но иногда от полученного оставляешь только одну строчку. толку в таком случае от mysql_unbuffered_query никакого.