PHP Class MySQLi — СУБД MySQL

в 9:36, , рубрики: Песочница

На сегодняшний день существует множество статей с готовыми решениями, как работать с СУБД MySQL. Однако, почти в каждой статье приводятся примеры процедурного вызова функций. Начиная с php-версии 5.5.0 расширение MySQL будет удалено из сборки и вообще, это расширение уже устарело. Вместо него будем использовать расширение MySQLi в ООП.
Данная статья является готовым решением для работы с СУБД.

При разработке очередного проекта, я столкнулся с тем, что в каждом методе следующего написанного класса с обращением к СУБД, мне нужно было обращаться к классу работы с СУБД, для очередного select, insert, update и т.п., то есть тягать в функции параметра global с объявленной переменной вне класса. А устанавливать новое соединение с базой — слишком затратно, да и не выгодно, только ресурсы системы тратить. И решил написать переписать класс работы с базой, с сохранением экземпляра класса, чтобы обращаться сразу напрямую к методам класса из любой области видимости переменной.

Для просмотра исходника смотрим под кат.

Для инициализации класса достаточно создать экземпляр класса.
Переменную $db не следует удалять после объявления, т.к. ее адрес используется для дальнейшей работы со статическими методами класса.

<?php

	include 'DB.class.php';

	try {
		$db = new DB('localhost:3306', 'user', 'password', 'dbname');
	} catch (Exception $e) {
		exit($e->getMessage());
	}

?>

Ниже приведу содержимое класса DB.class.php

<?php

<?php
class DB {

	private static $db 		= false;
	private static $mysqli 	= false;

	function DB($address, $user, $password, $dbname) {
		self::$db = &$this;
		list($host, $port) = explode(':', $address);

		$mysqli = new mysqli($host, $user, $password, $dbname, $port, $socket);

		if ($mysqli->connect_error)
			throw new Exception("Connect failed: %s", $mysqli->connect_error);

		self::$mysqli = &$mysqli;
		self::$mysqli->query('SET NAMES utf8 COLLATE utf8_general_ci');
	}
	
	public static function GetRows($rows, $single = false) {
		$result = array();

		if ($rows === false)
			return $result;

		if ($single) 
			return $rows->fetch_assoc();

		while ($row = $rows->fetch_assoc())
			array_push($result, $row);

		$rows->free();
		return $result;
	}

	public static function Select($sql, $single = false) {
		$result = self::$mysqli->query($sql);
		return self::$db->GetRows($result, $single);
	}
	
	public static function Update($data, $table, $where) {
		$sets = '';
		foreach ($data as $column => $value) {
			$sets .= $sets ? ', ' : '';
			$sets .= "`$column` = '$value'";			
		}
		$sql = "UPDATE $table SET $sets WHERE $where";
		self::$mysqli->query($sql);
	}
	
	public static function Insert($data, $table) {
		$columns 	= "";
		$values 	= "";
		foreach ($data as $column => $value) {
			$columns 	.= $columns ? ', ' : '';
			$columns 	.= "`$column`";
			$values 	.= $values 	? ', ' : '';
			$values 	.= "'$value'";
		}
		$sql = "INSERT INTO $table ($columns) VALUES ($values)";
		self::$mysqli->query($sql);
		return self::$mysqli->insert_id;
	}
	
	public static function CountRows($table, $request = false) {
		$sql = "SELECT COUNT(*) FROM $table ";
		$sql .= $request ? $request : '';
		$result = self::$mysqli->query($sql);
		$count = $result->fetch_array();
		$result->free();
		return $count[0];

	}

	public static function Query($sql) {
		return self::$mysqli->query($sql);
	}
	
	public static function Delete($table, $where) {
		$sql = "DELETE FROM $table WHERE $where";
		self::$mysqli->query($sql);
	}

	public static function Close() {
		self::$mysqli->close();
	}

	function __destruct() {
		self::$db->Close();
	}

}

?>

Подробнее о методах MySQLi на http://www.php.net/mysqli
Репозиторий на github https://github.com/ntvsx193/php-db

Автор: ntvsx193

Источник

Поделиться

* - обязательные к заполнению поля