За последние 24 часа нас посетили 19537 программистов и 1023 робота. Сейчас ищут 595 программистов ...

Класс для работы с MySQL

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

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Началось это тут http://php.ru/forum/viewtopic.php?p=50534#50534 но чтоб не засорять и без того мусорную тему решил создать отдельную.
    Учитывая всяческую критику (хотя так и не нашёл нормальной критики) написал вторую версию.

    PHP:
    1. <?php
    2. Class Vladson_MySQL {
    3.     var $link;
    4.     function Vladson_MySQL() {
    5.         if (!extension_loaded('mysql')) die('MySQL extension is not loaded.');
    6.     }
    7.     function connect($host="localhost", $user="root", $pass="", $base="test") {
    8.         if (is_resource($this->link = @mysql_connect($host, $user, $pass))) {
    9.             return @mysql_select_db($base, $this->link);
    10.         } else {
    11.             return false;
    12.         }
    13.     }
    14.     function single_query($sql) {
    15.         return $this->query($sql, false, false);
    16.     }
    17.     function list_query($sql) {
    18.         return $this->query($sql, false, true);
    19.     }
    20.     function row_query($sql) {
    21.         return $this->query($sql, true, false);
    22.     }
    23.     function rowset_query($sql) {
    24.         return $this->query($sql, true, true);
    25.     }
    26.     function disconnect() {
    27.         return @mysql_close($this->link);
    28.     }
    29.     function error() {
    30.         return is_resource($this->link) ? mysql_error($this->link) : mysql_error();
    31.     }
    32.     function query($sql, $flag1=false, $flag2=false) {
    33.         if (is_resource($result = @mysql_unbuffered_query($sql, $this->link))) {
    34.             return $this->fetch($result, $flag1, $flag2);
    35.         } else {
    36.             return false !== $result ? mysql_affected_rows($this->link) : false;
    37.         }
    38.     }
    39.     function fetch($result, $flag1, $flag2) {
    40.         $array = array();
    41.         while ($temp = @mysql_fetch_assoc($result)) {
    42.             $array[] = $flag1 ? $temp : current($temp);
    43.         }
    44.         return $flag2 ? $array : current($array);
    45.     }
    46. }
    47. ?>
    Собственно пример использования (только пример, не более)
    PHP:
    1. <?php
    2. header('Content-type: text/plain');
    3.  
    4. include 'vladson_mysql.php';
    5. $mysql = & new Vladson_MySQL();
    6.  
    7. // ссоединяемся (TRUE || FALSE)
    8. var_dump($mysql->connect());
    9.  
    10. echo "single_query1\n";
    11.  
    12. // стандартный запрос, возвращает отчёт о затронутых рядах
    13. var_dump($mysql->single_query("INSERT INTO `asd` VALUES (CEIL(RAND()*5000));"));
    14. var_dump($mysql->single_query("DELETE FROM `files` WHERE `id` > 99;"));
    15. var_dump($mysql->single_query("UPDATE `files` SET `id` = 1 WHERE `id` = 3;"));
    16.  
    17. echo "single_query2\n";
    18.  
    19. // если запрос должен вернуть только одно значение
    20. var_dump($mysql->single_query("SELECT RAND();"));
    21. var_dump($mysql->single_query("SELECT COUNT(*) FROM `files`;"));
    22. var_dump($mysql->single_query("SELECT `name` FROM `files` WHERE `id` = 1;"));
    23.  
    24. echo "row_query\n";
    25. //  или один ряд
    26. var_dump($mysql->row_query("SELECT UNIX_TIMESTAMP(), MD5(UNIX_TIMESTAMP());"));
    27. var_dump($mysql->row_query("SELECT `id`,`name` FROM `files` WHERE `id` = 1;"));
    28.  
    29. echo "list_query\n";
    30. // если нужен список
    31. var_dump($mysql->list_query("SHOW DATABASES;"));
    32. var_dump($mysql->list_query("SELECT `name` FROM `files`;"));
    33.  
    34. echo "rowset_query\n";
    35. // если нужна таблица
    36. var_dump($mysql->rowset_query("SELECT `id`,`name` FROM `files` WHERE `id` > 1;"));
    37.  
    38. // отссоединяемся (TRUE || FALSE)
    39. var_dump($mysql->disconnect());
    40. ?>
    Специально учитывая критику dark-demon-а (хотя я не считаю что это нормальная критика, уверен что он просто придрался) добавил 4 вида запросов к базе, хотя я считаю что гараздо удобнее пользоваться только одним способом (тем что с флагами) и если я буду использовать этот класс то просто вырежу строчки с 14 по 25-ю (включительно)

    Жду нормальной критики (а не придирок) особенно жду выявления каких нибудь ярко выраженных ошибок (а то самомнение уже начинает распирать, хочу чтоб меня кто нибудь на место поставил)
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    В примере нет запроса INSERT, и неспроста.
    Добавлять данные при помощи твоего класса будет неудобно.
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Почему ?

    Где неудобство ?

    (добавил в пример)
     
  4. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    А как же поддержка заполнителей?
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Каво прастите ?
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    *тупо уставился в класс*

    Vladson, может я не понял, но смысл-то в чём этого класса? От ручного составления запросов никуда не ушли (кстати, может WHERE `id` = '1'; ? ;) ), в обработке результата тоже не сильно далеко продвинулись — как обходили массив циклом, так и будем обходить :D Разница лишь в том, что вместо mysql_query() теперь $mysql-> * _query писать.

    P.S. не придираюсь, любопытство заело просто
     
  7. Davil

    Davil Guest

    Зато ушли от ручного получения данных.

    P.S. Vladson, а чем пировская абстракция тебя не устраивает?
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Как и было сказано смысл не в абстракции !!!

    Я стремлюсь отделить всё лишнее и оставить на скрипт только "запрос->ответ" а всё что лишнее выкинуть в классы и функции.

    `id` это INTEGER кавычки не нужны ;)

    Груши тяжелее, на голову упадёт больно будет...
     
  9. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Vladson
    Данные для добавления зачастую заполняются динамически, и ты сам заранее не знаешь, сколько там полей и какие типы имеют значения. Уважающий себя класс для работы с БД должен уметь формировать запрос INSERT по ассоциативному массиву, заодно экранируя значения.
     
  10. Davil

    Davil Guest

    Искуственный Интеллект?
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Это абстракция, а я ярый её противник, кому она нужна пусть её сам и делает.

    Если программист не знает сколько там каких полей ему вставлять/брать значит одну из двух вещей:
    1 - он один из тех немногих кому довелось написать такую систему в которой абстракция оправдана.
    2 - ему надо менять профессию, заняться чем-то более спокойным и расслабляющим например боксом.
     
  12. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    нежнее, еще нежнее.
    с таким подходом можно обсирать любой код и дое*аца до того, что первый тег с скрипте не <?php, а <? или наоборот.
     
  13. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Vladson
    Давай без маразма, OK? Ситуация, когда добавляется/обновляется динамический список полей, элементарна. Например, редактирование сообщения на форуме. В зависимости от прав участника и даты/времени, к сообщению добавляются поля "отредактировал такой-то" и "отредактировал тогда-то", либо эти поля остаются неизменными. Если ты с таким не встречался, это не значит, что никто не встретится, надо видеть чуть дальше своих же тестовых примеров. Либо сразу уточняй, мол "я написал класс, который не рекомендуется использовать на практике, поэтому не вздумайте критиковать."

    Кстати, предыдущая тема, "мусорная", как ты сам сказал, ушла во флуд в основном благодаря тебе и твоей привычке на любую критику смотреть как на неконструктивную. Нафиг выкладывать свое творчество, если ты не готов выслушать мнение окружающих.
     
  14. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Там была не критика а придирки "почему твой унитаз не работает как вертолёт ?"

    Кому нужна (имхо лишняя) абстракция используют различные "Груши" и тому подобное, мой класс предназначен для других целей !!!
     
  15. Davil

    Davil Guest

    Сейчас начнется холивар 8)
     
  16. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    так, Vladson упоминул бокс, кажется его уже длстало писать про то, что
    в качестве замены mysql_query() + while() очень даже не плохо, только в случае rowset_query при выводе информации придётся 2 раза перебирать массив :( в самом классе и позже при непосредственно выводе
     
  17. Davil

    Davil Guest

    Vladson
    А почему бы не держать ресурс соединения в статической переменной?
     
  18. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Davil
    Обойдетесь ;)

    Vladson
    *ржотвкулак над аналогией, особенно над операциями INSERT и FETCH* :lol:
     
  19. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Этот класс отправляет запросы и получает результаты, а генерацией самих запросов должны заниматься внешние от класса средства (будь то простой sprintf или внешние SQL-builder-ы)

    Мой класс не является "языком программирования" способным заменить РНР/SQL код на что-то типа
    и не надо критиковать его за это, это просто другая вещь (совсем)

    Ага, "вертолёт vs унитаз" клёвый "холивар"
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Так вот их и критикуй а не то что у меня унитаз не имеет штурвала и не оснащён GPRS и лазерным прицелом
     
  21. Davil

    Davil Guest

    PHP:
    1.  
    2. <?php
    3. static function __getConnection(){
    4.     static $DBc;
    5.     if(isset($DBc))return $DBc;
    6.     else{
    7.         $DBc = mysql_connect($host,$user,$pass);
    8.         mysql_select_db($db);
    9.         return $DBc;
    10.     }
    11. }
    12.  
    13. function query($query){
    14.     mysql_query($query,$this->__getConnection);
    15. }
    16. ?>
    17.  
     
  22. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Davil, паттерн синглетон тут совершенно не к месту.
     
  23. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Vladson
    Без сомнения, без сомнения. Просто будь готов к тому, что кто-то посмотрит на твой класс и скажет: "а зачем мне унитаз Владсона, если есть вертолет от Имярек, и тоже забесплатно?" Тем более что и штурвал, и GPRS - не самые последние вещи во время полета. Использовать твой класс для реальных приложений сложно - многого не хватает, а заниматься расширением твоего класса дополнительным функционалом никто не станет (особенно зная как ты к этому относишься ;)), проще полноценное свое написать с нуля.
     
  24. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Код (Text):
    1.       function fetch($result, $flag1, $flag2) {
    2.           $array = array();
    3.           while ($temp = @mysql_fetch_assoc($result)) {
    4.               $array[] = $flag1 ? $temp : current($temp);
    5.           }
    6.           return $flag2 ? $array : current($array);
    7.       }
    ты всегда получаешь все записи, но иногда от полученного оставляешь только одну строчку. толку в таком случае от mysql_unbuffered_query никакого.
     
  25. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    И ещё - ты подавляет ошибки мускула - думаешь он от нечего делать их шлёт?