За последние 24 часа нас посетили 22730 программистов и 1224 робота. Сейчас ищут 718 программистов ...

Класс для облегчения рутины работы с базой данных MySQL

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

  1. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    mysqli_fetch_all

    Ты просто понятия не имеешь, что указывать поля в запросе вообще нифига не обязательно - это основы синтаксиса SQL
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Alex_pac
    в качестве аватарки разрешены только личные фото
    зы:
    по уму нужен общий интерфейс для нескольких драйверов, транзакции, именованные плейсхолдеры
     
  3. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ииии .. барабанная дробь ... PDO!
     
  4. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    php >=5.3 only

    так или иначе ты не можешь найти чтото более простое и наглядное чем

    PHP:
    1. sql_insert('table',array(
    2.     'value1','value2','value3'));
    я могу поставить но вы же все равно не будете уверены что я там изображен.
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    спасибо кэп )))
    зы: все равно свое лепить придется для шаблонов слоя баз данных
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    около 50 функций в mysql, а в mysqli - более 100.

    Если сравнивать с mysqli, не умеет подсчитывать количество полей, получать ошибку mysql или код ошибки mysql, получать информацию о сервере mysql, создавать постоянные соединения, работать с несколькими соединениями, составлять подготовленные запросы, очищать результат запроса, даже не умеет объединять запросы в транзакции, не говоря уже о банальном получении выборки в ассоциативный массив.
    Код даже не отформатирован.
     
  7. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    думаю, что транзакции можно делать и вручную sql запросом. а вот всё остальное уже имеется, в том числе единый интерфейс для мускула и постгреса. если кого-нибудь заинтересует как это выглядит - выложу код и для постгреса.

    не очень удобный
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А, извини, пожалуйста, ты же под РНР 4 пишешь.

    Кхм, да вполне удобный =/
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну любой класс - это вещь в себе. Кроме инкапсуляции - разницы нет.

    но работать с БД через функции облаченные в другие функции в 2011 году - это как-то уже попахивает...
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Alex_pac
    непонимаю зачем вам они? вы не уверены своих действиях?
    в этих двух вопросах нет связи. транзакции имеют смысл и при нескольких потоках.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я на каждый запрос делаю проверку и запись в лог, плюс отправка имейла о том что пошли проблемы с БД =) хуле. А показыавать посетителям ошибки нельзя, если вы об этом (я что-то нить разговора потерял :D)
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Вот это верно!

    можно спорить о том, как потом работать - с функциями, классами, синглтонами. Но то что надо перейти на mysqli заодно еще и почитать про prepare - это точно
     
  13. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    вот если бд этого форума коньки отбросит, как же он будет работать? или все таки будет экран ошибки?

    Экран ошибки это одно из состояний в которое может попасть сайт если его системы не работают.
     
  14. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Alex_pac
    пользователю пишем "на сайте возникла ошибка" ошибку пишем в лог и отправляем e-mail или sms
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    он выведет ошибку на экран, только если DEBUG_MODE = ON
    Возможна ситуация, когда таблицы может не существовать. Тогда, получив код ошибки 1146, я её создам и повторю запрос, вместо того, чтобы убивать скрипт.
     
  16. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    под экраном ошибки я имел ввиду экран запудривания мозга юзеру как будто "проводятся технические работы, форум временно недоступен" а не прямой вывод ошибок.
     
  17. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    igordata
    Да, не всем нравиться аромат сыра "рокфор". =))
     
  18. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    вроде я уже близок к решению
    как тут уже выявили. Раз mysqli есть значит надо его использовать ибо будущее за ним

    вот первая наработка
    в виде синглтон класса

    MYSUBD slqi v 0.1

    представляю пока еще сыроватую концепцию ООП интерфейса к бд MYSQL через mysqli подключение с использованием глобального синглтон класса

    PHP:
    1.  
    2. <pre>
    3. <?php
    4. class mysql extends mysqli {
    5. static private $_instance = null;
    6. protected function __construct(){}
    7. static public function start(){
    8.     if (self::$_instance == null) {
    9.         self::$_instance = new mysql();
    10.         @self::$_instance->connect('localhost','root','password','databaseName'); // подключение
    11.         mysqli_connect_errno() and die ('<b>Ошибка базы данных MYSQL</b><hr>'.mysqli_connect_error()); // ошибки
    12.         self::$_instance->set_charset('utf8'); // кодировка
    13.     }
    14.     return self::$_instance;
    15. }
    16. #normal class
    17. public function read($query) { #line возвращает первую строчку из запроса (массив одномерный числовой)
    18.    return mysqli_fetch_row(self::$_instance->query($query));
    19. }
    20. public function read_all($query){ #table возвращает полностью содержимое запроса (массив двумерный числовой)
    21.    $res = self::$_instance->query($query);
    22.     while ($row=mysqli_fetch_row($res)) { $ret[]=$row; }
    23.     if (isset($ret)) { return $ret; }
    24.     return false;
    25. }
    26. public function read_one($query) { #one возвращает первую ячейку из запроса (массив отсутвует)
    27.    if ($ret=mysqli_fetch_row(self::$_instance->query($query))) {
    28.         return $ret[0];
    29.     }
    30.     return false;
    31. }
    32. } # end class
    33.  
    34. $mysqli = mysql::start();
    35.  
    36. #$res = $mysqli->read_one('SELECT * FROM table WHERE id > 4');
    37. #$res = $mysqli->read('SELECT * FROM table WHERE id > 4');
    38. $res = $mysqli->read_all('SELECT * FROM table WHERE id > 4');
    39. #$mysqli->query("UPDATE table SET row = 'value' WHERE id = 4");
    40.  
    41. if ($res) {
    42.     print_r ($res);
    43. } else {
    44.     print 'нет значений';
    45. }
    46.  
    1) использование класса синглтон обеспечивает глобальность всех методов
    через конструкцию mysql::start()->query() и тп
    в ЛЮБОМ месте кода или файла

    2) интутивное подключение к бд

    Класс подключается к бд только в случае его вызова.

    3) параметры кодировки и подключения едины и прописаны внутри класса.

    4) класс подчиняется всем методам и параметрам которые прописаны в стандарте mysqli классов

    5) вшиты методы MYSQL_READ технологии извлечения данных, что позволяет увеличить чистоту и логичность кода.
     
  19. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    ты мой герой теперь)
     
  20. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    еще надо один момент рассмотреть

    в mysqli есть такой метод как prepare или заготовленные запросы

    В их синтаксисе присутвуют знаки вопроса, соглано идее это позволяет безопаснейшим и бысрейшим образом составить запрос из переменных параметров

    однако на практике, если посмотреть на статью

    http://phpclub.ru/detail/article/mysqli

    получаем чрезвычайно избыточное число "телодвижений" при работе с такими запросами.

    так что же получается что prepare это шаг назад и лучше mysqli_real_escape_string пока ничего не придумано?
     
  21. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Расточительный парень.
     
  22. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    осталось рассказать еще человеку про pdo и у него через 3 дня появится новейший класс MYSUBDPDO v0.99 для работы с огромным числом субд
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Alex_pac
    лучше mysqli_real_escape_string пока ничего не придумано?
    prepare - лучше
    mysqli_real_escape_string - проще =)

    старайся сам вырабатывать критерии ответа при формулировке вопроса. Лучше чем? В каких ситуациях? При достижении каких целей? - Тогда и ответы будут появляться сами собой.
     
  24. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    вообщем prepare для большого числа запросов которым необходим единый шаблон =)
     
  25. pohapecoder

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

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    Все пишут и пишут какую то хрень. А как решаете проблему работы с разными БД?
    Вот в http://framework.zend.com/manual/ru/zend.db.html это сделано очень хорошо.