PHP класс для работы с MySQL

Сегодня я поделюсь сверхбыстрым и безопасным php классом для работы с базой данных MySQL. В нем есть готовые операторы, которые защитят ваши запросы и вам не нужно беспокоиться об SQL-инъекциях.
Создайте файл под названием db.php и добавьте в него следующий код:

<?php
class db {
    protected $connection;
	protected $query;
    protected $show_errors = TRUE;
    protected $query_closed = TRUE;
	public $query_count = 0;

	public function __construct($dbhost = 'localhost', $dbuser = 'root', $dbpass = '', $dbname = '', $charset = 'utf8') {
		$this->connection = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
		if ($this->connection->connect_error) {
			$this->error('Failed to connect to MySQL - ' . $this->connection->connect_error);
		}
		$this->connection->set_charset($charset);
	}

    public function query($query) {
        if (!$this->query_closed) {
            $this->query->close();
        }
		if ($this->query = $this->connection->prepare($query)) {
            if (func_num_args() > 1) {
                $x = func_get_args();
                $args = array_slice($x, 1);
				$types = '';
                $args_ref = array();
                foreach ($args as $k => &$arg) {
					if (is_array($args[$k])) {
						foreach ($args[$k] as $j => &$a) {
							$types .= $this->_gettype($args[$k][$j]);
							$args_ref[] = &$a;
						}
					} else {
	                	$types .= $this->_gettype($args[$k]);
	                    $args_ref[] = &$arg;
					}
                }
				array_unshift($args_ref, $types);
                call_user_func_array(array($this->query, 'bind_param'), $args_ref);
            }
            $this->query->execute();
           	if ($this->query->errno) {
				$this->error('Unable to process MySQL query (check your params) - ' . $this->query->error);
           	}
            $this->query_closed = FALSE;
			$this->query_count++;
        } else {
            $this->error('Unable to prepare MySQL statement (check your syntax) - ' . $this->connection->error);
        }
		return $this;
    }

	public function fetchAll($callback = null) {
	    $params = array();
        $row = array();
	    $meta = $this->query->result_metadata();
	    while ($field = $meta->fetch_field()) {
	        $params[] = &$row[$field->name];
	    }
	    call_user_func_array(array($this->query, 'bind_result'), $params);
        $result = array();
        while ($this->query->fetch()) {
            $r = array();
            foreach ($row as $key => $val) {
                $r[$key] = $val;
            }
            if ($callback != null && is_callable($callback)) {
                $value = call_user_func($callback, $r);
                if ($value == 'break') break;
            } else {
                $result[] = $r;
            }
        }
        $this->query->close();
        $this->query_closed = TRUE;
		return $result;
	}

	public function fetchArray() {
	    $params = array();
        $row = array();
	    $meta = $this->query->result_metadata();
	    while ($field = $meta->fetch_field()) {
	        $params[] = &$row[$field->name];
	    }
	    call_user_func_array(array($this->query, 'bind_result'), $params);
        $result = array();
		while ($this->query->fetch()) {
			foreach ($row as $key => $val) {
				$result[$key] = $val;
			}
		}
        $this->query->close();
        $this->query_closed = TRUE;
		return $result;
	}

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

    public function numRows() {
		$this->query->store_result();
		return $this->query->num_rows;
	}

	public function affectedRows() {
		return $this->query->affected_rows;
	}

    public function lastInsertID() {
    	return $this->connection->insert_id;
    }

    public function error($error) {
        if ($this->show_errors) {
            exit($error);
        }
    }

	private function _gettype($var) {
	    if (is_string($var)) return 's';
	    if (is_float($var)) return 'd';
	    if (is_int($var)) return 'i';
	    return 'b';
	}
}
?>

Для соединения с базой данных, используйте следующий код:

include 'db.php';

$dbhost = 'localhost'; // Сервер базы данных, в большинстве случаях это localhost
$dbuser = 'user'; // Пользователь базы данных
$dbpass = ''; // Пароль от базы данных
$dbname = 'mydatabase'; // Название базы данных

$db = new db($dbhost, $dbuser, $dbpass, $dbname);

Получение записи из базы данных:

$account = $db->query('SELECT * FROM users WHERE username = ? AND password = ?', 'test', 'test')->fetchArray();
echo $account['name'];

Пример получения записей с использованием массива:

$account = $db->query('SELECT * FROM users WHERE username = ? AND password = ?', array('test', 'test'))->fetchArray();
echo $account['name'];

Пример получения нескольких записей:

$accounts = $db->query('SELECT * FROM users')->fetchAll();

foreach ($accounts as $account) {
	echo $account['name'] . '<br>';
}

Пример без сохранения данных в массив. Особенно актуально для больших объемов данных:

$db->query('SELECT * FROM users')->fetchAll(function($account) {
    echo $account['name'];
});

Для разрыва цикла используйте:

return 'break'; 

Пример для получения количества строк:

$accounts = $db->query('SELECT * FROM users');
echo $accounts->numRows();

Пример записи в базу данных:

$insert = $db->query('INSERT INTO users (username, password, email, name) VALUES (?,?,?,?)', 'test', 'test', 'test@gmail.com', 'Test');

Пример получения количества запросов в базу данных:

echo $db->query_count;

Пример получения последнего ID записи:

echo $db->lastInsertID();

Пример разрыва связи с базой данных:

$db->close();

Класс для базы данных использует расширение MySQLi, которое встроено в php версии 5.0 и выше. Если у вас версия php ниже, то вам нужно установить mysqlnd.

Комменарии

Написать комментарий

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Защита от роботов