Если кто-то будет пользоваться этим классом - буду только рад.
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();
$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)
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 - можно и так.
1 - мне такие названия функций показались оптимальными.
2 - надо уже и пятый использовать.
3 - почему?
4 - можно и так.
Спустя 10 минут, 5 секунд (12.01.2007 - 16:41) zilogo написал(а):
2 - выигрыша от новых конструкций нет, а гибкость теряется.
Спустя 7 минут, 35 секунд (12.01.2007 - 16:49) Alexander K написал(а):
zilogo, пятая версия мне нравится больше тем, что у нее более развитая объектная модель. Например, права доступа, деструкторы появились. А вот чего мне явно нехватает, так это нормальной перегрузки методов.
_____________
Век живи, век учись...