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



<?php

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

//Необходимо ли проверять текстовые поля в текущем запросе
protected static $check_current_query = true;

//Флаг, чтобы мы не сталкивались с проблемами рекурсии при проверке сортировки
private static $checking_collation = false;

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


public static function connect( $dbhost, $dbuser, $dbpass, $dbname ) {
// @TODO Change the data connection
@self::$link = new mysqli( $dbhost, $dbuser, $dbpass, $dbname )
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( isset($args[0]) && is_array($args[0]) )
$args = $args[0];
$query = str_replace( "'%s'", '%s', $query ); // убираем одинарные кавычки
$query = str_replace( '"%s"', '%s', $query ); // убираем двойные кавычки
$query = preg_replace( '|(?<!%)%f|' , '%F', $query );
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query );

$args = self::escape($args);

return @vsprintf( $query, $args );
}
//=======================================================================
/* Вставляем в таблицу INSERT
*
* 1. DB::insert('table', array('column' => 'foo', 'field' => 'one'))
* Если не указан $format, то все значения обработаются как строки
*
* 2. DB::insert('table', array('column' => 'foo', 'field' => 1), array('%s', '%d'))
*
*/

public static function insert( $table, $data, $format = null ) {
return self::insert_helper( $table, $data, $format, 'INSERT' );
}
//=======================================================================
/* Замена данных REPLACE
*
* 1. DB::replace('table', array('column' => 'foo', 'field' => 'one'))
* Если не указан $format, то все значения обработаются как строки
*
* 2. DB::replace('table', array('column' => 'foo', 'field' => 1), array('%s', '%d'))
*
*/

public static function replace( $table, $data, $format = null ) {
return self::insert_helper( $table, $data, $format, 'REPLACE' );
}

//=======================================================================
/* Вспомогательная функция для REPLACE и INSERT
*
* @see DB::prepare()
* @param string $table - Таблица
* @param array $data - Данные для вставки (column => value).
* @param array|string $format - Массив форматов array('%d', '%f', '%s').
* Если формат не установлен, все значения $data будут
* обработаны как строки.
* Форматы '%d', '%f', '%s' (integer, float, string).
*
*/

public static function insert_helper( $table, $data, $format = null, $type = 'INSERT' ) {

if ( ! is_array($data) ) {
return false;
}

$formats = $values = array();

$type = strtoupper($type);

$data = self::process_formats($data, $format);
if( false === $data ) {
return false;
}

foreach ( $data as $value ) {
if ( is_null( $value['value'] ) ) {
$formats[] = 'NULL';
continue;
}

$formats[] = $value['format'];
$values[] = $value['value'];
}

$fields = '`' . implode( '`, `', array_keys( $data ) ) . '`';
$formats = implode( ', ', $formats );

$sql = "$type INTO `$table` ($fields) VALUES ($formats)";

self::$check_current_query = false;
self::Query( self::prepare($sql, $values) );

$id = self::insertId();

return $id;
}

//=======================================================================
/* Обновление строк в таблице
*
* @see DB::update()
* @param string $table - Таблица
* @param array $data - Данные для вставки (column => value).
* @param array $where - Массив WHERE clauses (column => value).
* @param array|string $format - Массив форматов array('%d', '%f', '%s').
* Если формат не установлен, все значения $data будут
* обработаны как строки.
* Форматы '%d', '%f', '%s' (integer, float, string).
*
* 1. DB::update('table', array('column' => 'one', 'field' => 'two'), array( 'id' => 1 ))
* Если не указан $format или $where_format, то все значения обработаются как строки
*
* 2. DB::update('table', array('column' => 'one', 'field' => 223), array( 'id' => 1 ), array('%s', '%d'), array('%d'))
*
*/

public static function update( $table, $data, $where, $format = null, $where_format = null ) {

if( ! is_array($data) || ! is_array($where) ) {
return false;
}

$data = self::process_formats($data, $format);
if( false === $data ) {
return false;
}

$where = self::process_formats($where, $where_format);
if( false === $where ) {
return false;
}

$fields = $conditions = $values = array();

foreach( $data as $field => $value ) {
if( is_null($value['value']) ) {
$fields[] = " `$field` = NULL";
continue;
}

$fields[] = " `$field` = " . $value['format'];
$values[] = $value['value'];
}

foreach( $where as $field => $value ) {
if( is_null($value['value']) ) {
$conditions[] = "`$field` IS NULL";
continue;
}

$conditions[] = "`$field` = ". $value['format'];
$values[] = $value['value'];
}

$fields = implode(', ', $fields);
$conditions = implode(' AND ', $conditions);

$sql = "UPDATE `$table` SET $fields WHERE $conditions";

self::$check_current_query = false;
return self::Query( self::prepare($sql, $values) );
}

