Автор Тема: Класс для работы с БД MySQL  (Прочитано 2667 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн DARX

  • Global Moderator
  • 7 уровень
  • *****
  • Сообщений: 1559
  • карма: +23/-5
  • Knowledge is Power
    • Просмотр профиля
    • Web-программист
Класс для работы с БД MySQL
« : 26 Ноября 2007, 17:57:27 »
Как и обещал, представляю вам простейший класс для работы с базой данных Мускул.
Ядром класса являются 2 функции, написанные Дмитрием Котеровым (http://dklab.ru), позволяющие использовать т.н. placeholders. Пример и использования и сам класс чуть ниже:

<?php
// +----------------------------------------------------------------------+
// | dMysql class                                                         |
// +----------------------------------------------------------------------+
// | Copyright (c) 2007 Darmen 'Darx' Amanbayev                           |
// +----------------------------------------------------------------------+
// | Простейший класс для работы с базой данных MySQL.                    |
// | Использованы функции mysql_qw() и mysql_make_qw() Д.Котерова         |
// +----------------------------------------------------------------------+
// | Authors: Darmen Amanbayev <amanbayev@darmen.kz>                      |
// |          Dmitry Koterov http://www.dklab.ru                          |
// +----------------------------------------------------------------------+

class dMysql{
private $cId; // id соединения
private $qResult; // Результат запроса
private $query; // Запрос
private $numrows; // Количество рядов
static $instances 0; // КОличество экземплров класса

function __construct($host='localhost'$login=''$pass=''$db){
if(self::$instances!=0){
die('Закройте существующий экземпляр');
exit;
}else{
$this->cId mysql_connect($host$login$pass) or die(mysql_error(), mysql_errno());
mysql_select_db($db);
self::$instances 1;
}
}

// Соединились или нет?
private function isConnected(){
return self::$instances;
}

// Выполнение запроса
public function query(){
if (!$this->isConnected()){
die('Нет подключения.');
}else{

// Получаем все аргументы функции.
$args func_get_args();

// Если первый параметр имеет тип "ресурс", то это ID соединения.
$conn null;
if (is_resource($args[0])) $conn array_shift($args);
// Формируем запрос по шаблону.
$query call_user_func_array(array(&$this,"mysql_make_qw"), $args);
// Вызываем SQL-функцию.

$conn!==null$this->qResult mysql_query($query$conn) : $this->qResult mysql_query($query);
$this->numrows mysql_num_rows($this->qResult);
return $this->qResult;
}
}

// 
private function mysql_make_qw() {
$args func_get_args();
// Получаем в $tmpl ССЫЛКУ на шаблон запроса.
$tmpl =& $args[0];
$tmpl str_replace("%""%%"$tmpl);
$tmpl str_replace("?""%s"$tmpl);
// После этого $args[0] также окажется измененным.
// Теперь экранируем все аргументы, кроме первого.
foreach ($args as $i=>$v) {
if (!$i) continue;        // это шаблон
if (is_int($v)) continue; // целые числа не нужно экранировать
if (get_magic_quotes_gpc()){
$args[$i] = "'".$v."'";
}else{
$args[$i] = "'".mysql_escape_string($v)."'";
}
}
// На всякий случай запорняем 20 последних аргументов недопустимыми
// значениями, чтобы в случае, если число "?" превышает количество
// параметров, выдавалась ошибка SQL-запроса (поможет при отладке).
for ($i=$c=count($args)-1$i<$c+20$i++){
$args[$i+1] = "UNKNOWN_PLACEHOLDER_$i";
}
   
// Формируем SQL-запрос.
$this->query call_user_func_array("sprintf"$args);
return $this->query;
}

public function fetchRow(){
return mysql_fetch_row($this->qResult);
}

public function getQResult(){
return $this->qResult;
}

public function getQuery(){
return $this->query;
}

public function getNumRows(){
return $this->numrows;
}
}
?>



<?php
$db = new dMysql('localhost'$login$pass);
$res $db->query('SELECT * FROM `users` WHERE `sex_per_week` > ? AND `partner_sex` = ?'7'female');
?>

« Последнее редактирование: 26 Ноября 2007, 18:00:12 от Darx »

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: Класс для работы с БД MySQL
« Ответ #1 : 26 Ноября 2007, 18:54:24 »
хм.. интересно, налицо пхп5 :) дома погоняю, молодец, Darx!

Оффлайн DARX

  • Global Moderator
  • 7 уровень
  • *****
  • Сообщений: 1559
  • карма: +23/-5
  • Knowledge is Power
    • Просмотр профиля
    • Web-программист
Re: Класс для работы с БД MySQL
« Ответ #2 : 26 Ноября 2007, 20:21:00 »
Рахмет )
Погоняй, может, предложишь улучшения  ;)

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: Класс для работы с БД MySQL
« Ответ #3 : 29 Ноября 2007, 13:45:57 »
Рахмет )
Погоняй, может, предложишь улучшения  ;)
Угу.. Что касается улучшений - я подумаю :)))