Работа с запросами, запись в бд
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...