[Ищу] Класс для работы с MySQL

Тема в разделе "Как сделать...", создана пользователем LEXAlForpostl, 14 ноя 2017.

  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    Здравствуйте.
    Поделитесь, пожалуйста, кто какими классами работает с MySQL, при написании своих супер-крутых скриптов.
    Дабы максимально не допустить SQL inj ))

    Спасибо.
     
  2. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    638
    Симпатии:
    507
    MySQLi, не?)
     
  3. primehostnet

    primehostnet

    Регистр.:
    28 июн 2015
    Сообщения:
    160
    Симпатии:
    28
    юзаю или фреймворк, там как правило все уже подчищается...
    либо использую mysql.class из dle... уж очень он мне понравился
     
  4. Den1xxx

    Den1xxx

    Регистр.:
    15 янв 2014
    Сообщения:
    230
    Симпатии:
    125
    Мой класс:
    PHP:
    // Debug on/off
    define("DEBUG",0);

    // SQL counter
    $query_counter=0;

    /**
    * MySQL database working class
    *
    */
    class MySQLDB {
       private static 
    $instance;
       private 
    $db_config;
       public 
    $connection;

       public static function 
    connect()   {
         if (!isset(
    self::$instance)) {
           
    $c =__CLASS__;
           
    self::$instance=new $c;
         }
         return 
    self::$instance;
       }

       public function 
    __clone() {
         
    trigger_error('Cloning not allowed.'E_USER_ERROR);
       }

       public function 
    __wakeup() {
         
    trigger_error('Cloning not allowed.'E_USER_ERROR);
       }

       private function 
    __construct()   {
         try   {
           if(!(
    $this->db_config parse_ini_file('config/mysql.ini')))   {
             throw new 
    Exception('Cannot load mysqli configuration: ' __FILE__ ' ' __LINE__);
           }    
           
    $this->connection=new mysqli($this->db_config['server'], $this->db_config['username'], $this->db_config['password'], $this->db_config['db']);
           if (
    mysqli_connect_error())   {
             throw new 
    Exception('Database error: ' mysqli_connect_error());
           }
         }
         catch( 
    Exception $e ) {
           print 
    $e->getMessage().'<br />';
         }
         
    $this->connection->set_charset('utf8');
       }

       function 
    query($query='') {
         global 
    $query_counter;
         if(
    DEBUG) print '<br /> Query : '.$query.'<br/>';
         
    $result mysqli_query($this->connection,$query) or die('Error  [query]: <br />'.mysqli_error($mysqldb->connection).'<br /> Query :<br/>'.$query);
         
    $query_counter++;
         return 
    $result;
       }

       function 
    __destruct() {
         
    $this->connection->close();
       }
    }




    /**
    * Returns cutted down entry data
    *
    * @param string $data
    * @param int $mode
    * @return string
    */
    function vf($data,$mode=0) {
       switch (
    $mode)   {
         case 
    1:
           return 
    preg_replace("/[^a-z0-9A-Z]+/",'',$data); // числа, буквы
           
    break;
         case 
    2:
           return 
    preg_replace("/[^a-zA-Z]+/",'',$data); // буквы
           
    break;
         case 
    3:
           return 
    preg_replace("/[^0-9]+/",'',$data); // числа
           
    break;
         case 
    4:
           return 
    preg_replace("/[^a-z0-9A-Z\-_\.]+/",'',$data); // числа, буквы, тире, прочерк, точка
           
    break;
         case 
    5:
           return 
    preg_replace("/[^ [:punct:]".('a-zA-Z')."0-9]+/",'',$data); // соотв. текущему языку алфавит + цифры и знаки препинания
           
    break;
         case 
    'in':
           return 
    preg_replace("~\A[^0-9]+|[^0-9,]+|,[^0-9]*(?=,)|[^0-9]+\Z~",'',$data); // числа, запятые для "SELECT * FROM `table` WHERE `key` IN ($data)"
           
    break;
         default:
           return 
    preg_replace("/[~@\+\?\%\/\;=\*\>\<\"\'\-]+/",'',$data); // блек-лист в крайнем случае.
           
    break;
       }
    }
    Вызывается с помощью $mysqldb = MySQLDB::connect();
    Но грузится 1 раз, даже если вызван несколько, т.к. синглтон.
    Это основа, ещё есть вспомогательные функции для быстрой работы.
     
    Последнее редактирование: 14 ноя 2017
  5. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    Лучше бы классы, чтобы все запросы "чистились")
     
  6. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    638
    Симпатии:
    507
    Так MySQLi и есть класс (точнее это расширение драйвера MySQL, но интерфейс у него в стиле ООП), и в нём "чистятся" запросы :)
     
  7. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    155
    Симпатии:
    35
    У меня вопрос по безопасности.
    Выходит любой желающий, если знает где хранится файл mysql.ini, спокойно открывает файл через браузер и получает пароль от базы???

    можно как то ограничить доступ к файлу только для определенных файлов, например открыть доступ на чтение только для корневого файла index.php????
     
  8. primehostnet

    primehostnet

    Регистр.:
    28 июн 2015
    Сообщения:
    160
    Симпатии:
    28
    что мешает вообще от файла отказаться?
     
  9. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    155
    Симпатии:
    35
    Предложите свой вариант без использования файла конфига с доступами к базе данных.
    Я таковых способов не знаю.

    регулярки - самый легкий способ фильтрации запросов в базу данных.
    Другие способы геморные для меня и мне показались мало эффективными.
    + проверка наличия глобальной переменной $_GET
    Если переменная существует - редирект на url без GET запроса через header и exit.

    Был бы хоть 1 норм способ, уже кто то, да поделился бы.

    Не понимаю чем могут помочь классы работы с базой данных, в плане защиты от инъекций.
    наведите хоть 1 пример без использования файла конфигов подключения к базе данных.
     
    Последнее редактирование: 16 ноя 2017 в 17:28
  10. primehostnet

    primehostnet

    Регистр.:
    28 июн 2015
    Сообщения:
    160
    Симпатии:
    28
    файл с конфигом вам нужен только для того что бы определить значение вот этих переменных
    PHP:
    $this->db_config['server']
    $this->db_config['username']
    $this->db_config['password']
    $this->db_config['db']
    но вам ничто не мешает определить их самим