Forum Webscript.Ru
Программирование => PHP => Тема начата: Banisher от 27 Ноября 2004, 15:54:44
-
hi all,
написал класс для работы с mysql хотелось бы услышать ваше мнение о субже.
Вот линк на zip архив: classmysql.zip (http://darkpath.ru/stuff/mysqlclass.zip )
-
Чёй-то многовато как то проверок на ошибки в каждой функции...
ИМХО переменую connected надо было как-то по другому использовать, а не булево значение туда пихать.
В принципе, класс у тебя не особо законченый. Многих полезных и важных функций нет, зато есть "количество полей в таблице". Ты часто такие методы используешь? :)
Ну да ладно, главное что б тебе удобно работать было.
зЫ: Надо тоже такой классик написать. Ждите похожей темы :D
-
Алексей
а зачем надо?
чем не устраивают функции API?
по мне - так нужна только одна функция- получения строки или одного значения из базы.
а для остального ценность довольно сомнительна
какая разница, как писать:
$mysql->query($query);
if ($mysql->num_rows()) {
$row=mysql->fetch_row();
или
$res=mysql_query($query);
if ($mysql_num_rows($res)) {
$row=mysql_fetch_row();
-
RomikChef:
а зачем надо?
чем не устраивают функции API?
ну как... для удобства того же...
-
а в чем конкретно удобство-то?
-
ну, хотя бы в написании кода. легче написать $DB->sbselect("sql"), нежели писать while($temp = mysql_fetch_assoc($result)){...
-
вайл тебе все равно нужен.
далеко не всегда оптимальным решением является загнать все данные в массив. поскольку практически со стопроцентной вероятностью тебе придется все равно его перебирать и модифицировать.
так что, вайл все равно придется писать.
-
Алексей:
Многих полезных и важных функций нет
Каких например?
-
RomikChef:
по мне - так нужна только одна функция- получения строки или одного значения из базы.
+
1. получение ассоциативного массива из запроса типа : SELECT key, value FROM tab
2. получение "столбца" в массив (SELECT email FROM tab)
3. получение всех записей в двумерный массив
4. экранирование спец-символов (с учетом magic_quotes_gpc)
5. Генерирование INSERT/UPDATE запросов
6. Автоматическое соединение с БД (соединение с БД только когда действительно нужно выполнить запрос, а не при каждом запросе скрипта)
7. Работая через класс можно удобно вести логи SQL-запросов.
Вобщем-то все это можно и с помощью функций сделать (кому как удобно)
-
Banisher:
Каких например?
сообщение выше (Макса) прочти...
-
2 Макс
1, 2. А чем тебе mysql_result не нравится?
4. Как будто НЕ классами это троудно решается? Это решается одной строкой в .htaccess
6. Не понимаю зачем? Если у меня все страницы так и так конеектятся к БД, зачем мне вместо одного коненнекта юзать 10 (если допустм на странице 10 запросов)?
7. Как будто руками логи вести нельзя.
Впрочем я против классов. классы должны помогать, а не загромождать код. В данном случае еще возможно использование классов для каких то конкретных примеров, но зачем писать громадный класс, который можно заменить сочетанием mysql_query() и mysql_result() ???
-
ха-ха
-
Не, ну а че "Ха-ха"? Может еще класс напишешь для вывода html на экран, типа замена стандартному echo?
2 Модеры.
Сорри за оффтоп.
-
Banisher
формирование ошибки я бы отдельной функцией сделал, а в остально тебе решать - по ходу использования сам разберешся что тебе необходимо добавить/переделать.
Tryapkonator:
Не понимаю зачем? Если у меня все страницы так и так конеектятся к БД, зачем мне вместо одного коненнекта юзать 10 (если допустм на странице 10 запросов)?
речь не о 10-ти конектах, а о автоматическом коннекте к базе не при создании обьекта, а при _первом_ вызове какой-ндь его функции требующей соединения с базой.
Tryapkonator:
7. Как будто руками логи вести нельзя.
ну конечно, намного удобнее после каждого mysql_query($query) дописывать log_query($query) чем написать это один раз в классе.
ИМХО, все это флейм, и вопрос удобства. Хотя, писать большой проект, без класса для работы с базами это преступление...
-
1. / 2. - скорость кодинга + по 2. ты не понял о чем я писал.
6. Нет, коннект будеет один, если будет более одного реального запроса к БД
7. опять же, скорость кодинга.
Tryapkonator:
но зачем писать громадный класс,
Все что я описал выше + еще немного, умещается в класс в 7 Кб. Это много ? :)
PS
все это можно организовать с помощью обычных функций.
И это было бы тоже нормальным решением если бы у ПХП были namespaces.
-
Макс
это все понятно и правильно. А что если я просто не хочу юзать классы? Что такое ООП, создание и описавыние объектов я знаю, и классы писать для php я умею, мне просто не нравится и все =). Я не понимаю Зачем юзать класс даже в 7 кило, если от меня требуется 1 коннект и тот для отоброжении 10 последних новостей? А зачем юзать класс если на странице всего 5-10 запросов, настройки сайта, пара топов, контент и прочая требудень?
Блин, че творится с миром =). Раньше иметь CMS на БД было мажерно, теперь гостевые толкьо на БД ставят. Классы раньше юзали только при написании игр, теперь для чертовых коннектов к БД... Может это и не плохо, но код должен быть построен таким образом, чтобы вы легко смогли перетащить его на любой другой язык программирования ИМХО. для меня это важнее. Я понимаю если класс действительно спасает, но для такой фигни... Что дальше? Класс для замены echo итп?
-
не вижу связи между процедурным подходом и портируемостью кода...
ИМХО, эволюция пхп-программера состоит из 3 этапов:
1) фанат процедур
2) фанат классов
3) понимающий преимущества и недостатки каждого подхода
Tryapkonator:
Что дальше? Класс для замены echo итп?
этих класов уже столько написано... все зависит от масштабов применения. я, лично, использую класс для генерации форм в админ части.
-
Tryapkonator
Твои аргументы не впечатляют. Такое ощущение, что ты сам себе пытаешся доказать, что классы это плохо. Система самозащиты эдакая, на психологическом уровне.
Tryapkonator:
Раньше иметь CMS на БД было мажерно, теперь гостевые толкьо на БД ставят.
гыыыы....
Tryapkonator:
Классы раньше юзали только при написании игр, теперь для чертовых коннектов к БД...
гааааа!!!
Tryapkonator:
Может это и не плохо, но код должен быть построен таким образом, чтобы вы легко смогли перетащить его на любой другой язык программирования ИМХО
хорошо, что ИМХО.
Ну уж коннеты к БД уж лучше на классах делать.
Что лучше?
//Инициализация главного класса
$myDB = new DB;
//Получаем общее кол-во записей в "гостевой"
$all_gb_count = $myDB->get_one("SELECT COUNT(*) FROM gb");
//Получить значения
$DHTML = $myDB->get_rezar("SELECT .....", "ASSOC");
//деструктор
$myDB->dest();
или писать на структурированном языке, таская текущий ид соеденения, гемороиться с циклами и т.д.:
/* Соединение, выбор БД */
$link = mysql_connect("mysql_host", "mysql_user", "mysql_password")
or die("Could not connect");
print "Connected successfully";
mysql_select_db("my_database") or die("Could not select database");
/* Выполнение SQL query */
$query = "SELECT * FROM my_table";
$result = mysql_query($query) or die("Query failed");
/* Печать результатов в HTML */
print "\\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
print "\\t\\n";
foreach ($line as $col_value) {
print "\\t\\t$col_value | \\n";
}
print "\\t
\\n";
}
print "
\\n";
/* Освобождение resultset */
mysql_free_result($result);
/* Закрытие соединения */
mysql_close($link);
?>
-
2 Daiz13
Тогда определи мою позицию в этой эволюции. Я терпеть не могу классы и плохо переношу функции.
2 Алексей
Я не считаю таскать за собой id соединения, и циклы гемороем. А вообще, использовать mysql_fetch_array(); не безопасно. намного безопаснее юзать mysql-result();
-
Tryapkonator:
А вообще, использовать mysql_fetch_array(); не безопасно. намного безопаснее юзать mysql-result();
аргументируй безопасность.
Tryapkonator:
Я не считаю таскать за собой id соединения, и циклы гемороем.
это не геморой - это код, который тебе приходится писать, это твоя производительность труда. Код с импользованием классов (как в данном случае и функций) короче, а следовательно написан будет быстрее. Значит будет больше времени попить пива :beer:
Tryapkonator:
Классы раньше юзали только при написании игр, теперь для чертовых коннектов к БД..
если ты умеешь использовать классы только для написания игр, значит ты не умеешь их использовать вовсе.
Tryapkonator:
код должен быть построен таким образом, чтобы вы легко смогли перетащить его на любой другой язык программирования ИМХО. для меня это важнее
Давай посмотрим как работают с СУБД многие популярные языки.
С++ - насколько мне известно здесь нет одного стандарта для работы с БД. Поэтому есть как ООП-подходы (под Windows - ADO) так и функциональные подходы.
Java - использует JDBC (ООП)
Python - DB API (ООП)
PERL - DBII/DBD (ООП)
Delphi - BDE и куча всего другого (ООП)
.NET - ADO.NET (ООП)
То есть, не считая С/С++, при переносе твоего скрипта на другой язык тебе прийдется использовать ООП. И никуда ты от этого не денешься.
Кстати, по поводуTryapkonator:
Классы раньше юзали только при написании игр, теперь для чертовых коннектов к БД...
Во многих API для работы с БД, использующих ООП-стиль "соединение с БД" - это отдельный класс/компонент.
-
Макс:
аргументируй безопасность.
Очень просто. допустим ты НЕ отфильтровал ковычку, или даже отфильтровал, но не поставил ограничение на количество символов при передаче числового значения. Например так.
bla.ru/?id=325
т.е. я огу вставить любой sql-запрос. С помощью UNION я могу получить доступ к другим таблицам и БД, если хватит прав. Если ты достаешь данные из БД, то мне остается только угадать количество достоваемых данных, точнее не угадать, а подобрать. Если ты юзаешь mysql_result();, то мне придется еще угадывать имена полей.
Макс:
Значит будет больше времени попить пива
наверно мне этого не понять... я пива не пью просто =))) точно, наверно поэтому я это не понимаю =))))))))) макс, дай пять =)
Макс:
если ты умеешь использовать классы только для написания игр, значит ты не умеешь их использовать вовсе.
Это лишь пример. я хотел сказать что их юзали только в действительно сложных ситуациях.
Макс:
То есть, не считая С/С++, при переносе твоего скрипта на другой язык тебе прийдется использовать ООП. И никуда ты от этого не денешься.
Ок, с БД все понятно. допустим признаю свою ошибку, что для работы с БД лучше использовать ООП, но я говорю вцелом о классах. А что если мне нужно перенести код на VB шестой версии?
Макс:
Во многих API для работы с БД, использующих ООП-стиль "соединение с БД" - это отдельный класс/компонент.
Возможно. иностранным разработчикам никогда не понять русских программеров.
-
Tryapkonator:
Очень просто. допустим ты НЕ отфильтровал ковычку,
Нет, нет, нет . Это все проблемы фильтрации данных и не имеют отношения к безопасности функции.
В мане кстати сказано, что mysql_fetch_*() - работают быстрее чем [p]mysql_result[/p]Tryapkonator:
А что если мне нужно перенести код на VB шестой версии?
я никогда не интересовался VB, поэтому не знаю. Полагаю что там работа через ADO, а значит тоже ООП.
Tryapkonator:
но я говорю вцелом о классах.
Я сам в течение года не признавал классы, потом втянулся :)
-
Макс:
Нет, нет, нет . Это все проблемы фильтрации данных и не имеют отношения к безопасности функции.
да, но потенциальная опасность, как ни крути.
Макс:
я никогда не интересовался VB, поэтому не знаю. Полагаю что там работа через ADO, а значит тоже ООП.
VB 6.0 не ООП язык.
Макс:
Я сам в течение года не признавал классы, потом втянулся
После этого топа я походу тоже =) Типа уговорили =)))) спасибо =)))))))))))))))))
-
Tryapkonator
В класс можно засунуть стандартные операции, например инстерта или апдейта. Вот на вскидку:
function insert($table, $fields) {
if (!is_array($fields)) {
return false;
}
$dbQuery = "INSERT INTO ".$table." (id, ".(implode(",",array_keys($fields))).") VALUES (nextval(\'".$table."_seq\'), \'".implode("\',\'", $fields)."\');";
$this->execute($dbQuery);
}
Тоже самое, можно сделать в виде обычной функции, но оформление в виде класса гораздо удобней.
-
начал переписывать предоставленный класс для себя. В нем функция запроса к БД выглядит так...
function sql_dbquery($stmt){
if($this->connected){
$this->dbquery="";
if ($this->connected){
if (!$this->dbquery=mysql_query($stmt, $this->link))
{
$this->err = "Ошибка при выпoлнение запроса ";
$this->err .= $stmt;
$this->err .= mysql_errno($this->link);
$this->err .= " ";
$this->err .= mysql_error($this->link);
$this->err .= "\\n";
}
}
return $this->dbquery;
} else $this->err = "dbquery: Нет соединения с БД\\n";
$this->showerr();
}
?>
не понимаю зачем 2 раза делать if($this->connected)? Это опечатка или я что-то не понимаю?
кстати, спасибо Максу за действительно убедительные доказательсва, а не просто всякие "ха-ха". респект. Так действительно проще и быстрее, в некоторых случаях. Спасибо Croaker за подсказку, так действительно можно экономить кучу времени и убирать лишнюю писанину.
-
А еще вот тут
function rows_in_table($table)
{
if($this->connected)
{
if($this->isset_table($table))
{
$result = $this->dbquery("SELECT COUNT(*) AS cnt FROM ".$table);
$row = mysql_fetch_object($result);
return $row->cnt;;
} else $this->err = "Таблицы ".$table." нет в текщей БД
";
} else $this->err = "rows_in_table: нет соединения с сервером";
$this->showerr();
}
В строке return $row->cnt;; почему то 2 ";", но это опечатка. А вообще респект автору! Спасибо что есть те кто кроме как "надобы тож такое написать" да "ха-ха" реально что-то делают.
-
Хы хы хы =))) вот еще 2 функции к этому классу для генерации INSERT/UPDATE запросов, первая практически полностью стащена у Croaker, а вторую писал сам никуда не подглядывая =))) чесно! Пока не проверял, возможно накасячил =)
function sql_gen_insert($table, $fields){
if($this->connected){
if (!is_array($fields)){
$this->err="sql_gen_insert: попытка передать НЕ массив";
}else{
$dbQuery="INSERT INTO ".$table." (".(implode(",",array_keys($fields))).") VALUES (\'".implode("\', \'", $fields)."\')";
$this->sql_dbquery($dbQuery);
}
}else{
$this->err="sql_gen_insert: нет соединения с сервером";
}
$this->showerr();
}
function sql_gen_update($table, $fields){
if($this->connected){
if (!is_array($fields)){
$this->err="sql_gen_update: попытка передать НЕ массив";
}else{
foreach($fields as $key=>$value){
if($temp_data!=""){
$temp_data=$temp_data.", ".$key."=\'".$value."\'";
}else{
$temp_data=$key."=\'".$value."\'";
}
}
$dbQuery="UPDATE ".$table." SET $temp_data";
$this->sql_dbquery($dbQuery);
}
}else{
$this->err="sql_gen_insert: нет соединения с сервером";
}
$this->showerr();
}
Круто =)))
-
Проверку
if($this->is_connected) ...
достаточно делать только в одном методе (sql_dbquery) и только один раз.
В методе sql_gen_update у тебя баг.
UPDATE-запросы обычно выглядят примерно так :
UPDATE tab_name SET ...... WHERE tab_id = $id
-
Tryapkonator
Вот апдейт:
function update($table, $data, $id) {
foreach ($data as $f => $v) {
$str[] = $f." = \'".$v."\'";
}
$dbQuery = "UPDATE $table set ".implode(",", $str)." WHERE id = ".$id;
$this->execute($dbQuery);
}
Но практика показывает, что апдейты (в отличие от инсертов) бывают не универсальные. Например:
UPDATE ... SET date = NOW() where group_id = 777 or name like "%ася%"
И в этом случае лучше не громоздить тучу параметров в суперуниверсальную ф-цию, а просто составить запрос. Так проще. ;)
-
Алексей
Ты передергиваешь.
За это буду руки выдергивать.
выкини из своего кода цикл вывода.
получение же данных из бд прекрасно пишется и функцией, без ооп.
Tryapkonator
вообще, использовать mysql_fetch_array(); не безопасно. намного безопаснее юзать mysql-result();
Я давно не использовал на этом форуме слово "идиотизм".
Но никаким другим это твое высказывание охарактеризовать невозможно. Как и последующие жалкие попытки доказать свою точку зрения.