За последние 24 часа нас посетили 19309 программистов и 1605 роботов. Сейчас ищет 851 программист ...

Класс db

Тема в разделе "MySQL", создана пользователем mr.Gasparyan, 19 авг 2009.

  1. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    Написал простенький клас для работы с бд, что скажите?
    PHP:
    1.  
    2. <?php
    3.  
    4. class mysqli_db{
    5.  
    6.     private $host      = '***';
    7.     private $user      = '***';
    8.     private $password  = '****';
    9.     private $database  = '****';
    10.  
    11.  
    12.     private $connection_link;
    13.     private $query_result;
    14.     private $query_string;
    15.     private $mysqli;
    16.     public $object_array  = array();
    17.  
    18.  
    19.     //Соединение с БД
    20.     public function connect(){
    21.         $this->mysqli = new mysqli($this->host, $this->user, $this->password, $this->database);
    22.  
    23.         if (mysqli_connect_errno()) {
    24.             printf("Подключение невозможно: %s\n", mysqli_connect_error());
    25.             exit();
    26.         }
    27.     }
    28.  
    29.     //Выполнение запроса
    30.     public function query($query_string){
    31.         $this->query_string = $query_string;
    32.         $this->query_result = $this->mysqli->query($query_string);
    33.  
    34.     }
    35.  
    36.     //Вывод на экран запроса
    37.     public function query_print(){
    38.         echo '<font color="red">'.$this->query_string.'</font>';
    39.     }
    40.  
    41.     //Возвращение массива
    42.     public function return_obj_array(){
    43.         $this->object_array='';
    44.  
    45.             $i = 0;
    46.           while( $row = $this->query_result->fetch_assoc() ){
    47.                 $this->object_array[$i] = $row;
    48.                 $i++;
    49.             }
    50.  
    51.         return $this->object_array;
    52.         $this->query_result->->close();
    53.     }
    54.  
    55.     //Разрыв связи
    56.     public function __destruct(){
    57.         $this->mysqli->close();
    58.     }
    59.  
    60. }
    61.  
    62. ?>
    63.  
     
  2. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    нету синглетона

    хочется

    $db = DB::GetInstance();

    хотелось бы иметь

    $obj = $db->QueryObject($sql);

    $objs = $db->QueryObjects($sql);

    $id = $db->QueryInsertArray($table,$insert);
    $db->QueryUpdateArray($table,'id',$id,$update);

    нету проверок на данные

    вообще класс просто фантик для mysqli - толку ноль
     
  3. kostyl

    kostyl Guest

    mr.Gasparyan
    ну, замутил бы хоть плейсхолдеры что ли?
     
  4. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    Если у вас есть сравнительно простой класс (для моего понимания), прошу показать.
     
  5. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    давай начнем с того ЗАЧЕМ пишется такой класс и нужен ли он вообще?
     
  6. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    Хочу автоматизировать все что можно :) да и не писать постояно лишний код
     
  7. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    грамотная структура классов - дорогого стоит.

    для начала прочти про autoload()

    потом сформулируй для себя что же будет автоматизировано?

    все-все - это будешь девочкам втирать. тут нужно знать точно.
     
  8. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    А зачем autoload? Будет же один класс.
    Автоматизировать хотелось бы добавление удаление и т.д., думаю вы со своим опытом
    подскажите что еще лучше автоматизировать.
     
  9. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    поверь - будет МНОГО классов
    =)



    вот чем выше уровень абстракции - тем геморойнее все оно...

    я юзаю такое:

    PHP:
    1.  
    2. <?php
    3. /**
    4.  * Класс для работы с MySQL DB
    5.  */
    6.  
    7. class EnigmaMySQL extends EnigmaATOM {
    8.  
    9.     /**
    10.      * соединение
    11.      */
    12.     var $conn = false;
    13.  
    14.  
    15.     /*
    16.     * Как запущен? ВЕБ или консоль
    17.     *
    18.     */
    19.     function isCGI() {
    20.  
    21.         $rc = true;
    22.  
    23.         if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
    24.            $rc = false;
    25.         }
    26.  
    27.         return $rc;
    28.  
    29.     }
    30.  
    31.  
    32.     /**
    33.      * Выдать сообщение об ошибке и закончить работу
    34.      *
    35.      * @param string $msg пользовательское сообщение
    36.      */
    37.     function Error($msg='') {
    38.  
    39.         if($this->isCGI()) {
    40.             if(!empty($msg))
    41.                 print("\nMySQL error: [".iconv('UTF-8','CP1251',$msg)."]");
    42.  
    43.             if($this->conn) {
    44.                 print("\nMySQL error: [".mysql_errno($this->conn)."] ".mysql_error($this->conn)."");
    45.  
    46. /*
    47.                 $result = mysql_query('show full processlist',$this->conn);
    48.                 while( $row = mysql_fetch_row($result) ) {
    49.                     print_r($row);
    50.                 }
    51. */
    52.  
    53.             } else {
    54.                 print("\nMySQL error: [".mysql_errno()."] ".mysql_error()."");
    55.             }
    56.  
    57.         } else {
    58.             print('<div style="border: 1px solid red; padding: 10px; background-color: white;">');
    59.             if(!empty($msg))
    60.                 print("Enigma::MySQL::error [<pre>{$msg}</pre>]<br />");
    61.             if($this->conn)
    62.                 print("MySQL error1: [".mysql_errno($this->conn)."] ".mysql_error($this->conn)."");
    63.             else
    64.                 print("MySQL error2: [".mysql_errno()."] ".mysql_error()."");
    65.             print('</div>');
    66.         }
    67.  
    68.         exit();
    69.     }
    70.    
    71.     /**
    72.      * Инициализироать класс
    73.      *
    74.      * @return void
    75.      */
    76.     function EnigmaMySQL($host,$user,$pass,$dbdb) {
    77.        
    78.         $this->conn = @mysql_pconnect($host,$user,$pass) or $this->Error('Не могу подключиться к БД ['.$host.']');
    79.         @mysql_select_db($dbdb,$this->conn) or $this->Error('Не могу выбрать БД');
    80.         $this->Query('SET NAMES UTF8');
    81.  
    82.     }
    83.    
    84.     /**
    85.      * Получить уникальный экземпляр класса
    86.      *
    87.      * @return instance
    88.      */
    89.     function GetInstance($id=0,$host='localhost',$user='enigma',$pass='enigma',$dbdb='enigma') {
    90.        
    91.         static $instance = array();
    92.        
    93.         // закрываем
    94.         if($host == 'close' AND $user == '' AND $pass == '' AND $dbdb == '') {
    95.             $instance[$id]->Close();
    96.             unset($instance[$id]);
    97.             return false;
    98.         }
    99.  
    100.         if(!isset($instance[$id])) $instance[$id] = new EnigmaMySQL($host,$user,$pass,$dbdb);
    101.        
    102.         return $instance[$id];
    103.        
    104.     }
    105.    
    106.     /**
    107.      * завершиь работу класса
    108.      * @return void
    109.      */
    110.     function Close() {
    111.        
    112.         if($this->conn) @mysql_close($this->conn);
    113.         $this->conn = false;
    114.        
    115.     }
    116.    
    117.     /**
    118.      * Выполнить SQL запрос и вернуть результат
    119.      *
    120.      * @param string $sql SQL запрос
    121.      * @return resorce ресурс запроса
    122.      */
    123.     function Query($sql) {
    124.        
    125.         $result = mysql_query($sql,$this->conn);
    126.         if($result === false) $this->Error($sql);
    127.        
    128.         return $result;
    129.     }
    130.  
    131.     function Insert($sql) {
    132.        
    133.         $result = mysql_query($sql,$this->conn);
    134.         if($result === false) $this->Error($sql);
    135.                
    136.         return mysql_insert_id($this->conn);
    137.     }  
    138.    
    139.     /**
    140.      * Получить один объект из запроса
    141.      *
    142.      * @param string $sql SQL запрос
    143.      * @return object Объект из запроса
    144.      */
    145.     function QueryObject($sql) {
    146.        
    147.         $result = $this->Query($sql);
    148.        
    149.        
    150.         if( mysql_num_rows($result) == 0 ) {
    151.             return false;
    152.         }
    153.        
    154.         if( mysql_num_rows($result) > 1 ) {
    155.             $this->Error('SQL запрос вернул больше 1 записи');
    156.         }
    157.         $obj = mysql_fetch_object($result);
    158.        
    159.         return $obj;
    160.     }
    161.  
    162.     /**
    163.      * Получить один объект из запроса
    164.      *
    165.      * @param string $sql SQL запрос
    166.      * @return object Объект из запроса
    167.      */
    168.     function QueryArray($sql) {
    169.        
    170.         $result = $this->Query($sql);
    171.        
    172.         if( mysql_num_rows($result) == 0 )
    173.             return false;
    174.        
    175.         if( mysql_num_rows($result) > 1 ) {
    176.             $this->Error('SQL запрос вернул больше 1 записи');
    177.         }
    178.         $obj = mysql_fetch_assoc($result);
    179.        
    180.         return $obj;
    181.     }  
    182.    
    183.     /**
    184.      * Получить массив объектов из SQL запроса
    185.      *
    186.      * @param srting $sql SQL запрос
    187.      * @return array массив объектов
    188.      */
    189.     function QueryObjects($sql) {
    190.        
    191.         $result = $this->Query($sql);
    192.        
    193.         if($result) {
    194.             $objs = array();
    195.             while( $obj = mysql_fetch_object($result) ) {
    196.                 $objs[] = $obj;
    197.             }
    198.             mysql_free_result($result);
    199.             if( count($objs) > 0 ) return $objs;
    200.         }
    201.    
    202.         return false;
    203.  
    204.     }
    205.  
    206.     /**
    207.      * Получить массив массивов из SQL запроса
    208.      *
    209.      * @param srting $sql SQL запрос
    210.      * @return array массив объектов
    211.      */
    212.     function QueryArrays($sql) {
    213.        
    214.         $result = $this->Query($sql);
    215.        
    216.         $objs = array();
    217.         if($result) {
    218.             while( $obj = mysql_fetch_assoc($result) ) {
    219.                 $objs[] = $obj;
    220.             }
    221.         }
    222.        
    223.         mysql_free_result($result);
    224.  
    225.         return $objs;
    226.     }
    227.    
    228.    
    229.     function InsertArray($table,$a=array()) {
    230.        
    231.         if(!empty($table)) {
    232.  
    233.             $t = array();
    234.            
    235.             foreach($a as $k => $v) {
    236.                 $t[$k] = $this->Escape($v);
    237.             }
    238.            
    239.             $keys = '`'.join('`,`',array_keys($t)).'`';
    240.             $vals = "'".join("','",array_values($t))."'";
    241.            
    242.             $this->Query("
    243.            
    244.                 INSERT INTO
    245.                     `$table`
    246.                 ( $keys )
    247.                 VALUES
    248.                 ( $vals )
    249.            
    250.             ");
    251.                
    252.             return mysql_insert_id($this->conn);
    253.                
    254.         }
    255.        
    256.         return false;
    257.        
    258.     }
    259.  
    260.     function UpdateArray($table,$idname,$id,$a=array()) {
    261.        
    262.         if(!empty($table)) {
    263.  
    264.             $set = '';
    265.             foreach($a as $k => $v) {
    266.                 $set .= "`".$k."` = '".mysql_escape_string($v)."', ";
    267.             }
    268.            
    269.             $set = trim($set,', ');
    270.            
    271.             $this->Query("
    272.            
    273.                 UPDATE
    274.                     $table
    275.                 SET
    276.                     $set
    277.                 WHERE
    278.                     `$idname` = '$id'
    279.            
    280.             ");
    281.         }
    282.        
    283.         return $id;
    284.                
    285.     }
    286.    
    287.     function Delete($table,$idname,$id) {
    288.  
    289.         $this->Query("DELETE FROM `$table` WHERE `$idname` = '$id'");
    290.    
    291.     }
    292.    
    293.     function Count($table,$where='') {
    294.        
    295.         if(!empty($where))
    296.             $cnt = $this->QueryObject("SELECT count(*) AS cnt FROM $table AS cnt WHERE $where");
    297.         else
    298.             $cnt = $this->QueryObject("SELECT count(*) AS cnt FROM $table");
    299.        
    300.         return $cnt->cnt;
    301.            
    302.     }
    303.    
    304.     function Escape($var) {
    305.        
    306.         return mysql_escape_string($var);
    307.        
    308.     }
    309.  
    310.     function GetInsertId() {
    311.         return mysql_insert_id($this->conn);
    312.     }
    313.  
    314.  
    315.     function QueryObjectMemcache($sql) {
    316.  
    317.         $MEMCACHE = TSMemCache::GetInstance();
    318.         $MEMKEY = 'qo.'.md5($sql);
    319.  
    320.         $OBJECTS = $MEMCACHE->Get($MEMKEY);
    321.         if($OBJECTS) {
    322.             return $OBJECTS;
    323.         }
    324.  
    325.         $OBJECTS = $this->QueryObject($sql);
    326.         $MEMCACHE->Set($MEMKEY,$OBJECTS,MEMCACHE_5);
    327.  
    328.         return $OBJECTS;
    329.  
    330.     }
    331.  
    332.     function QueryObjectsMemcache($sql) {
    333.  
    334.         $MEMCACHE = TSMemCache::GetInstance();
    335.         $MEMKEY = 'qos.'.md5($sql);
    336.  
    337.         $OBJECTS = $MEMCACHE->Get($MEMKEY);
    338.         if($OBJECTS) {
    339.             return $OBJECTS;
    340.         }
    341.  
    342.         $OBJECTS = $this->QueryObjects($sql);
    343.         $MEMCACHE->Set($MEMKEY,$OBJECTS,MEMCACHE_5);
    344.  
    345.         return $OBJECTS;
    346.  
    347.     }
    348.  
    349. }
    350.  
    351. ?>
    352.  
     
  10. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    Сразу вопрос что лучше юзать
    mysql || mysqli ?
     
  11. kostyl

    kostyl Guest

    mr.Gasparyan
    i
     
  12. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    mysqli в чем ее плюс, она быстрее или что еще?
     
  13. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
  14. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    Именно из этой статьи я узнал об И
     
  15. kostyl

    kostyl Guest

    mr.Gasparyan
    https://php.ru/manual/book.mysqli.html
    Читай, читай, читай. Не знаешь английский? Я тоже не знаю. Если не можешь перевести то тебе нефиг делать в программировании, ибо чем ты становишься лучше тем лучше должен быть английский.
     
  16. mr.Gasparyan

    mr.Gasparyan Активный пользователь

    С нами с:
    10 авг 2009
    Сообщения:
    36
    Симпатии:
    0
    Согласен.
     
  17. kostyl

    kostyl Guest

    mr.Gasparyan
    i быстрее, поддерживает плейсхолдеры, множественные запросы, объектную реализацию.
     
  18. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    440Hz
    Теперь я знаю откуда у тебя мания писать НазваниеМетода вместо названиеМетода :D
     
  19. kostyl

    kostyl Guest

    Psih
    мне тоже интересно, я ведь тоже так пишу??
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Для простых запросов удобно, если помнить список аргументов функции (вместе с подобным классом нужно печатать документацию). Но если нужно провернуть запрос посложнее, то нужно копать исходный код, чтобы понять, как его организовать через данный метод.
     
  21. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    только НИКАМУ не говори!
    =)