[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс для работы с БД
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
Astin
Всем привет. На досуге решил поковырять к класс для работы с БД.
За основу взял класс twina

Хотел в классе создать методы для разных запросов.
Написал методы:
1 Подготовка SQL-запроса для безопасного выполнения

2 Выполняет запрос SQL и возвращает целый результат
3 Извлекает одну переменную из таблицы
4 Извлекает один столбец из базы данных
5 Извлекает все данные из одной колонки

Методы со 2 по 5 написаны в двух вариантах.

Мне очень будет полезна ваша критика и советы по этому классу

Плюс какой из методов в двойном варианте лучше использовать, к примеру 2 вариант имеет
два метода, один без внутреннего построения запроса, а второй с внутренним построением запроса и какой лучше, и может где есть ошибки

В общем вот


class DB
{
static $link;
static $count = 0;

//=======================================================================
// Подключение к БД


public static function connect($dbhost, $dbuser, $dbpass, $dbname)
{// @TODO Change the data connection
@self::$link = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME)
or die('No connect (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
// @TODO Change the encoding
mysqli_set_charset(self::$link, 'utf8');
}

//=======================================================================
// Выполняем запрос к БД


public static function Query($sql, $print = false)
{
self::$count++;

$result = mysqli_query(self::$link, $sql);

// @TODO Remove the following lines when in production mode
// ..............................................

if($result === false || $print === 1)
{
$error = mysqli_error(self::$link);
$trace = debug_backtrace();
$out = array(1 => '');

if(!empty($error))
preg_match("#'(.+?)'#is", $error, $out);

$head = $error ? '<b style="color:red">MySQL error: </b><br>
<b style="color:green">'
. $error .'</b><br><br>':NULL;

$error_log = date("Y-m-d h:i:s") .' '. $head .'
<b>Query: </b><br>
<pre><span style="color:#990099">'

. str_replace($out[1], '<b style="color:red">'. $out[1] .'</b>', $trace[0]['args'][0])
.
'</pre></span><br><br>
<b>File: </b><b style="color:#660099">'
. $trace[0]['file'] .'</b><br>
<b>Line: </b><b style="color:#660099">'
. $trace[0]['line'] .'</b>';
die($error_log);
}
else
// ..............................................

return $result;
}
//=======================================================================

//=======================================================================
// Экранируем данные

public static function escape($data) {
if(is_array($data))
$data = array_map('self::escape', $data);
else
$data = mysqli_real_escape_string(self::$link, $data);
return $data;
}
//=======================================================================
// Получаем номер добавленной записи

public static function insertId() {

return mysqli_insert_id(self::$link);
}
//=======================================================================
/* Подготовка SQL-запроса для безопасного выполнения
* Эти директивы могут использоваться в строке запроса:
* %d (integer), %f (float), %s (string), %% (никаких аргументов не требуется)
*
* @param string $query - Запрос
* @param mixed $args,.... - Дополнительные переменные для замены в заполнителя запроса
*
* 1. sql = "SELECT * FROM table WHERE `colum` = %s
* DB::prepare( sql, 'foo' );
*
* 2. sql = "SELECT * FROM table WHERE `colum` = %s AND `field` = %d"
* DB::prepare( sql, 'foo', 23 );
*/

public static function prepare( $query, $args ) {
if ( is_null( $query ) )
return;

$args = func_get_args();
array_shift( $args );
// If args were passed as an array (as in vsprintf), move them up
if ( isset( $args[0] ) && is_array($args[0]) )
$args = $args[0];
$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
$args = DB::escape($args);

return @vsprintf( $query, $args );
}
/////////////////////////////////////////////////////////////////////////
////////// Функции без внутреннего построения запроса ///////////
/////////////////////////////////////////////////////////////////////////

/* Выполняет запрос SQL и возвращает целый результат SQL
* @param string $table - Таблица с которой брать данные
* @param array $where - Условие для выбора из таблицы (по умолчанию пустое)
* Если передана строка, то она обрабатывается mysqli_real_escape_string
*
* 1. $where = array('colum' => 'data'); DB::getResults( 'table', $where );
* SELECT * FROM `table` WHERE `colum` = 'data'
*
* 2. $where = array('colum' => 'data', 'colum1' => 'data1'); DB::getResults( 'table', $where );
* SELECT * FROM `table` WHERE `colum` = 'data' AND `colum1` = 'data1'
*
* 3. DB::getResults( 'table' );
* SELECT * FROM `table`
*
* Результат - возвращает массив
* Пример: $res = DB::getResults( 'table' );
* foreach( $res as $value )
* echo $value['colum'];
*/

public static function get_results( $query = null ) {

if ( $query ) {
$res = self::Query( $query );
} else {
return null;
}

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
while( $row = mysqli_fetch_assoc($res) ) {
$rv[] = $row;
}
}

// Освобождаем ресурсы
mysqli_free_result($res);

// Возвращаем результат
return $rv;
}
//=======================================================================
/* Извлекает одну переменную из таблицы
* @param string $query - Запрос
* @param int $x = Необязательный. Столбец значения для возврата.По умолчанию 0
*
* 1. DB::get_var( "SELECT `colum` FROM `table`" );
* или DB::get_var( "SELECT `colum` FROM `table` WHERE `colum` = 'data'" );
*
* 2. DB::get_var( "SELECT * FROM `table`", 2 );
* или DB::get_var( "SELECT * FROM `table` WHERE `colum` = 'data'", 2 );
*
* Пример: $res = DB::get_var( "SELECT `colum` FROM `table` WHERE `colum` = 'data'" );
* echo $res;
*/

public static function get_var( $query = null, $x = 0 ) {

if ( $query ) {
$res = self::Query( $query );
}

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
$row = mysqli_fetch_row($res);

if( $row ) {
$rv = $row[$x];
}
}

// Освобождаем ресурсы
mysqli_free_result($res);

// Если есть значение возвращаем результат иначе null
return ( isset($rv) && $rv !== '' ) ? $rv : null;
}
//=======================================================================
/* Извлекает один столбец из базы данных
* @param string $query - Запрос
* @param int $x = Необязательный. Столбец значения для возврата.По умолчанию 0
*
* 1. DB::get_col( "SELECT `colum` FROM `table`" );
* или DB::get_col( "SELECT `colum` FROM `table` WHERE `colum` = 'data'" );
*
* 2. DB::get_col( "SELECT * FROM `table`", 2 );
* или DB::get_col( "SELECT * FROM `table` WHERE `colum` = 'data'", 2 );
*
* Пример: $res = DB::get_col( "SELECT `colum` FROM `table`" );
* foreach( $res as $value )
* echo $value;
*/

