(3 - user rating)

Для личного использования я написал простенький класс для работы с базой данных MySQL. В примере описаны основные моменты подключения к БД и пара часто используемых функций обработки запросов. Методы обработки ошибок вырезаны для наглядности примера, оставлены только фатальные выходы.

Итак, поехали...

<?php

class mysql
{
  // публичное свойство класса для ключей получаемых массивов
  public $resultType = MYSQL_ASSOC;
  
  private $conn_id;		// приватное свойство - идентификатор соединения
  private $database;		// приватное свойство - префикс таблиц
  private $table_prefix;	// приватное свойство - имя БД
  
  
  /******************************************************************
   * Конструктор класса. Вызавается при объявлении класса.
   *
   * На входе: $settings - ассоциативный массив
   *		['host']	- имя или IP сервера БД
   *		['login']	- логин пользователя БД
   *		['password']	- пароль пользователя БД
   *		['p_conn']	- постоянное соединение (true/false)
   *		['charset']	- кодировка соединения
   *		['table_prefix']- префикс таблиц
   *		['database']	- имя БД
   *				
   * На выходе: -
   *				
   * При успешном соединении задает значения свойств класса
   *				
   ******************************************************************/
   
  public function __construct($settings = NULL)
  {
	  // соединяемся с сервером в зависимости от параметра 'p_conn'
	  if ($settings['p_conn'])
	   $this->conn_id = @mysql_pconnect($settings['host'], $settings['login'], $settings['password']);
	  else
	   $this->conn_id = @mysql_connect($settings['host'], $settings['login'], $settings['password']);
	  
	  // при неудачном соединении завершаем работу скрипта и выдаем текст ошибки
	  if (!$this->conn_id) die('Can\'t connect MySQL server!!!');
	  
	  // задаем кодировку соединения
	  mysql_set_charset($settings['charset'], $this->conn_id);
	  
	  // задаем приватные свойства
	  $this->table_prefix = $settings['table_prefix'];
	  $this->database = $settings['database'];
  }

  /******************************************************************
   * Деструктор класса. Инициализируется автоматически в конце работы скрипта
   *
   * На входе: - 
   * На выходе: -
   *
   * Закрывает соединение с БД
   *
   ******************************************************************/
  public function __destruct()
  {
	  return mysql_close($this->conn_id);
  }

  /******************************************************************
   * Основной публичный метод класса для подачи запроса в БД
   *
   * На входе: SQL запрос (строка)
   * На выходе: сырой MySQL result
   *
   ******************************************************************/
  public function query($sql)
  {
	  // подача запроса
	  $result = mysql_query($sql, $this->conn_id);
	  
	  // в случае возникновения ошибки выдаем сообщение и останавливаем работу скрипта
	  if (mysql_errno($this->conn_id) > 0)
		  {
			  echo $sql . '<br/>';
			  // у меня сервер MySQL с русской локализацией в кодировке
 			  // KOI8-R, а WEB сервер выдает UTF-8
			  // для этого я конверчу текст ошибки (не обязательно)
			  exit(mysql_errno($this->conn_id) . ': ' . iconv('koi8r','utf8',mysql_error($this->conn_id)));
		  }
	  return $result;
  }

  /******************************************************************
   * преобразование имени таблицы
   *
   * На входе: имя таблицы (строка)
   * На выходе: `database`.`prefix_table` (строка)
   *
   ******************************************************************/
  public function table($tb_name = NULL)
  {
	  return '`' . $this->database . '`.`' . $this->table_prefix . $tb_name . '`';
  }


/*******************************************************************
 * Вспомогалельные функции
 *******************************************************************/


  /******************************************************************
   * получить все строки в массив
   *
   * На входе: SQL запрос (строка)
   * На выходе: двумерный массив, где первый уровень является строкой, 
   *            второй - колонкой (имя ключа зависит от свойства 'resultType')
   *
   ******************************************************************/
  public function getAll($sql)
  {
	  $res = $this->query($sql);
	  $arr = array();
		while ($row = mysql_fetch_array($res, $this->resultType))
		{
			$arr[] = $row;
		}
		
	  return $arr;
  }

  /******************************************************************
   * получить только одну строку в массив
   *
   * На входе: SQL запрос (строка)
   * На выходе: одномерный массив (имя ключа зависит от свойства 'resultType')
   *
   ******************************************************************/
  public function getRow($sql)
  {
	  $res = $this->query($sql);
	  $row = mysql_fetch_array($res, $this->resultType);
	  
	  return $row;
  }

  /******************************************************************
   * получить одно значение
   *
   * На входе: SQL запрос (строка)
   * На выходе: значение "верхней левой" ячейки (строка)
   *
   ******************************************************************/
  public function getOne($sql)
  {
	  $res = $this->query($sql);
	  $row = mysql_fetch_array($res);
	  
	  return $row[0];
  }
}

?>

Как этим пользоваться

Создаем в базе данных таблицу

Назначение полей я объяснять не буду. Разберетесь :)

CREATE TABLE IF NOT EXISTS `pref_article` (
  `article_id` int(11) NOT NULL auto_increment,
  `article_title` varchar(200) NOT NULL,
  `article_content` text NOT NULL,
  `is_open` tinyint(1) NOT NULL,
  PRIMARY KEY  (`article_id`),
  KEY `is_open` (`is_open`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Заполним таблицу данными

INSERT INTO `pref_article` (`article_title`, `article_content`, `is_open`) VALUES
('статья номер 1', 'это текст статьи 1', 1),
('статья номер 2', 'это текст статьи 2', 1);

назовем файл с классом cls_mysql.php и разместим его в директории classes
дерево категорий сайта будет выглядеть так:

[public_http]
     +- [classes]
     |       +- cls_mysql.php
     |
     + index.php

Файл /index.php будет содержать следующий код

<?php 

$conf_db = array('host' => 'localhost',
                 'login' => 'my_login',
                 'password' => 'my_password',
                 'p_conn' => true,
                 'charset' => 'utf8',
                 'table_prefix' => 'pref_',
                 'database' => 'example')

include_once ('classes/cls_mysql.php');
   $db = new mysql($conf_db); unset($conf_db);




// пример запроса к БД
// обратите внимание: в строку запроса имя таблицы мы вставляем через метод 
// класса (без указания имени базы и префикса)

$sql = 'SELECT * FROM ' . $db->table('article') . ' WHERE is_open=1';

 echo '<pre>';

// получим массив содержащий ВСЕ строки удовлетворяющими условию
   print_r( $db->GetAll($sql) );

// получим ПЕРВУЮ строку удовлетворяющую условию
   print_r( $db->GetRow($sql) );

// получим значение ОДНОЙ (верхней левой) ячейки
   print_r( $db->GetOne($sql) );

 echo '</pre>';

?>

На этом все. Обработку ошибок я оставляю Вам :)

Добавить комментарий


Защитный код
Обновить