//=======================================================================
/* Удвление строк в таблице
*
* @see DB::deletes()
* @param string $table - Таблица
* @param array $where - Массив WHERE clauses (column => value).
* @param array|string $where_format - Массив форматов array('%d', '%f', '%s').
* Если формат не установлен, все значения $data будут
* обработаны как строки.
* Форматы '%d', '%f', '%s' (integer, float, string).
*
* 1. DB::deletes('table', array( 'id' => 1 ))
* Если не указан $where_format, то все значения обработаются как строки
*
* 2. DB::deletes('table', array( 'id' => 1 ), array('%d'))
*
*/

public static function deletes( $table, $where, $where_format = null ) {

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

$where = self::process_formats($where, $where_format);
if( false === $where ) {
return false;
}

$conditions = $values = array();

foreach( $where as $field => $value ) {
if( is_null($value['value']) ) {
$conditions[] = "`$field` IS NULL";
continue;
}

$conditions[] = "`$field` = " . $value['format'];
$values[] = $value['value'];
}

$conditions = implode(' AND ', $conditions);

$sql = "DELETE FROM `$table` WHERE $conditions";

self::$check_current_query = false;
return self::Query( self::prepare($sql, $values) );
}

//=======================================================================
/* Подготавливает массивы value/format
*
* @param array $data - Массив fields -> values.
* @param mixed $format - Форматы для сопоставления значений в $data.
*/

protected static function process_formats( $data, $format ) {

$formats = $original_formats = (array)$format;

$field_types = array();

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

$value = array(
'value' => $value,
'format' => '%s',
);


if( ! empty($format) ) {
$value['format'] = array_shift( $formats );

if( ! $value['format'] ) {
$value['format'] = reset( $original_formats );
}
}
elseif( isset($field_types[ $field ]) ) {
$value['format'] = $field_types[ $field ];
}

$data[ $field ] = $value;
}

return $data;
}
/////////////////////////////////////////////////////////////////////////
////////// Функции без внутреннего построения запроса ///////////
/////////////////////////////////////////////////////////////////////////

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

public static function get_results( $query = null ) {

$rv = array();

if( self::$check_current_query && self::check_safe_collation($query) ) {
self::$check_current_query = false;
}

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);
* ======================================================
* Пример с методом DB::prepare:
*
* DB::get_var(DB::prepare("SELECT `colum` FROM `table` WHERE `colum` = %s", 'data'));
* ======================================================
*
* Пример: $res = DB::get_var("SELECT `colum` FROM `table` WHERE `colum` = 'data'");
* echo $res;
*/

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

$rv = false;

if( self::$check_current_query && self::check_safe_collation($query) ) {
self::$check_current_query = false;
}

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);
* ======================================================
* Пример с методом DB::prepare:
*
* DB::get_col(DB::prepare("SELECT * FROM `table` WHERE `colum` = %s", 'data'));
* ======================================================
*
* Пример: $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( self::$check_current_query && self::check_safe_collation($query) ) {
self::$check_current_query = false;
}

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 $table - Таблица с которой брать данные
* @param array $where - Условие для выбора из таблицы (по умолчанию пустое)
* Если передана строка, то она обрабатывается mysqli_real_escape_string
*
* 1. DB::get_row("SELECT * FROM `table` WHERE `colum` = 'data'");
* ======================================================
*
* Пример с методом DB::prepare:
*
* DB::get_row(DB::prepare("SELECT * FROM `table` WHERE `colum` = %s", 'data'));
* ======================================================
*
* Результат - возвращает все данные из одной колонки
* Пример: $res = DB::get_row("SELECT * FROM `table` WHERE `colum` = 'data'");
* echo $res['colum']; echo $res['colum2'];
*/

public static function get_row( $query = null ) {

$rv = false;

if( self::$check_current_query && self::check_safe_collation($query) ) {
self::$check_current_query = 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)."'";
}
elseif( is_int($value) ) {
$values = (int)$value;
}
elseif( filter_var($value, FILTER_VALIDATE_INT) ) {
$values = (int)$value;
}
else {
$values = $value;
}

$condition[] = "`$field` = $values";
}
$condition = implode(' AND ', $condition);
$conditions = " WHERE $condition";
}

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

if( self::$check_current_query && self::check_safe_collation($sql) ) {
self::$check_current_query = false;
}

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

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

// Если есть результаты
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
*
* Результат - возвращает данные с запрошеного столбца
* Пример: $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) || empty($where) ) {
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)."'";
}
elseif( is_int($value) ) {
$values = (int)$value;
}
elseif( filter_var($value, FILTER_VALIDATE_INT) ) {
$values = (int)$value;
}
else {
$values = $value;
}