public static function get_col( $query = null , $x = 0 ) {

$rv = array();
if ( $query ) {
$res = self::Query( $query );
}

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
while( $row = mysqli_fetch_row($res) ) {
$rv[] = $row[$x];
}
}

// Освобождаем ресурсы
mysqli_free_result($res);

// Возвращаем результат
return $rv;
}

//=======================================================================
/* Извлекает все данные из одной колонки базы данных
* @param string $query - Запрос
*
* DB::get_col( "SELECT * FROM `table` WHERE `colum` = 'data'" );
*
* Пример: $res = DB::get_col( "SELECT * FROM `table` WHERE `colum` = 'data'" );
*
* echo $res['colum']; echo $res['colum2'];
*/

public static function get_row( $query = null ) {

$rv = false;

if ( $query ) {
$res = self::Query( $query );
} else {
return null;
}


// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
$row = mysqli_fetch_assoc($res);

if( $row ) {
$rv = $row;
}
}

// Освобождаем ресурсы
mysqli_free_result($res);

// Возвращаем результат
return $rv;
}

/////////////////////////////////////////////////////////////////////////
////////// Функции с внутренним построением запроса ///////////
/////////////////////////////////////////////////////////////////////////

//=======================================================================
/* Выполняет запрос SQL и возвращает целый результат SQL
* @param string $table - Таблица с которой брать данные
* @param array $where - Условие для выбора из таблицы (по умолчанию пустое)
* Если передана строка, то она обрабатывается mysqli_real_escape_string
*
* 1. $where = array('colum' => 'data'); DB::getResults( 'table', $where );
* SELECT * FROM `table` WHERE `colum` = 'data'
*
* 2. $where = array('colum' => 'data', 'colum1' => 'data1'); DB::getResults( 'table', $where );
* SELECT * FROM `table` WHERE `colum` = 'data' AND `colum1` = 'data1'
*
* 3. DB::getResults( 'table' );
* SELECT * FROM `table`
*
* Результат - возвращает массив
* Пример: $res = DB::getResults( 'table' );
* foreach( $res as $value )
* echo $value['colum'];
*/

