[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прошу высказать свое мнение, а также протестировать класс
Alexander K
Привет! Написал сегодня класс для работы с MySQL. Прошу высказать свое мнение о классе, а также протестировать его, т.к. времени уже нет на тестирование.
Если кто-то будет пользоваться этим классом - буду только рад.
CODE
/*
Классы обработки исключительных ситуаций.
*/
class CorexException extends Exception
{
protected $date;
public function __construct($message, $code, $date)
{
 $this->date = $date;
 $this->message = $message;
 parent :: __construct($message, $code);
}

public function toString()
{
 return ("Ошибка: ".$this->message." в строке ".$this->line." файла ".$this->file);
}

public function getErrors()
{
 return array($this->message, $this->code, $this->date, $this->line, $this->file);
}
}

class CorexMySqlException extends CorexException
{
public function __construct($message, $code, $date = date('d/m/Y H:i:s'))
{
 $this->code = $code;
 parent :: __construct($message, $code, $date);
}
}

class CorexCustomException extends CorexException
{
public function __construct($message, $code=0, $date = date('d/m/Y H:i:s'))
{
 $this->code = $code;
 parent :: __construct($message, $code, $date);
}
}

/*
Класс для работы с MySQL.
Класс расчитан на один SQL запрос за одно подключение, если есть ошибки, то они заносятся в массив dbErrors.
Данные: $dbUser - логин пользователя
 $dbPassword - пароль для подключения
 $dbName - название базы данных
 $dbHost - хост подключения
 $dbResult - результат выполнения SQL запроса
 $dbLink - указатель на соединение с MySQL
 $dbPconnect - использовать ли постоянное соединение или нет.
 $dbErrors - многомерный массив ошибок (см класс исключительной ситуации)
Методы: private function dbOpen() - выполняет подключение к серверу БД и выбирает необходимую базу
 private function dbClose() - осуществляет закрытие подключения
 public function __construct($dbUser, $dbPassword, $dbName, $dbHost) - конструктор класса,
где происходит инициализация параметров подключения
 public function __destruct() - деструктор, вызывающий закрытие подключения
 public function dbQuery($sql) - открывает соединение, выполняет SQL запрос и инициализирует
результат выполнения SQL запроса
 public function dbQueryWithCharset($sql, $charset='cp1251') - выполняет туже функциональность,
что и dbQuery($sql), но уже с учетом кодировки, которая передается вторым входным параметром
 public function db2Array() - извлекает массив всех значений из базы
 public function dbCol2Array($num) - извлекает определенный столбец, указанный в целочисленном входном параметре
 public function dbRow2Array($num) - извлекает определенную строку, указанную в целочисленном входном параметре
 public function db2Var($varName) - извлекает ячейку из запроса, название которой указано во входном параметре
 public function dbNumRows() - возвращает число строк результата запроса
 public function dropThisTable($tableName) - удаляет таблицу, определенную во входном параметре
 public function dropThisDatabase($databaseName) - удаляет базу данных, определенную во входном параметре
 public function getErrors() - возвращает массив ошибок
*/
class CorexDbMySql
{
private $dbUser;
private $dbPassword;
private $dbName;
private $dbHost;
private $dbResult;
private $dbLink;
private $dbPconnect;
private $dbErrors;

private function dbOpen()
{
 try{
  if($dbPconnect == false)
  {
   if(!$this->dbLink = @mysql_connect($this->dbHost, $this->dbUser, $this->dbPassword))
   throw new CorexMySqlException(mysql_error(), mysql_errno());
  }
  else
  {
   if(!$this->dbLink = @mysql_pconnect($this->dbHost, $this->dbUser, $this->dbPassword))
   throw new CorexMySqlException(mysql_error(), mysql_errno());
  }
 }catch(CorexException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
 try{
  if(! @mysql_select_db($this->dbName))
  throw new CorexMySqlException(mysql_error(), mysql_errno());
 }catch(CorexException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
}

private function dbClose()
{
 if($dbPconnect == false)
 {
  try{
   if(! @mysql_close($this->dbLink))
   throw new CorexMySqlException(mysql_error(), mysql_errno());
  }catch(CorexException $e){
   array_push($this->dbErrors, $e->getErrors());
  }
 }
}

public function __construct($dbUser, $dbPassword, $dbName, $dbHost, $dbPconnect = false)
{
 $this->dbUser = $dbUser;
 $this->dbPassword = $dbPassword;
 $this->dbName = $dbName;
 $this->dbHost = $dbHost;
 $this->dbPconnect = $dbPconnect;
 $this->dbErrors = array();
 $this->dbOpen();
}

public function __destruct()
{
 if($dbPconnect == false)
 {
  if($this->dbLink == true)
   $this->dbClose();
 }
}

public function dbQuery($sql)
{
 try{
  if(!$this->dbResult = @mysql_query($sql, $this->dbLink))
  throw new CorexMySqlException(mysql_error(), mysql_errno());
 }catch(CorexMySqlException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
}

public function dbQueryWithCharset($sql, $charset='cp1251')
{
 try {
  $csSql = "SET NAMES '$charset'";
  if(! @mysql_query($csSql, $this->dbLink))
  throw new CorexMySqlException(mysql_error(), mysql_errno());
 }catch(CorexMySqlException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
 try{
  if(!$this->dbResult = @mysql_query($sql, $this->dbLink))
  throw new CorexMySqlException(mysql_error(), mysql_errno());
 }catch(CorexMySqlCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
}

public function db2Array()
{
 $array = array();
 try{
  while($rows = @mysql_fetch_array($this->dbResult))
  {
   $array[] = $rows;
  }
  throw new CorexCustomException("Не могу получить массив из базы данных");
 }catch(CorexCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }finally{
  if(is_array($array))
   return $array;
  else
   return false;
 }
}

public function dbCol2Array($num)
{
 if(!is_integer($num))
  $num = 0;
 $array = array();
 try{
  while($rows = @mysql_fetch_array($this->dbResult))
  {
   $array[] = $rows[$num];
  }
  throw new CorexCustomException("Не могу получить массив столбцов из базы данных");
 }catch(CorexCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }finally{
  if(is_array($array))
   return $array;
  else
   return false;
 }
}

public function dbRow2Array($num)
{
 if(!is_integer($num))
  $num = 0;
 $array = array();
 try{
  while($rows = @mysql_fetch_array($this->dbResult))
  {
   $i++;
   if($i == $num)
   {
    $array = $rows;
    break;
   }
  }
  throw new CorexCustomException("Не могу получить массив строки из базы данных");
 }catch(CorexCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }finally{
  if(is_array($array))
   return $array;
  else
   return false;
 }
}

public function db2Var($varName)
{
 $var;
 try{
  while($rows = @mysql_fetch_array($this->dbResult))
  {
   $var = $rows[$varName];
   break;
  }
  throw new CorexCustomException("Не могу получить ячейку из базы данных");
 }catch(CorexCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }finally{
  if(!empty($var))
   return $var;
  else
   return false;
 }
}

public function dbNumRows()
{
 try{
  $numRows = @mysql_num_rows($this->dbResult);
  throw new CorexCustomException("Не могу количество строк из базы данных");
 }catch(CorexCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }finally{
  if($numRows > 0)
   return $numRows;
  else
   return false;
 }
}

public function dropThisTable($tableName)
{
 try{
  $sql = "DROP TABLE IF EXISTS '$tableName'";
  $this->dbQuery($sql);
  $message = "Не могу таблицу '$tableName' из базы данных";
  throw new CorexCustomException($message);
 }catch(CorexCustomException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
}

public function dropThisDatabase($databaseName)
{
 try{
  if(!@mysql_drop_db($databaseName))
  throw new CorexMySqlException(mysql_error(), mysql_errno());
 }catch(CorexMySqlException $e){
  array_push($this->dbErrors, $e->getErrors());
 }
}

public function getErrors()
{
 return $this->dbErrors;
}
}
?>

В принципе, класс исключений и класс работы с бд должны быть в разных файлах.

Как пользоваться классом:
Создайте объект класса
CODE
$db = new CorexDbMySql('root', 'password', 'test', 'localhost');
$db->dbQuery("SELECT * FROM my_test");
$array = $db->db2Array();

У вас готов массив значений из базы.



Спустя 18 минут, 6 секунд (12.01.2007 - 16:25) zilogo написал(а):
Первое впечатление:
1) оч длинные названия функций - dbNumRows могло бы быть num_rows
напр
$sql->query(...) гораздо приятнее, чем $sql->dbQuery(...)
2) В 4м пхп н*цензура*дет работать :(
3) try и catch ихмо перегиб
4) Конструктор я бы дополнил __construct($dbUser, $dbPassword, $dbName, $dbHost = 'localhost', $dbPconnect = false)

Спустя 5 минут, 39 секунд (12.01.2007 - 16:31) Alexander K написал(а):
zilogo, спасибо за отзыв.
1 - мне такие названия функций показались оптимальными.
2 - надо уже и пятый использовать.
3 - почему?
4 - можно и так.

Спустя 10 минут, 5 секунд (12.01.2007 - 16:41) zilogo написал(а):
2 - выигрыша от новых конструкций нет, а гибкость теряется.

Спустя 7 минут, 35 секунд (12.01.2007 - 16:49) Alexander K написал(а):
zilogo, пятая версия мне нравится больше тем, что у нее более развитая объектная модель. Например, права доступа, деструкторы появились. А вот чего мне явно нехватает, так это нормальной перегрузки методов.


_____________
Век живи, век учись...
Быстрый ответ:

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