$condition[] = "`$field` = $values";
}
$condition = implode( ' AND ', $condition );
$conditions = " WHERE $condition";
}

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

if( self::$check_current_query && self::check_safe_collation($sql) ) {
self::$check_current_query = false;
}

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

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

// Если есть результаты
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. DB::getCol('colum', 'table');
* Будет такая выборка: SELECT `colum` FROM `table`
*
* 2. $where = array('colum' => 'data'); DB::getCol('colum', 'table', $where);
* Будет такая выборка: SELECT `colum` FROM `table` WHERE `colum` = 'data'
*
* 3. $where = array('colum' => 'data', 'colum1' => 'data1'); DB::getCol('colum', 'table', $where);
* Будет такая выборка: SELECT `colum` FROM `table` WHERE `colum` = 'data' AND `colum1` = 'data1'
*
* Результат - возвращает все данные из одного столбца
* Пример: $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)."'";
}
elseif( is_int($value) ) {
$values = (int)$value;
}
elseif( filter_var($value, FILTER_VALIDATE_INT) ) {
$values = (int)$value;
}
else {
$values = $value;
}

$condition[] = "`$field` = $values";
}
$condition = implode( ' AND ', $condition );
$conditions = " WHERE $condition";
}

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

if( self::$check_current_query && self::check_safe_collation($sql) ) {
self::$check_current_query = false;
}

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

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

// Если есть результаты
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) || empty($where) ) {
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)."'";
}
elseif( is_int($value) ) {
$values = (int)$value;
}
elseif( filter_var($value, FILTER_VALIDATE_INT) ) {
$values = (int)$value;
}
else {
$values = $value;
}

$condition[] = "`$field` = $values";
}
$condition = implode( ' AND ', $condition );
$conditions = " WHERE $condition";
}

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

if( self::$check_current_query && self::check_safe_collation($sql) ) {
self::$check_current_query = false;
}

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

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

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

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

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

//=======================================================================
/* Проверка, является ли строка ASCII
*
* Отрицательное регулярное выражение выполняется быстрее для строк, отличных от ASCII,
* так как позволяет завершить поиск, как только он встречает символ, отличный от ASCII.
* @access protected
* @param string $string - Строка для проверки
* @return bool - Истинно, если ASCII, в противном случае false.
*/

protected static function check_ascii( $string ) {
if( function_exists('mb_check_encoding') ) {

if( mb_check_encoding($string, 'ASCII') ) {
return true;
}
}
elseif( ! preg_match('/[^\x00-\x7F]/', $string) ) {
return true;
}

return false;
}
//=======================================================================
/*
* Убеждаемся, что запрос запрашивает сопоставление,
* считающееся безопасным в MySQL.
* @access protected
* @param string $query - Запрос для проверки.
* @return bool - Истинно, если сопоставление безопасно, в противном случае false.
*/