public static function getResults( $table = '', $where = array() ) {

$rv = array();
$condition = array();
$conditions = '';

if( !empty($where) && !is_array($where) ) {
return false;
}
if( empty($table) ) {
return false;
}

if( !empty($where) ) {

foreach( $where as $field => $value ) {

if( is_null( $value ) ) {
$condition[] = "`$field` IS NULL";
continue;
}
if( is_string($value) ) {
$values = "'".self::escape($value)."'";
} else {
$values = $value;
}
$condition[] = "`$field` = $values";
}
$conditionw = implode( ' AND ', $condition );
$conditions = " WHERE $conditionw";
}

$sql = "SELECT * FROM `". PREFIX ."$table`". $conditions;

// Пытаемся получить данные
if( $res = self::Query($sql) ) {

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
while( $row = mysqli_fetch_assoc($res) ) {
$rv[] = $row;
}
}

// Освобождаем ресурсы
mysqli_free_result($res);
}
// Возвращаем результат
return $rv;
}

//=======================================================================
/* Извлекаем одну переменную из таблицы
* @param string $colum - Столбец с которого брать данные
* @param string $table - Таблица с которой брать данные
* @param array $where - Условие для выбора из таблицы (по умолчанию пустое)
* Если передана строка, то она обрабатывается mysqli_real_escape_string
*
* 1. $where = array('colum' => 'data'); DB::getVar( 'colum', 'table', $where );
* SELECT `colum` FROM `table` WHERE `colum` = 'data' LIMIT 1
*
* 2. $where = array('colum' => 'data', 'colum1' => 'data1'); DB::getVar( 'colum', 'table', $where );
* SELECT `colum` FROM `table` WHERE `colum` = 'data' AND `colum1` = 'data1' LIMIT 1
*
* 3. DB::getVar( 'colum', 'table' );
* SELECT `colum` FROM `table` LIMIT 1
*
* Результат - возвращает данные с запрошеного столбца
* Пример: $res = DB::getVar( 'colum', 'table', $where );
* echo $res;
*/

public static function getVar( $colum = '', $table = '', $where = array() ) {

$rv = false;
$condition = array();
$conditions = '';

if( !empty($where) && !is_array($where) ) {
return false;
}
if( empty($colum) || empty($table) ) {
return false;
}

if( !empty($where) ) {

foreach( $where as $field => $value ) {

if( is_null( $value ) ) {
$condition[] = "`$field` IS NULL";
continue;
}
if( is_string($value) ) {
$values = "'".self::escape($value)."'";
} else {
$values = $value;
}
$condition[] = "`$field` = $values";
}
$conditionw = implode( ' AND ', $condition );
$conditions = " WHERE $conditionw";
}

$sql = "SELECT `$colum` FROM `". PREFIX ."$table`". $conditions ." LIMIT 1";

// Пытаемся получить данные
if( $res = self::Query($sql) ) {

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
$row = mysqli_fetch_assoc($res);

if( $row ) {
$rv = $row[$colum];
}
}

// Освобождаем ресурсы
mysqli_free_result($res);
}
// Возвращаем результат
return $rv;
}

