[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обёртка для MySQLi
VladKamyshanov
Выкладываю обёртку для MySQLi, позволяющая упростить работу с базой данных. Для ГИГАНТСКИХ проектов нужно будет её расширить, но пользоваться вполне можно.

Выложу код а затем и инструкции.

Итак, код:

<?php

/**
*
@author VladKamyshanov
*/


class Database
{
protected static $mysqli;
protected static $stmt;
protected static $result;

public static function connect($host, $db, $user, $pass)
{
// Попытка соединится с базой данных
self::$mysqli = mysqli_connect($host, $user, $pass, $db);
// В случае ошибки - выводим сообщение
if (mysqli_connect_error())
{
// С помощью функции printf();
printf("Ooops... Connection error: %s\n", mysqli_connect_error());
exit();
}
}

public static function query()
{
// Получаем аргументы функции
$args = func_get_args();
// Если запрос не требует prepared statement вызываем simplyQuery
if (count($args) === 1) self::simplyQuery($args[0]);
// Если запрос требует preepared statement вызываем preparedStatementQuery
else self::preparedStatementQuery($args);

}
public static function numRows(){
// Количество строк в результате
return self::$result->num_rows;
}
public static function fetchRow(){
// Возвращает следующую строку в виде нумерованного списка
return self::$result->fetch_row();
}
public static function fetchAssoc(){
// Возвращает следующую строку в виде ассоциативного массива
return self::$result->fetch_assoc();
}
public static function affectedRows(){
// Возвращает количество строк, затронутых запросом
return self::$mysqli->affected_rows;
}
public static function insertId(){
// Возвращает последний вставленный id
return self::$mysqli->insert_id;
}


private static function simplyQuery($query){
// Подготавливаем выражение
self::$stmt = self::$mysqli->prepare($query);
// Выполняем
self::$stmt->execute();
// Пишем результат
self::$result = self::$stmt->get_result();
}
private static function preparedStatementQuery($args)
{
// Первый аргумент - шаблон запроса
$template = array_shift($args);
// Определяем тип каждого аргумента
foreach ($args as $k => $v)
{
if (is_int($v)) $types .= "i";
elseif (is_double($v)) $types .= "d";
elseif (is_string($v))$types .= "s";
elseif (is_null($v)){
$types .= "s";
$args[$k] = "";
}
}

// Добавляем информацию о типах аргументов в начало массива
array_unshift($args, $types);
// Подготавливаем запрос
self::$stmt = self::$mysqli->prepare($template);
// Биндим параметры
call_user_func_array(array(self::$stmt, 'bind_param'), self::getRefValues($args));
// Выполняем запрос
self::$stmt->execute();
// Записываем результат
self::$result = self::$stmt->get_result();
}
private static function getRefValues($args)
{
// Исправляем ошибки PHP 5.3+
if (strnatcmp(phpversion(), '5.3') >= 0)
{
$refs = array();
foreach ($args as $key => $value)
{
$refs[$key] = &$args[$key];
}
return $refs;
}
return $args;
}
}

?>


А теперь инструкции

Для подключения к базе данных используется конструкция:
Database::connect("хост","база данных","пользователь","пароль");


Запрос:
Запросы проходят через prepared statement
Database::query("INSERT INTO testtable VALUES(?,?,?,?)",null,name,surname,email);


Чтобы узнать количество затронутых запросом строк вызываем Database::affectedRows();
Database::query("INSERT INTO testtable VALUES(?,?,?,?)",null,name,surname,email);
if(Database::affectedRows()) echo "Успешно";
else echo "Ошибка";


Вкратце опишу остальные методы:

Database::numRows() - Возвращает кол-во строк в результирующем наборе
Database::fetchRow() - Возвращает следующую строку в виде нумерованного списка
Database::fetchAssoc() - Возвращает следующую строку в виде ассоциативного массива
Database::insertId() - Возвращает последний вставленный ID

Так как написал все это дело на скорую руку, затронул только основные потребности для работы с базой. Чем расширить данную обёртку. Пишите.

PS
Файл класса прикладываю к этому топику







Спустя 14 минут, 45 секунд (22.07.2012 - 19:36) AlmazDelDiablo написал(а):
А зачем всё в статике? Если мне, предположим, надо создать несколько соединений к разным базам данных — что мне делать?

Спустя 11 минут, 50 секунд (22.07.2012 - 19:47) VladKamyshanov написал(а):
Цитата
А зачем всё в статике? Если мне, предположим, надо создать несколько соединений к разным базам данных — что мне делать?


Всегда статика была ко мне близка) Но из этой ямы есть два пути.
1. Можно подделать так, чтоб можно было создавать объект класса
2. Хранить дескрипторы соединений в статическом свойстве обёртки(в массиве).