protected static function check_safe_collation( $query ) {

if( self::$checking_collation ) {
return true;
}

// Не проверяем сортировку для запросов, которые не читают данные.
$query = ltrim($query, "\r\n\t (");
if( preg_match('/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $query) ) {
return true;
}

// Все запросы ASCII не требуют дополнительной проверки.
if( self::check_ascii($query) ) {
return true;
}

$table = self::get_table_from_query($query);
if( ! $table ) {
return false;
}

return true;
}

//=======================================================================
/* Найти первое имя таблицы, на которое ссылается запрос.
*
* @access protected
* @param string $query - Запрос на поиск.
*
* @return string|false $table Имя таблицы найдено или false, если таблица не найдена.
*/

protected static function get_table_from_query( $query ) {

// Удаляем символы, которые могут отслеживать имя таблицы.
$query = rtrim($query, ';/-#');

// Разрешаем запросы (select...) union [...]
$query = ltrim($query, "\r\n\t (");

// Разделяем все что между круглыми скобками.
$query = preg_replace('/\((?!\s*select)[^(]*?\)/is', '()', $query);

// Совпадение с наиболее распространенными запросами.
if( preg_match('/^\s*(?:'
. 'SELECT.*?\s+FROM'
. '|INSERT(?:\s+LOW_PRIORITY|\s+DELAYED|\s+HIGH_PRIORITY)?(?:\s+IGNORE)?(?:\s+INTO)?'
. '|REPLACE(?:\s+LOW_PRIORITY|\s+DELAYED)?(?:\s+INTO)?'
. '|UPDATE(?:\s+LOW_PRIORITY)?(?:\s+IGNORE)?'
. '|DELETE(?:\s+LOW_PRIORITY|\s+QUICK|\s+IGNORE)*(?:.+?FROM)?'
. ')\s+((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)/is', $query, $maybe) ) {
return str_replace('`', '', $maybe[1]);
}

// SHOW TABLE STATUS и SHOW TABLES WHERE Name = 'table'
if ( preg_match('/^\s*SHOW\s+(?:TABLE\s+STATUS|(?:FULL\s+)?TABLES).+WHERE\s+Name\s*=\s*("|\')((?:[0-9a-zA-Z$_.-]|[\xC2-\xDF][\x80-\xBF])+)\\1/is', $query, $maybe) ) {
return $maybe[2];
}

if( preg_match( '/^\s*SHOW\s+(?:TABLE\s+STATUS|(?:FULL\s+)?TABLES)\s+(?:WHERE\s+Name\s+)?LIKE\s*("|\')((?:[\\\\0-9a-zA-Z$_.-]|[\xC2-\xDF][\x80-\xBF])+)%?\\1/is', $query, $maybe ) ) {
return str_replace( '\\_', '_', $maybe[2] );
}

// Шаблон для остальных связанных с таблицей запросов.
if( preg_match('/^\s*(?:'
. '(?:EXPLAIN\s+(?:EXTENDED\s+)?)?SELECT.*?\s+FROM'
. '|DESCRIBE|DESC|EXPLAIN|HANDLER'
. '|(?:LOCK|UNLOCK)\s+TABLE(?:S)?'
. '|(?:RENAME|OPTIMIZE|BACKUP|RESTORE|CHECK|CHECKSUM|ANALYZE|REPAIR).*\s+TABLE'
. '|TRUNCATE(?:\s+TABLE)?'
. '|CREATE(?:\s+TEMPORARY)?\s+TABLE(?:\s+IF\s+NOT\s+EXISTS)?'
. '|ALTER(?:\s+IGNORE)?\s+TABLE'
. '|DROP\s+TABLE(?:\s+IF\s+EXISTS)?'
. '|CREATE(?:\s+\w+)?\s+INDEX.*\s+ON'
. '|DROP\s+INDEX.*\s+ON'
. '|LOAD\s+DATA.*INFILE.*INTO\s+TABLE'
. '|(?:GRANT|REVOKE).*ON\s+TABLE'
. '|SHOW\s+(?:.*FROM|.*TABLE)'
. ')\s+\(*\s*((?:[0-9a-zA-Z$_.`-]|[\xC2-\xDF][\x80-\xBF])+)\s*\)*/is', $query, $maybe) ) {
return str_replace('`', '', $maybe[1]);
}

return false;
}

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


public static function AfdRows() {
return mysqli_affected_rows(self::$link);
}
//=======================================================================
// Получает число рядов в результирующей выборке


public static function NumRows( $result ) {
return mysqli_num_rows($result);
}
//=======================================================================
//=======================================================================

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>'
);
}
}


Astin
Немного описания. Тоже скорее всего понадобится для тех кто будет классом пользоваться

Соединение
DB::connect( $dbhost, $dbuser, $dbpass, $dbname );


Обычный запрос
DB::Query(" Ваш запрос ");


Экранирует специальные символы
DB::escape( $data );


Получаем номер добавленной записи
DB::insertId();


Общее кол-во изменненых строк в запросе
DB::AfdRows();


Получает число рядов в результирующей выборке
DB::NumRows( $result );



Подготовка SQL-запроса для безопасного выполнения
DB::prepare( $query, $args );


Пример:

DB::prepare( "SELECT * FROM table WHERE `colum` = %s, 'foo'" );
DB::prepare( "SELECT * FROM table WHERE `colum` = %s AND `field` = %d", 'foo', 23 );



Вставка в таблицу INSERT

//Такой запрос обработает все данные как строки
DB::insert('table', array('column' => 'foo', 'field' => 'one'));
//=======================================
// ИЛИ

DB::insert('table', array('column' => 'foo', 'field' => 1), array('%s', '%d'));



Замена данных REPLACE

//Такой запрос обработает все данные как строки
DB::replace( 'table', array('column' => 'foo', 'field' => 'one') );
//=======================================
// ИЛИ

DB::replace( 'table', array('column' => 'foo', 'field' => 1), array('%s', '%d') );



Обновление строк UPDATE

$data = array('column' => 'one');
$where = array( 'id' => 1 );

//Такой запрос обработает все данные как строки
DB::update('table', $data, $where);
//=======================================
// ИЛИ

$data = array('column' => 'one', 'field' => 223);
$where = array( 'id' => 1 );

$data_fotmat = array('%s', '%d');
$where_fotmat = array('%d');

DB::update('table', $data, $where, $data_fotmat, $where_fotmat);



Удаление строк DELETE

$where = array( 'id' => 1 );

//Такой запрос обработает все данные как строки
DB::deletes('table', $where);
//=======================================
// ИЛИ

$where_fotmat = array('%d');
DB::deletes('table', $where, $where_fotmat);
Быстрый ответ:

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