Вот написал класс для работы с базой данных

  • Автор темы webdeveloper
  • Дата начала
Статус
В этой теме нельзя размещать новые ответы.

webdeveloper

Guest
Вот написал класс для работы с базой данных

Вот написал класс для работы с базой данных. Может кому нужно будет. Если что не так - сорри. Я со РНР-mySQL только неделю работаю. Не ругайте :)

PHP:
<?php
/* This class is interface class for database conections
*  Author Alexander Garbuz (c) 2002.01.24 - 10.45 pm
*  [url]http://garbuz.net/[/url]
*
*    This class doesn't have any public members. All methods are public.
*/
class CDataBase
{
  //------------------------------------
  var $DB_HOST = "localhost";
  var $DB_USER_NAME = "usr";
  var $DB_PASSWORD = "pwd";
  var $DB_NAME = "db_name";
  var $connection = null;
 
  //------------------------------------
  /*This is an empty constructor of this class
  * public void CDataBase()
  */
  function CDataBase()
  {
  }
  //------------------------------------
  /* public void destroy();
  */
  function destroy()
  {
     unset($this);
  }
  //------------------------------------
  /* public void riseError(string $errMsg);
  *	 public void error();
  */
  function riseError($fileName, $lineNumber, $errMsg="")
  {
	$msg = "<H1>Error Message!</H1>";
	$msg .= "<p>Error has occured - see description below</p>";
	$msg .= "---------------------------------------------------------<br>
	Description - <b>".$errMsg."</b><br>
	File - <b>".$fileName."</b><br>
	Line - <b>".$lineNumber."</b>";
	exit($msg);
  }
 
  //------------------------------------
  /* public resource connect();
  */
  function connect()
  {
	$this->connection=@mysql_connect($this->DB_HOST,$this->DB_USER_NAME,$this->DB_PASSWORD)
	or $this->riseError(__FILE__, __LINE__,"".mysql_errno().": ".mysql_error()."");
	@mysql_select_db($this->DB_NAME) 
	or $this->riseError(__FILE__, __LINE__,"".mysql_errno().": ".mysql_error()."");
	return $this->connection;
  }
  //------------------------------------
  /* public resource query(string sqlQuery);
  */
  function query($query)
  {
	$result = @mysql_query ($query) or $this->riseError(__FILE__, __LINE__,"".mysql_errno().": ".mysql_error()."");
	return $result;
  }
   //------------------------------------
  /* public resource db_query(string sqlQuery);
  */
  function db_query($query)
  {
     return $this->query ($query);
  }
  //------------------------------------
  /* public array fetch_array(resource result [, int result_type]);
  */
  function fetch_array($result)
  {
     return mysql_fetch_array ($result);
  }
  //------------------------------------
  /* public int insert_id();
  */
  function insert_id()
  {
     return mysql_insert_id($this->connection);
  }
  //------------------------------------
  /* public int affected_rows();
  */
  function affected_rows()
  {
     return mysql_affected_rows($this->connction);
  }
  //------------------------------------
  /* public int num_rows();
  */
  function num_rows($result)
  {
     return mysql_num_rows($result);
  }
  //------------------------------------
  /* public void close();
  */
  function close()
  {
     @mysql_close ($this->connection);
  }
  //------------------------------------
}
?>
 

kim

Guest
Re: Вот написал класс для работы с базой данных

* This class doesn't have any public members...3
//------------------------------------
var $DB_HOST = "localhost";
var $DB_USER_NAME = "usr";
var $DB_PASSWORD = "pwd";
var $DB_NAME = "db_name";
var $connection = null;


А как же с этими not public memberami? Я не заметил метода для их установки :))
 

webdeveloper

Guest
Re: Re: Вот написал класс для работы с базой данных

Автор оригинала: kim
* This class doesn't have any public members...3
//------------------------------------
var $DB_HOST = "localhost";
var $DB_USER_NAME = "usr";
var $DB_PASSWORD = "pwd";
var $DB_NAME = "db_name";
var $connection = null;
А как же с этими not public memberami? Я не заметил метода для их установки :))
ну я имел в виду то что это просто константы. Ты к ним в программе никак не ообращаешься. В РНР же нельзя по настоящему реализовать Public / Private доступ


А вообще есть какие то замечания по тому как я это написал? Может как то улучшить это можно.
 

[VS]

Guest
Re: Re: Re: Вот написал класс для работы с базой данных

Автор оригинала: webdeveloper
ну я имел в виду то что это просто константы. Ты к ним в программе никак не ообращаешься. В РНР же нельзя по настоящему реализовать Public / Private доступ
А вообще есть какие то замечания по тому как я это написал? Может как то улучшить это можно.
Извращенно написал. Улучшить можно - можно убрать 4/5.
Диагноз - попытка вотнуть OOP там где оно не нужно.
Никому не нужны функции класса, которые только и делают что вызывают функции mysql.
Смысл фунцкии destroy() { unset($this); } мне вообще не понятен.

Теперь обьясни - зачем и кому нужен этот класс?
Чем и с какой стороны он удобнее/читабельнее/быстрее/проще для понимания/... чем просто набор mysql_... функций?

