На главную Статьи Функции

Класс для работы с базой данных MySQL




Представляю свой класс для работы с базой данных MySQL. Не знаю, удобен он, или нет, может быть чего-то не хватает, может быть что-то лишнее, но я к нему привык и не испытываю проблем при работе с ним. В начале представлю сам код класса с комментариями, внизу будут примеры работы с ним.

<?php
class DB {
protected $dbname='база_данных';
protected $dbuser='пользователь';
protected $dbhost='сервер';
protected $dbpass='пароль';
private $_connect;
private $db_select;
public $row;
/*Подключаемся к базе данных*/
public function __construct() {
$this->_connect=@mysql_connect ($this->dbhost, $this->dbuser, $this->dbpass);
if (!$this->_connect) {
//Если подключиться не удалось выводим ошибку.
exit ("В настоящий момент сервер базы данных недоступен");
}
//Выбираем базу данных для работы
$this->db_select=mysql_select_db ($this->dbname, $this->_connect);
if (!$this->db_select) {
exit('В настоящий момент база данных недоступна');
}
//Если нужно, раскомментируем следующую строку, чтобы выбрать кодировку запросов
//mysql_query('set names utf8');
return $this->db_select;
}
/*Выполняем запрос к базе данных*/
public function query($q) {
$this->result=mysql_query($q, $this->_connect);
//Если не удалось выполнить запрос, выводим ошибку
if (!$this->result)  {
echo "<div style=\"font-size:10px; color:#666666;\">Не удалось выполнить SQL запрос $q</div>";
}
return $this->result;
}
/**
* Создаем запрос к базе данных
* $tables – таблица (таблицы), из которой производим выбор значений
* $where – условия выборки
* $fields – выбираемые поля (по умолчанию - *)
* $order_by – упорядочить по
* $order – принимает значения ASC или DESC
* $limit_start – выбрать значения начиная со строки $limit_start
* $limit – количество строк
* return $q – возвращает запрос для выполнения в функции query()
*/
public function set_query($tables, $where='', $fields='*', $order_by='', $order='', $limit_start='', $limit='') {
$q="SELECT $fields FROM $tables";
if (!empty($where)) {
$q.=" WHERE $where";
}
if (!empty($order)) {
$q.=" ORDER BY $order_by $order";
}
if (!empty($limit_start)) {
$q.=" LIMIT $limit_start, $limit";
}
return $q;
}
/*Подсчет количества строк в запросе*/
public function query_count($result) {
$this->row_count=mysql_num_rows($this->result);
return $this->row_count;
}
/*Переводим строку в ассоциативный массив*/
public function fetch_assoc($result) {
$this->fetch=mysql_fetch_assoc($result);
return $this->fetch;
}
/*Переводим весь запрос в ассоциативный массив*/
public function fetch_all($result) {
while ($fetch=mysql_fetch_assoc($result)) {
$rows[]=$fetch;
}
return $rows;
}
/**
* Разбивает дату в формате MySQL 0000-00-00 в ассоциативный массив, удобно для перевода в формат 00.00.0000
*/
public function transofrm_date($dat) {
$data['day']=substr($dat, 8, 2);
$data['month']=substr($dat, 5, 2);
$data['year']=substr($dat, 0, 4);
return $data;
}
/*Удалить запись из таблицы $table по полю $id_field равному $id*/
public function delete_record($table, $id_field, $id) {
$q="DELETE FROM $table WHERE $id_field='$id'";
$delete_record=$this->query($q);
return $delete_record;
}
/**
* В отличии от предыдущей функции, удаляет записи из таблицы $table по набору значений, например $set=”id=’1’ AND sub_id=’5’”
*/
public function delete_set($table, $set) {
$q="DELETE FROM $table WHERE $set";
echo "<div style=\"font-size:10px; color:#CCCCCC;\">".$q."</div>";
$delete_record=$this->query($q);
return $delete_record;
}
/*Вставляет набор данных $set в таблицу $table*/
public function insert_record($table, $set) {
$q="INSERT INTO $table SET $set";
$insert_record=$this->query($q);
}
/**
* Редактирует запись в таблице $table набором значений $set по полю $id_field со значением $id
*/
public function update_record($table, $set, $id_field, $id) {
$q="UPDATE $table SET $set WHERE $id_field='$id'";
$update_record=$this->query($q);
}
/**
* Извлекает последний добавленный в таблицу $table идентификатор
* Для избежания ошибок, используется непосредственно после функции insert_record()
*/
public function get_last_id($table) {
$q="SELECT LAST_INSERT_ID() FROM $table";
$last=$this->fetch_assoc($this->query($q));
$last_id=$last['LAST_INSERT_ID()'];
return $last_id;
}
}
?>