//=======================================================================
/* Извлекает один столбец из базы данных
* @param string $colum - Столбец с которого брать данные
* @param string $table - Таблица с которой брать данные
* @param array $where - Условие для выбора из таблицы (по умолчанию пустое)
* Если передана строка, то она обрабатывается mysqli_real_escape_string
*
* 1. $where = array('colum' => 'data'); DB::getCol( 'colum', 'table', $where );
* SELECT `colum` FROM `table` WHERE `colum` = 'data'
*
* 2. $where = array('colum' => 'data', 'colum1' => 'data1'); DB::getCol( 'colum', 'table', $where );
* SELECT `colum` FROM `table` WHERE `colum` = 'data' AND `colum1` = 'data1'
*
* 3. DB::getCol( 'colum', 'table' );
* SELECT `colum` FROM `table`
*
* Результат - возвращает все данные из одного столбца
* Пример: $res = DB::getCol( 'colum', 'table' );
* foreach( $res as $value )
* echo $value;
*/

public static function getCol( $colum = '', $table = '', $where = array() ) {

$rv = array();
$condition = array();
$conditions = '';

if( !empty($where) && !is_array($where) ) {
return false;
}
if( empty($colum) || empty($table) ) {
return false;
}
if( empty($table) ) {
return false;
}

if( !empty($where) ) {

foreach( $where as $field => $value ) {

if( is_null( $value ) ) {
$condition[] = "`$field` IS NULL";
continue;
}
if( is_string($value) ) {
$values = "'".self::escape($value)."'";
} else {
$values = $value;
}
$condition[] = "`$field` = $values";
}
$conditionw = implode( ' AND ', $condition );
$conditions = " WHERE $conditionw";
}

$sql = "SELECT `$colum` FROM `". PREFIX ."$table`". $conditions;

// Пытаемся получить данные
if( $res = self::Query($sql) ) {

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
while( $row = mysqli_fetch_assoc($res) ) {
$rv[] = $row[$colum];
}
}

// Освобождаем ресурсы
mysqli_free_result($res);
}
// Возвращаем результат
return $rv;
}

//=======================================================================
/* Извлекает все данные из одной колонки базы данных
* @param string $table - Таблица с которой брать данные
* @param array $where - Условие для выбора из таблицы (по умолчанию пустое)
* Если передана строка, то она обрабатывается mysqli_real_escape_string
*
* 1. $where = array('colum' => 'data'); DB::getRow( 'table', $where );
* SELECT * FROM `table` WHERE `colum` = 'data'
*
* 2. $where = array('colum' => 'data', 'colum1' => 'data1'); DB::getRow( 'table', $where );
* SELECT * FROM `table` WHERE `colum` = 'data' AND `colum1` = 'data1'
*
* Результат - возвращает все данные из одной колонки
* Пример: $res = DB::getRow( 'table', $where );
* echo $res['colum']; echo $res['colum2'];
*/

public static function getRow( $table = '', $where = array() ) {

$rv = false;
$condition = array();
$conditions = '';

if( !empty($where) && !is_array($where) ) {
return false;
}
if( empty($table) ) {
return false;
}

if( !empty($where) ) {

foreach( $where as $field => $value ) {

if( is_null( $value ) ) {
$condition[] = "`$field` IS NULL";
continue;
}
if( is_string($value) ) {
$values = "'".self::escape($value)."'";
} else {
$values = $value;
}
$condition[] = "`$field` = $values";
}
$conditionw = implode( ' AND ', $condition );
$conditions = " WHERE $conditionw";
}

$sql = "SELECT * FROM `". PREFIX ."$table`". $conditions;

// Пытаемся получить данные
if( $res = self::Query($sql) ) {

// Если есть результаты
if( mysqli_num_rows($res) ) {
// Используем их
$row = mysqli_fetch_assoc($res);

if( $row ) {
$rv = $row;
}
}

// Освобождаем ресурсы
mysqli_free_result($res);
}
// Возвращаем результат
return $rv;
}

//=======================================================================
// Общее кол-во изменненых строк в запросе


public static function AfdRows()
{
$data = mysqli_affected_rows(self::$link);

return $data;
}

//=======================================================================
function deprecated($function)
{
$trace = debug_backtrace();

exit('<strong style="color:red">Fatal error:</strong><br>'
.'Function <a href="http://php.net/'. $function .'">'. $function .'</a>'
.' is deprecated and has no analog in <br>'
.'<strong>'. $trace[0]['file'] .'</strong>'
.' on line <strong>'. $trace[0]['line'] .'</strong>'
);
}
}
Быстрый ответ:

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