К примеру, я обычно оборачиваю работу с базой в классы, но делаю это совсем по другому. Мои классы именно "работают с базой" являсь интерфейсом между остальной частью кода и базой. Остальной код просто вызывает нужные функции моего класса, он не имеет никакого понятия o SQL, и что с другой стороны - база, набор файлов или вселенский разум.
 

[VS]

Guest
Re: Re: Re: Re: Вот написал класс для работы с базой данных

Только что заметил копирайт вверху файла ... это особенно умиляет.
 

webdeveloper

Guest
Re: Re: Re: Re: Вот написал класс для работы с базой данных

Автор оригинала: [VS]
Извращенно написал. Улучшить можно - можно убрать 4/5.
Диагноз - попытка вотнуть OOP там где оно не нужно.
Никому не нужны функции класса, которые только и делают что вызывают функции mysql.
Смысл фунцкии destroy() { unset($this); } мне вообще не понятен.
Теперь обьясни - зачем и кому нужен этот класс?
Чем и с какой стороны он удобнее/читабельнее/быстрее/проще для понимания/... чем просто набор mysql_... функций?
К примеру, я обычно оборачиваю работу с базой в классы, но делаю это совсем по другому. Мои классы именно "работают с базой" являсь интерфейсом между остальной частью кода и базой. Остальной код просто вызывает нужные функции моего класса, он не имеет никакого понятия o SQL, и что с другой стороны - база, набор файлов или вселенский разум.
Это была попытка написать что то типа ADO. Поскольку полностью написать ADO в РНР не получится написал вот это. еще раз оговорюсь, что опыта с РНР у меня нет. Поэтому это может быть не рационально. Если можешь подскажи как бы ты это написал.

Ну а копирайт это же так - шутка :)
 

[VS]

Guest
Re: Re: Re: Re: Re: Вот написал класс для работы с базой данных

Автор оригинала: webdeveloper
Это была попытка написать что то типа ADO. Поскольку полностью написать ADO в РНР не получится написал вот это. еще раз оговорюсь, что опыта с РНР у меня нет. Поэтому это может быть не рационально.
Я бы вообще не писал ADO на PHP, т.к. не вижу смысла. В PHP есть замечательные функции mysql_... и если их просто обернуть в класс, никакой выгоды мы не получим.

Многие считают что с помощью подобных классов потом легче перейти к использованию другой базы, якобы просто немного поменяв класс. Это не так. В случае такого класс, заменой класса не обойдешся, придется менять много конкретных SQL запросов, которые находятся не в этом класса, а непонятно где.

Если можешь подскажи как бы ты это написал.
Класс "обертку" функций PHP я бы вообще не писал. Я пишу классы которые обслуживают конкретные задачи. Пример. Сайт с новостями. Я сажусь и пишу класс с функциями для
1. добавления новости
2. вытаскивания новостей за интервал времени
3. вытаскивания определенной новости
4. вытаскивание статистики новостей.
5. и.т.д.
Далее, остальная часть сайта просто вызывает функции этого класса и ей пофигу, данные в базе, в текстовом файле или где-то еще. Весь SQL код и собственно работа с базой только в моем классе CNewsManager.

Вот в этом случае, я могу перейти от mySQL к любой другой базе заменив только класс CNewsManager на другой содержащим функции с теми-же названиями и параметрами,
но работающие скажем с ораклом. И я буду уверен что другие части сайта при переходе на другую базу мне менять не придется.

Собственно для подобных целей и используется OOP.

Советую почитать

http://www.digiways.com/articles/php/phpoop/

Если интересно обсудить подробнее, заходи на IRC #phpclub.
 

webdeveloper

Guest
Логично, нужно будет попробовать. Но с другой стороны получается что все запросы с базе хранятся в этом файле. Не получится ли так что файл станет слишком болшьим? Не скажется ли это на скорости компиляции?

Вообще, что говорят знающие люди по поводу того, каким примерно может быть размер РНР файла. В свое время в какой то книжке про ASP я прочитал что болшое колличество include's сильно замедляет работу сервера. А как на счет этого в РНР?
 

[VS]

Guest
Автор оригинала: webdeveloper
Логично, нужно будет попробовать. Но с другой стороны получается что все запросы с базе хранятся в этом файле.
Да, все запросы "к этой таблице" или "к определенному набору таблиц" лежат в этом файле.

Не получится ли так что файл станет слишком болшьим?
у тебя там 150 тысяч запросов что-ли?

Не скажется ли это на скорости компиляции?
Чуть чуть скажется. Если у тебя все критично ко времени, то вообще не на PHP писать нужно.
А если не сильно критично и проэкт большой, то проще испоьлзовать OOP экономя время и нервы.

Вообще, что говорят знающие люди по поводу того, каким примерно может быть размер РНР файла. В свое время в какой то книжке про ASP я прочитал что болшое колличество include's сильно замедляет работу сервера. А как на счет этого в РНР?
Файл должен быть такого размера какого он нужен =)
 

webdeveloper