Перед началом работы класс необходимо подключить. Для избегания ошибок, связанных с переопределением класса, подключать необходимо инструкцией include_once():
<?php
include_once ‘db.class.php’;
$db = new DB;
?>
Все свои классы, для удобства, я держу в файлах с названием ‘имя_класса.class.php’, так их удобнее подключать. Когда мы создаем экземпляр класса db, функция __construct() автоматически вызывается и создает подключение к базе данных, т.е. мы не должны следить за тем, подключили мы базу данных или нет, все происходит в автоматическом режиме.
Примеры работы с классом:

  1. Простой запрос к базе данных:

Выбрать все товары интернет магазина в диапазоне цен от $min_price до $max_price и упорядочить по убыванию цены.
Таблица товаров:
products – поля: id (идентификатор), name (название), price (цена).
<php

$q=$db->set_query(‘products’,  “price>=’$min_price’ AND price<=’$max_price’”, ‘*’, ‘price’, ‘DESC’);
//В результате получаем:
//$q=”SELECT * FROM products WHERE price>=’$min_price’ AND price<=’$max_price’ ORDER BY price DESC”;
?>

  1. Усложняем выборку товаров:

Задача: Выбрать товары интернет магазина в заданной категории и ценовом диапазоне.
Есть таблицы:
а) products – поля: id (идентификатор, чтобы не повторяться – напишу один раз, дальше везде поле id по умолчанию буду считать уникальным идентификатором), name(название), price(цена)
б) categoryes – поля: id, name (название)
в) product_category_link – поля: product_id (id продукта), category_id (id категории)
Такая организация связи товаров с категориями в интернет магазине позволяет привязать товар к нескольким категориям. Товары должны находиться в категории $category_id. Диапазон цен для примера зададим переменными $min_price до $max_price.
Создаем переменные для запроса:

<?php
//таблицы для выборки значений
$tables=”products as pr, categoryes as cat, product_category_link as pcl”;
//условия выборки
$where=”cat.id=’$category_id’ AND pcl.category_id=cat.id AND pr.id=pcl.product_id”;
$where.=” AND pr.price>=’$min_price’ AND pr.price<=’$max_price’”;
//выбираемые поля. Нам нужно выбрать id товара, название товара, цену товара, id категории и название категории.
//Обратите внимание что поля идентификаторов и названий в таблицах категорий и товаров имеют одинаковые названия, поэтому для категории мы будем использовать псевдонимы ячеек:
$fields=”pr.*, cat.name as category_name, cat.id as category_id”;
//Создаем запрос к базе данных. Сортировать будем по цене товаров по возрастанию:
$q=$db->set_query($tables, $where, $fields, ‘pr.price’, ‘ASC’);
$products=$db->fetch_all($db->query($q));
?>
В результате получаем ассоциативный массив товаров:
$products=array(
0=>array(‘id’=>’идентификатор’, ‘name’=>’название’, ‘price’=>’цена’, ‘category_id’=>’идентификатор_категории’, ‘category_name’=>’название_категории’),
);

  1. Добавить товар в интернет магазин

<?php
$set=”name=’$product_name’, price=’$product_price’”;
$db->insert_record(‘products’, $set);
?>
Сразу после этого, если необходимо узнать идентификатор добавленного товара, можно воспользоваться функцией get_last_id():
<?php
$last_product_id=$db-> get_last_id(‘products’);
?>

  1. Отредактировать описание товара $product_id:

<?php
$set=”name=’$new_name’, price=’$new_price’”;
$db->update_record(‘products’, $set, ‘id’, $product_id);
//Функция update_record() выполнит запрос:
//”UPDATE products SET name=’$new_name’, price=’$new_price’ WHERE id=’$product_id’”
?>

  1. Использование функций fetch_assoc() м fetch_all(). Если мы знаем, что результатом запроса к базе данных MySQL будет одна строка, можно пользоваться функцией fetch_assoc(), которая вернет строку в виде ассоциативного массива. Например:

<?php
$q=$db->set_query(‘products’, “id=’$product_id’”)
//$q=”SELECT * FROM products WHERE id=’$product_id’”
$product=$db->fetch_assoc($db->query($q));
//В результате получаем массив $product=array(‘id’=>’…’, ‘name’=>’…’, ‘price’=>’….’)
?>
В остальных случаях лучше использовать функцию fetch_all(). Ну и не забывайте, что обе функции работают не с запросом, а с результатом его выполнения, т.е. конструкция вида $product=$db->fetch_all($q) даст неверный результат.
На этом не сегодня можно закончить. Обсуждаем на форуме.



© 2010-2024 При использовании материалов ссылка на сайт www.webchaynik.ru обязательна

обратная связь