[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обертка Mysqli
Страницы: 1, 2, 3, 4, 5, 6
Игорь_Vasinsky
синглтон - создаст только один экземпляр класса - что не даст плодить кучу экземпляров
статичный класс - вообще не создаётся объект

вот тут есть мнение http://irbis-school.com/blog/full/31
а так - вот http://goo.gl/IsCJVc

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
volter9
Whiskas
Цитата
А, если конструктор понадобиться для другого?

Как это понять? Класс зависит от mysqli класса и Вы хотите вдруг использовать другой класс класс, так? Тогда у вас два варианта:
1. Убрать type hint в аргументе, и надеятся на то что у разных классов одинаковые методы и порядок аргументов.
2. Создать интерфейс для БД классов и указать тип в конструкторе первого аргумента интерфейсу который Вы создали (для БД).
Цитата
И, чем же всё таки плох global? Ведь намного проще влепить global $mysqli, чем создавать доп.классы.

Сам по себе глобал не плох, но проблема в том что вы хотите использовать ООП. Т.е. ООП + глобал = не очень хорошая связка. Глобал создаст вам зависимость от той $mysqli переменной, а вдруг это переменная не будет существовать или что еще хуже будет другим значением, у Вас появятся куча ошибок если вдруг нечаянно перезапишите переменную + класс будет сложнее трестировать и будет менее гибче.
По этому глобал с ООП и классами лучше не использовать.

_____________
Мой блог
kaww
Еще немного брошу на вентилятор.
Почему синглтон - это плохо
http://rsdn.ru/forum/design/2615563.flat#2615563
true way https://ru.wikipedia.org/wiki/%D0%92%D0%BD%...%81%D1%82%D0%B8
Игорь_Vasinsky
kaww
))
я лично клал на Single Responsibility Principle, думаю ТС тоже.


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
Класс обёртка для mysqli
    /**
* Класс обёртка для mysqli
*/

class DB{
/**
* для внутреннего пользования, хранить объект коннекта к БД
*/

protected static $mysqli;
/**
* array собирает все ошибки при работе с БД
*/

public static $errors = array();

/**
* коннект к ДБ
*
@params string
*
@params string
*
@params string
*
@params string
*
@params string
*
*
@return mixed дескриптор соединения|bool false
*/

public function connect($host, $usr, $pass, $db, $charset = 'utf8'){


$mysqli = new mysqli($host, $usr, $pass, $db);

if ($mysqli->connect_error){
self::$errors[] = $mysqli->connect_error;
return false;
}
else{
$mysqli->set_charset($charset);

self::$mysqli = $mysqli;

return $mysqli;
}
}

/**
* обёртка для real_escape_string
*
@param string
*/

public static function escape($data){
return self::$mysqli->real_escape_string($data);
}

/**
* выполняет запрос в БД по предоставленному SQL
*
@param string
*
@return mixed db result|bool
*/

public static function query($sql){
$res = self::$mysqli->query($sql);
if(!$res){
self::$errors[] = self::$mysqli->error;
return false;
}
}


/**
* Возвращает массив после SELECT
*
@param string
*
@param string assoc|num|both
*
@return array
*/

public function ReturnData($sql, $type='assoc'){

$query = self::$mysqli->query($sql);

if(!$query){
self::$errors[] = self::$mysqli->error;
return false;
}
else{
switch($type){
case 'assoc' : $res = $query->fetch_all(MYSQLI_ASSOC); break;
case 'num' : $res = $query->fetch_all(MYSQLI_NUM); break;
case 'both' : $res = $query->fetch_all(MYSQLI_BOTH); break;
default : $res = $query->fetch_all(MYSQLI_ASSOC); break;
}

return $res;
}
}

/**
* Возвращает массив, каждый жлемент которого - объект
*
@param string
*
@param string
*
@return array
*/

public function ReturnObjects($sql, $className='stdClass'){
$query = self::$mysqli->query($sql);

if(!$query){
self::$errors[] = self::$mysqli->error;
return false;
}
else{
$result = array();

while($row = $query->fetch_object()){
$result[] = $row;
}

return $result;
}
}

/**
* Обёртка для мультизапроса
*
@param string
*
@return mixed db result|bool false
*/

public static function multyQuery($sql){
$query = self::$mysqli->multi_query($sql);

if(!$query){
self::$errors[] = self::$mysqli->error;
return false;
}
else{
$result = $query;
$query->free_result();
return $result;
}
}

/**
* Получает последний id записи, после запросов insert, update
*
@return int
*/

public function lastInsertId(){
return self::$mysqli->lastInsertId();
}

}


как использовать

define('DEBUG', true);
define('CRASHTEXT', 'Сайт временно недоступен!');

//Не использованы константы, чтобы можно было быстро создавать коннекты для разных бд или пользователей
$conn = DB::connect('localhost', 'root', '672848', 'belle');

if(!$conn){
//В режиме отладки - мониторим ошибки
if(DEDUG){
foreach(DB::$errors as $k=>$e){
echo $e.'<br/>';
}
}

//в продакшн версии - выведем шаблон текста для поситителей
else{
exit(CRASHTEXT);
}
}



$res = DB::ReturnData('select * from users_belle', 'assoc');
echo '<pre>' . print_r($res, 1) . '</pre>';

$res = DB::ReturnData("select * from users_belle where uname='".DB::escape($_GET['name'])."'", 'assoc');
echo '<pre>' . print_r($res, 1) . '</pre>';

$res = DB::ReturnObjects('select * from users_belle');
echo '<pre>' . print_r($res, 1) . '</pre>';

$result = DB::query("insert into table (name) values ('".DB::escape($name)."')");

if($result != false){
//продолжаем
}


Вообще, изначально обертка подразумевала упрощённый доступ к mysql_real_escape_string() - методом DB::escape()
всё остальное возможно разместить и в базовой модели, как общие методы для всех дочерних моделей

но для тебя - запихал всё сюда.

в классе использованы более-менее распространённые методы для работы с БД - всё остальное можно допихивать по настроению.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.