Guest
Вообще то что ты говоришь имеет смысл. Нельзя с этим не согласится. В следующий раз обязательно так и попробую.
Tдинственное, что я бы хотел добавить, это наверное лучше сочитать два этих подхода.

То есть пишешь класс-обертку + класс CNewsList допустим, который уже конектится к базе при помощи CDataBase. А потом можно будет написать CNewsListAdmin extends CNewsList.


А вообще в идеале нужна хорошая база данных, которая зранимые процедуры и тригера поддерживает :) тогда и вопросов таких не будет.
 

[VS]

Guest
Автор оригинала: webdeveloper
Вообще то что ты говоришь имеет смысл. Нельзя с этим не согласится. В следующий раз обязательно так и попробую.
Tдинственное, что я бы хотел добавить, это наверное лучше сочитать два этих подхода.
То есть пишешь класс-обертку + класс CNewsList допустим, который уже конектится к базе при помощи CDataBase. А потом можно будет написать CNewsListAdmin extends CNewsList.
А вообще в идеале нужна хорошая база данных, которая зранимые процедуры и тригера поддерживает :) тогда и вопросов таких не будет.
Будет. Это вечные вопросы о применении OOP.
 

Jik

Guest
Класс ты не сам писал, он содранный и в инете в куче мест лежит, особенно умиляют эти глупые __LINE__

а класс использовать полезно, хотя окнечно кому как но мне например удобно одной строкой зафигачивать данные формы:
$db->insertform($h);

и не мучаться с addslashes и подготовкой данных к вставке, класс все сделает, код читабильнее ошибок меньше...продолжать можно дальше особенно в отношении адаптации класса к конкретной схеме БД.
 

[VS]

Guest
Автор оригинала: Jik
Класс ты не сам писал, он содранный и в инете в куче мест лежит, особенно умиляют эти глупые __LINE__
а класс использовать полезно, хотя окнечно кому как но мне например удобно одной строкой зафигачивать данные формы:
$db->insertform($h);
и не мучаться с addslashes и подготовкой данных к вставке, класс все сделает, код читабильнее ошибок меньше...продолжать можно дальше особенно в отношении адаптации класса к конкретной схеме БД.
Перечитай о чем говорили ... а?
Класс который был приведен - нафиг никому не нужен. Я вроде доступно обьяснил, какого типа классы полезны.
 

webdeveloper

Guest
Автор оригинала: Jik
Класс ты не сам писал, он содранный и в инете в куче мест лежит, особенно умиляют эти глупые __LINE__
а класс использовать полезно, хотя окнечно кому как но мне например удобно одной строкой зафигачивать данные формы:
$db->insertform($h);
и не мучаться с addslashes и подготовкой данных к вставке, класс все сделает, код читабильнее ошибок меньше...продолжать можно дальше особенно в отношении адаптации класса к конкретной схеме БД.
Ошибаешься, этот класс я именно сам написал от начала и до конца. А обрабтка ошибок там не глупая а нормальная. По крайней мере такая как везде должа быть. Она тебе точно скажет в какой строке и с в каком файле произошла ошибка.

Прежде чем судить людей по себе стоит немного подумать - а стоит ли. Короче ты не прав!
 

Jik

Guest
Автор оригинала: webdeveloper
Она тебе точно скажет в какой строке и с в каком файле произошла ошибка.
ты знаешь что такое __LINE__? это номер строки именно той в которой стоит эта константа, т.е. если я инклюдю твой клас в какой либо скрипт (1.php) и вызываю его скаже в строке $db->query("select..."); то если случиться баг то выдасться не строка 15 (т.е. то что нужно) а номер строки в файле где находиться класс... т.е. для того чтобы это корректно срабатывало нужно __LINE__ передавать дополнительным параметром! чтото типа $db->query("select...", __LINE__); у тебя же он передается другому методу и береться опятьтаки не из места откуда быз вызов метода запроса....

2[VS]: насчет именно этого класса, согласен, он не имеет какой либо ценности.
 

DiMA

php.spb.ru
Команда форума
тут пробовать нечего. На счет полезности топика можно спорить (развели уже тонну флейма), но с __LINE__ автор лоханулся...
 

webdeveloper

Guest
Автор оригинала: DiMA
тут пробовать нечего. На счет полезности топика можно спорить (развели уже тонну флейма), но с __LINE__ автор лоханулся...
Да почему же ? Эта константа говорит, что в файле таком то на такой то строке произошла такая то ошибка. И все!!! Что в этом плохого то?

А топик действительно какой то дурацкий. Хотел с людьми поделится, а ответ говорят что ты дурак и ничего не умеешь.
 

[VS]

Guest
Автор оригинала: webdeveloper
Да почему же ? Эта константа говорит, что в файле таком то на такой то строке произошла такая то ошибка. И все!!! Что в этом плохого то?
А топик действительно какой то дурацкий. Хотел с людьми поделится, а ответ говорят что ты дурак и ничего не умеешь.
__LINE__ у тебя действительно криво использована. А пришел ты узнать мнение людей об этом классе. Если плохие мнения не устраивают - нужно предупреждать.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху