Работа с запросами, запись в бд

class db
{

    public $query_num = 0;
    public $query_id  = false;
    public $db_id;
    function __construct() { }
    function query($query)
    {
  
        if(!$this->db_id) {

            mysqli_report(MYSQLI_REPORT_OFF);

            !($this->db_id = mysqli_connect('localhost', 'user', '123', 'bd')) && $this->display_error(mysqli_connect_error(), 1);

            mysqli_set_charset ($this->db_id , "utf8"); 

            $this->sql_mode();
        }
        
        !($this->query_id = mysqli_query($this->db_id, $query)) && $this->display_error(mysqli_error($this->db_id), $query);

        $this->query_num ++;

        return $this->query_id;
    }
    
    
    function get_array()
    {
        return mysqli_fetch_array($this->query_id);
    }

    function get_row()
    {
        return mysqli_fetch_assoc($this->query_id);
    }
    
    function num_rows()
    {
        return mysqli_num_rows($this->query_id);
    }
    
    function insert_id()
    {
        return mysqli_insert_id($this->db_id);
    }

    function free()
    {
        @mysqli_free_result($this->query_id);
    }

    function sql_mode()
    {

        $this->query( "SELECT @@SESSION.sql_mode" );
        $this->query_num --;
        
        if (!($row = $this->get_array()[0])) return;
        
        foreach (($m_a = array_change_key_case(explode(',', $row), CASE_UPPER)) as $key => $value)
            if (in_array( $value, ['STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'ONLY_FULL_GROUP_BY', 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE', 'TRADITIONAL'])) 
                unset( $m_a[ $key ] );
                
        if($row != ($m_l = implode(',', $m_a))) {
            $this->query( "SET SESSION sql_mode='{$m_l}'" );
            $this->query_num --;
        }
        
    }

    function display_error($error, $query = ''){ }
    function __destruct() {
        $this->db_id && mysqli_close($this->db_id);
        $this->db_id = false;

    }   
}

$db = new db;

Использую данный класс для работы с бд. Столкнулся с фильтрацией входящих данных, необходимо экранировать кавычки и прочие спецсимволы перед записью.

Запрос на запись

$db->query("INSERT INTO `u` (`key_p`, `var`) VALUES ('{$_GET['f']}', '{$_POST['f']}')");

Есть такая функция mysql_real_escape_string(), обертывать ее каждый раз и каждую переменную при каждом запросе. Весьма накладно...

Правильно будет если написать дополнительную функцию в классе для обновления и записи.

Как это лучше сделать? Придется переписать все запросы, полагаю так делать:

$db->insert('table', ['key_p' => $_GET['f'], 'var' => $_POST['f']]);

Блин еще тут говнокод старый...

Как подключение к базе данных, перенести в __construct? Толком не смог разобраться, все ошибки php кидало, так и оставил...

query будет для select, добавляю insert и update...


Ответы (0 шт):