К примеру это
Database::connect("хост","база данных","пользователь","пароль"."флаг дескриптора");


Создавало бы в свойстве mysqli такое
array("Флаг"=>"Дескриптор");


А для запроса через определённый дескриптор добавлялся бы флаг после всех параметров

Как лучше сделать?


Спустя 35 минут, 56 секунд (22.07.2012 - 20:23) AlmazDelDiablo написал(а):
Лучше сделать нормальный класс, в котором через контруктор создается соединение с базой данных, без всяких лишних извращений.

А статические классы надо использовать там, где они нужны :)

Спустя 3 минуты, 25 секунд (22.07.2012 - 20:27) VladKamyshanov написал(а):
Цитата
Лучше сделать нормальный класс, в котором через контруктор создается соединение с базой данных, без всяких лишних извращений.


Положим мне нужен доступ к базе из разных объектов, как тогда быть. Постоянно перекидывать объект для работы с базой в качестве аргумента между другими обьектами? dry.gif

Спустя 40 минут, 58 секунд (22.07.2012 - 21:08) kamanch написал(а):
Объявить объект глобальным?

Спустя 45 минут, 37 секунд (22.07.2012 - 21:53) VladKamyshanov написал(а):
Цитата
Объявить объект глобальным?

По мне так это извращение полное...

Спустя 1 час, 6 минут, 54 секунды (22.07.2012 - 23:00) forza написал(а):
В вашей поделки не хватает паттерна одиночки (Singleton)
Прочитайте про него хотябы тут

Спустя 24 минуты, 5 секунд (22.07.2012 - 23:24) VladKamyshanov написал(а):
Цитата
В вашей поделки не хватает паттерна одиночки (Singleton)
Прочитайте про него хотябы тут


Про этот паттерн знал и раньше. Не могли бы вы подсказать как запихнуть его туда. Нам же нужна возможность подключение к разным базам.
Чего-то я не понимаю sad.gif

Спустя 54 минуты, 31 секунда (23.07.2012 - 00:19) SerginhoLD написал(а):
так проще:
$db = new MySQLi;


Нафига эта обертка?

Спустя 8 часов, 5 минут, 19 секунд (23.07.2012 - 08:24) forza написал(а):
Я думаю, в той статье Николай (или кто ее автор) подробно все описал. Обратите внимание на статическую функцию getInstance() и конструктор, а также на свойство $instance. И еще, столько строк, и нету обработчика ошибок sad.gif на кройняк or die(); после запроса.

Спустя 4 часа, 50 минут, 7 секунд (23.07.2012 - 13:14) VladKamyshanov написал(а):
Цитата
Обратите внимание на статическую функцию getInstance() и конструктор, а также на свойство $instance.

Пффф..... Запутался малёк) Свойство $instance статическое, и туда пишем дескриптор соединения(по сути это ведь new MySQLi). А что делать если соединений несколько. Пишем их туда в формате массива. А затем просто методом getInstance() возвращать нужное. Или как? unsure.gif

Цитата
И еще, столько строк, и нету обработчика ошибок  на кройняк or die(); после запроса.

Выложил тему специально для критики. Как будет всё сделано правильно так начну и обработчик писать

Быстрый ответ:

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