За последние 24 часа нас посетили 20628 программистов и 1103 робота. Сейчас ищут 384 программиста ...

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

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

  1. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    PDO
     
  2. Alex_pac

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

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

    MYSUBD PDO v 0.1

    протестированы бд ACCESS (ODBC) MYSQL

    access работает только в кодировке windows-1251

    PHP:
    1.  
    2. <pre>
    3. <?php
    4. #utf8 document (кодировка windows-ANSI для Access)
    5. #MYSUBD PDO v 0.1
    6. class easyDB extends PDO {
    7. static private $_PDO = null;
    8. //protected function __construct(){}
    9. static public function start(){
    10.     if (self::$_PDO == null) {
    11.         try {
    12. /*ms access odbc*/  $db = self::$_PDO = new easyDB ("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\myBase.mdb;Uid=Admin"); // подключение
    13. /*mysql*/       #$db = self::$_PDO = new easyDB ("mysql:host=localhost;dbname=mini_guest_book", "root", ""); // подключение
    14.            
    15.         } catch(PDOException $e) {  die ('<b>Ошибка базы данных PDO - connection</b><hr>'.$e->getMessage()); } //ошибка подключения
    16.         #установка кодировки базы данных MYSQL
    17.         /*$sql_charset = 'utf8';
    18.         $db->exec("set character_set_client='$sql_charset'");
    19.         $db->exec("set character_set_results='$sql_charset'");
    20.         $db->exec("set collation_connection='{$sql_charset}_general_ci'");*/
    21.     }
    22.     return self::$_PDO;
    23. }
    24. #normal class
    25. public function read($query) { #line
    26.     if ($res = self::$_PDO->query($query)) {
    27.         $res->setFetchMode(PDO::FETCH_NUM); #включение режима числовых массивов
    28.         return $res->fetch();
    29.     }
    30.     return false;
    31. }
    32.  
    33. public function read_all($query) { #table
    34.     if ($res = self::$_PDO->query($query)) {
    35.         $res->setFetchMode(PDO::FETCH_NUM); #включение режима числовых массивов
    36.         while ($row = $res->fetch()) { $ret[] = $row; }
    37.         if (isset($ret)) { return $ret; }
    38.     }
    39.     return false;
    40. }
    41.  
    42. public function read_one($query) { #one
    43.     $res = self::$_PDO-> read($query);
    44.     return $res[0];
    45. }
    46. } #end class
    47.  
    48. $db = easyDB::start();
    49.  
    50. #$db->exec ("UPDATE gbook SET message = 'привет мир' WHERE id =1");
    51.  
    52. $res = $db->read_all('SELECT * FROM myTable WHERE id = 1');
    53.  
    54. if ($res) {
    55.     print_r ($res);
    56. } else {
    57.     print 'нет значений';
    58. }
    все тоже самое

    синглтон, mysql_read, интуитивное подключение
     
  3. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
  4. pohapecoder

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

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    оба на? и чо помогает?
    а там есть методы
    ->select
    ->join
    ->where
    ->order
    и т.д. ?

    Используя Zend DB, я могу абстрагироваться от SQL хрени создавая реально переносимый код.
    А вот pdo этого уже не может.
    Т.к. мало лишь создать абстрактый интерфейс, нужны еще и методы для генерации самих запросов.
     
  5. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Обоснуйте.
     
  6. Gromo

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

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

    ИМХО, всякие
    привлекают лишь новичков. По мне так проще и понятнее написать полный sql запрос.

    Если абстрагироваться, то лучше делать это уже полностью переходя на объекты баз данных.
    Не работал с классами абстракции моделей на пхп, но подобные есть, к примеру, в Django фреймворке
    http://djangobook.com/en/2.0/chapter05/ или на русском тут http://djbook.ru/ch05.html

    Чем больше предполагаемая "лёгкость" тем более грузной становится реализации, при этом теряя гибкость.
     
  7. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    оп , а я подумал что это старая тема
    забрал , спс =)
    2 вопроса:
    можно ли как-то делать апдейт массивом и можно ли как-то заменить в запросах `` на '' ? меня эти кавычки просто ужс как бесят :>

    кавычки сделал , хоть и работает , но я сомневаюсь что это валидно =)

    например
    PHP:
    1. <?
    2.   public function insert($request, $data, $column){
    3.      $request = $this->query_process($request, $data);
    4.  
    5.  
    6.      $request=explode("VALUES",$request);
    7.        $request[0] = str_replace("'", "`", $request[0]);
    8.        $request=$request[0]."VALUES".$request[1];
    9.  
    10.  
    11.      $query = mysql_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'");
    12.      $query = mysql_query("SELECT last_insert_id() as `{$column}`", $this->conn);
    13.      $array = $this->result2array($query);
    14.      return isset($array[0][$column]) ? $array[0][$column] : 0;
    15.    }
    16.  ?>
    спасибо
     
  8. pohapecoder

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

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    я бы согласился если б он был одинаковым во всех реализациях СУБД.
    года 3 наверное тоже шпилил на всяких PDO и прочих самоделках. но с возрастом и с опытом приходит понимание - что все это хрень и велосипедостроение каждый раз и нет никакой переносимости. так что лучше использовать абстрактный синтаксис.
    кроме того подобный снтаксис выглядит гораздо чище при добавлении различных условий и фильтров.
    с чистым sql не идет не в какое стравнение по читаемости
     
  9. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Года пошли вам не на пользу - называть pdo "самоделкой". Есть SQL и есть его расширения специфичные для субд. И сколько надстроек вы не пишите - вы не сможете сделать специфичные вещи кросс-субдшными. Так что аргумент переноса на другую базу - это вообще не аргумент выбора pdo или классов фреймворка. Тут совсем другие задачи решаются. И не исключено, что интерфейсы некого фреймоврка Х работают через pdo (например, Yii).
     
  10. pohapecoder

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

    С нами с:
    16 окт 2010
    Сообщения:
    63
    Симпатии:
    0
    А мужики то и не знают.
    Я прекрасно осведомлен что в самом ZF DB адаптеры используют PDO.
    Самоделки - это очередные классы для облегчения работы с БД. Люди пишут свои велосипеды в том числе и с PDO.
    Когда используеж PDO напрямую - в этом тоже ничего хорошего нет.
     
  11. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    PDO или не PDO - факт есть факт - хотите что бы работало быстро и эффективно - придётся использовать нестандартные SQL расширения для конкретной базы данных, а это значит в нужных местах опускаться до старого доброго SQL в чистом виде - тут решает то, насколько просто это сделать. Мне этим и нравится Yii - там что AR достойный и шустрый, и опускаться до голого SQL не приходится через задний проход - DAO уровень публично доступен и позволяет писать любой SQL с подстановкой параметров и прочими плюшками фреймворка.
    Упростители SQL хорошо, но на самом деле не совсем то, что хочется. Всёравно приходится много писать, так что по хорошему нужно уходить в сторону AR/Data Mapper/ORM (последнее правда для PHP как такового слишком монструозно и тяжко) и использовать вставки специфичного SQL где требуется.
     
  12. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    вообщем получается надо использовать PDO c абстрактным классом для "простых действий" и прямой SQL для специфических запросов.
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    PDO и есть прямой SQL. PDO - это общий интерфейс передачи запроса и получения данных для разных субд.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Alex_pac
    забей. просто забей =)
     
  15. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    апну-ка я тему
    $inv="asdasd";
    PHP:
    1. <?
    2. $result = $db->select("SELECT * FROM lale_inv WHERE invname={$inv}");
    если вместо инв цифры , тогда всё ок
    где туплю ? :<
     
  16. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    в апострофы нужно брать строки
    PHP:
    1. $result = $db->select("SELECT * FROM lale_inv WHERE invname='{$inv}'");
     
  17. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    тьху =D спасибо
     
  18. Gromo

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

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

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    та у меня с этими классами каша в голове получилась =) С примера понял что не так )
     
  20. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    вот это ' - я называю апостроф
    а вот это ` я не знаю как называется, вот в них и заключают название полей и таблиц :)
     
  21. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    ` - апостроф
    ' - кавычка

    В типографии конечно нет одинарной кавычки, а знак ` зовется обратным апострофом. Но в программировании чтобы небыло путаницы, ' - это одинарная кавычка.
     
  22. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
  23. Easy

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

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    сколько таблиц не видел, везде ' - апостроф
     
  24. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
     
  25. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631