Forum Webscript.Ru

Программирование => PHP => Тема начата: Banisher от 27 Ноября 2004, 15:54:44

Название: класс для работы с mysql
Отправлено: Banisher от 27 Ноября 2004, 15:54:44
hi all,
написал класс для работы с mysql хотелось бы услышать ваше мнение о субже.
Вот линк на zip архив: classmysql.zip (http://darkpath.ru/stuff/mysqlclass.zip )
Название: класс для работы с mysql
Отправлено: Алексей от 27 Ноября 2004, 19:48:57
Чёй-то многовато как то проверок на ошибки в каждой функции...
ИМХО переменую connected надо было как-то по другому использовать, а не булево значение туда пихать.
В принципе, класс у тебя не особо законченый. Многих полезных и важных функций нет, зато есть "количество полей в таблице". Ты часто такие методы используешь? :)



Ну да ладно, главное что б тебе удобно работать было.
зЫ: Надо тоже такой классик написать. Ждите похожей темы :D
Название: класс для работы с mysql
Отправлено: Меняздесьдавнонет от 27 Ноября 2004, 20:41:00
Алексей
а зачем надо?
чем не устраивают функции 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();
Название: класс для работы с mysql
Отправлено: Алексей от 27 Ноября 2004, 20:49:32
Цитировать
RomikChef:
а зачем надо?
чем не устраивают функции API?

ну как... для удобства того же...
Название: класс для работы с mysql
Отправлено: Меняздесьдавнонет от 27 Ноября 2004, 20:58:51
а в чем конкретно удобство-то?
Название: класс для работы с mysql
Отправлено: Алексей от 27 Ноября 2004, 21:43:37
ну, хотя бы в написании кода. легче написать $DB->sbselect("sql"), нежели писать while($temp = mysql_fetch_assoc($result)){...
Название: класс для работы с mysql
Отправлено: Меняздесьдавнонет от 27 Ноября 2004, 22:02:29
вайл тебе все равно нужен.
далеко не всегда оптимальным решением является загнать все данные в массив. поскольку практически со стопроцентной вероятностью тебе придется все равно его перебирать и модифицировать.
так что, вайл все равно придется писать.
Название: класс для работы с mysql
Отправлено: Banisher от 28 Ноября 2004, 00:03:18
Цитировать
Алексей:
Многих полезных и важных функций нет

Каких например?
Название: класс для работы с mysql
Отправлено: Макс от 28 Ноября 2004, 13:35:51
Цитировать
RomikChef:
по мне - так нужна только одна функция- получения строки или одного значения из базы.

+
1. получение ассоциативного массива из запроса типа : SELECT key, value FROM tab
2. получение "столбца" в массив (SELECT email FROM tab)
3. получение всех записей в двумерный массив
4. экранирование спец-символов (с учетом magic_quotes_gpc)
5. Генерирование INSERT/UPDATE запросов
6. Автоматическое соединение с БД (соединение с БД только когда действительно нужно выполнить запрос, а не при каждом запросе скрипта)
7. Работая через класс можно удобно вести логи SQL-запросов.

Вобщем-то все это можно и с помощью функций сделать (кому как удобно)
Название: класс для работы с mysql
Отправлено: Алексей от 28 Ноября 2004, 19:02:08
Цитировать
Banisher:
Каких например?

сообщение выше (Макса) прочти...
Название: класс для работы с mysql
Отправлено: Tryapkonator от 07 Декабря 2004, 12:14:19
2 Макс
1, 2. А чем тебе mysql_result не нравится?
4. Как будто НЕ классами это троудно решается? Это решается одной строкой в .htaccess
6. Не понимаю зачем? Если у меня все страницы так и так конеектятся к БД, зачем мне вместо одного коненнекта юзать 10 (если допустм на странице 10 запросов)?
7. Как будто руками логи вести нельзя.

Впрочем я против классов. классы должны помогать, а не загромождать код. В данном случае еще возможно использование классов для каких то конкретных примеров, но зачем писать громадный класс, который можно заменить сочетанием mysql_query() и mysql_result() ???
Название: класс для работы с mysql
Отправлено: Алексей от 07 Декабря 2004, 13:24:36
ха-ха
Название: класс для работы с mysql
Отправлено: Tryapkonator от 07 Декабря 2004, 14:08:07
Не, ну а че "Ха-ха"? Может еще класс напишешь для вывода html на экран, типа замена стандартному echo?

2 Модеры.
Сорри за оффтоп.
Название: класс для работы с mysql
Отправлено: Daiz13 от 07 Декабря 2004, 16:14:46
Banisher
формирование ошибки я бы отдельной функцией сделал, а в остально тебе решать - по ходу использования сам разберешся что тебе необходимо добавить/переделать.

Цитировать
Tryapkonator:
Не понимаю зачем? Если у меня все страницы так и так конеектятся к БД, зачем мне вместо одного коненнекта юзать 10 (если допустм на странице 10 запросов)?

речь не о 10-ти конектах, а о автоматическом коннекте к базе не при создании обьекта, а при _первом_ вызове какой-ндь его функции требующей соединения с базой.

Цитировать
Tryapkonator:
7. Как будто руками логи вести нельзя.

ну конечно, намного удобнее после каждого mysql_query($query) дописывать log_query($query) чем написать это один раз в классе.

ИМХО, все это флейм, и вопрос удобства. Хотя, писать большой проект, без класса для работы с базами это преступление...
Название: класс для работы с mysql
Отправлено: Макс от 07 Декабря 2004, 17:05:00
1. / 2. - скорость кодинга + по 2. ты не понял о чем я писал.
6. Нет, коннект будеет один, если будет более одного реального запроса к БД
7. опять же, скорость кодинга.


Цитировать
Tryapkonator:
но зачем писать громадный класс,
Все что я описал выше + еще немного, умещается в класс в 7 Кб. Это много ? :)


PS
все это можно организовать с помощью обычных функций.
И это было бы тоже нормальным решением если бы у ПХП были namespaces.
Название: класс для работы с mysql
Отправлено: Tryapkonator от 08 Декабря 2004, 00:03:30
Макс
это все понятно и правильно. А что если я просто не хочу юзать классы? Что такое ООП, создание и описавыние объектов я знаю, и классы писать для php я умею, мне просто не нравится и все =). Я не понимаю Зачем юзать класс даже в 7 кило, если от меня требуется 1 коннект и тот для отоброжении 10 последних новостей? А зачем юзать класс если на странице всего 5-10 запросов, настройки сайта, пара топов, контент и прочая требудень?

Блин, че творится с миром =). Раньше иметь CMS на БД было мажерно, теперь гостевые толкьо на БД ставят. Классы раньше юзали только при написании игр, теперь для чертовых коннектов к БД... Может это и не плохо, но код должен быть построен таким образом, чтобы вы легко смогли перетащить его на любой другой язык программирования ИМХО. для меня это важнее. Я понимаю если класс действительно спасает, но для такой фигни... Что дальше? Класс для замены echo итп?
Название: класс для работы с mysql
Отправлено: Daiz13 от 08 Декабря 2004, 12:44:56
не вижу связи между процедурным подходом и портируемостью кода...

ИМХО, эволюция пхп-программера состоит из 3 этапов:
1) фанат процедур
2) фанат классов
3) понимающий преимущества и недостатки каждого подхода

Цитировать
Tryapkonator:
Что дальше? Класс для замены echo итп?

этих класов уже столько написано...  все зависит от масштабов применения. я, лично, использую класс для генерации форм в админ части.
Название: класс для работы с mysql
Отправлено: Алексей от 08 Декабря 2004, 12:57:10
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\\n";
        }
        print "\\t\\n";
    }
    print "
$col_value
\\n";

    /* Освобождение resultset */
    mysql_free_result($result);

    /* Закрытие соединения */
    mysql_close($link);
?>
Название: класс для работы с mysql
Отправлено: Tryapkonator от 08 Декабря 2004, 16:26:27
2 Daiz13
Тогда определи мою позицию в этой эволюции. Я терпеть не могу классы и плохо переношу функции.

2 Алексей
Я не считаю таскать за собой id соединения, и циклы гемороем. А вообще, использовать mysql_fetch_array(); не безопасно. намного безопаснее юзать mysql-result();
Название: класс для работы с mysql
Отправлено: Макс от 08 Декабря 2004, 16:45:37
Цитировать
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 для работы с БД, использующих ООП-стиль "соединение с БД" - это отдельный класс/компонент.
Название: класс для работы с mysql
Отправлено: Tryapkonator от 08 Декабря 2004, 17:01:55
Цитировать
Макс:
аргументируй безопасность.

Очень просто. допустим ты НЕ отфильтровал ковычку, или даже отфильтровал, но не поставил ограничение на количество символов при передаче числового значения. Например так.

bla.ru/?id=325

т.е. я огу вставить любой sql-запрос. С помощью UNION  я могу получить доступ к другим таблицам и БД, если хватит прав. Если ты достаешь данные из БД, то мне остается только угадать количество достоваемых данных, точнее не угадать, а подобрать. Если ты юзаешь mysql_result();, то мне придется еще угадывать имена полей.

Цитировать
Макс:
Значит будет больше времени попить пива


наверно мне этого не понять... я пива не пью просто =))) точно, наверно поэтому я это не понимаю =))))))))) макс, дай пять =)

Цитировать
Макс:
если ты умеешь использовать классы только для написания игр, значит ты не умеешь их использовать вовсе.


Это лишь пример. я хотел сказать что их юзали только в действительно сложных ситуациях.

Цитировать
Макс:
То есть, не считая С/С++, при переносе твоего скрипта на другой язык тебе прийдется использовать ООП. И никуда ты от этого не денешься.


Ок, с БД все понятно. допустим признаю свою ошибку, что для работы с БД лучше использовать ООП, но я говорю вцелом о классах. А что если мне нужно перенести код на VB шестой версии?

Цитировать
Макс:
Во многих API для работы с БД, использующих ООП-стиль "соединение с БД" - это отдельный класс/компонент.


Возможно. иностранным разработчикам никогда не понять русских программеров.
Название: класс для работы с mysql
Отправлено: Макс от 08 Декабря 2004, 17:14:23
Цитировать
Tryapkonator:
 Очень просто. допустим ты НЕ отфильтровал ковычку,

Нет, нет, нет . Это все проблемы фильтрации данных и не имеют отношения к безопасности функции.
В мане кстати сказано, что mysql_fetch_*() - работают быстрее чем [p]mysql_result[/p]
Цитировать
Tryapkonator:
А что если мне нужно перенести код на VB шестой версии?
я никогда не интересовался VB, поэтому не знаю. Полагаю что там работа через ADO, а значит тоже ООП.
Цитировать
Tryapkonator:
но я говорю вцелом о классах.

Я сам в течение года не признавал классы, потом втянулся :)
Название: класс для работы с mysql
Отправлено: Tryapkonator от 10 Декабря 2004, 06:44:50
Цитировать
Макс:
Нет, нет, нет . Это все проблемы фильтрации данных и не имеют отношения к безопасности функции.

да, но потенциальная опасность, как ни крути.

Цитировать
Макс:
я никогда не интересовался VB, поэтому не знаю. Полагаю что там работа через ADO, а значит тоже ООП.

VB 6.0 не ООП язык.

Цитировать
Макс:
Я сам в течение года не признавал классы, потом втянулся

После этого топа я походу тоже =) Типа уговорили =)))) спасибо =)))))))))))))))))
Название: класс для работы с mysql
Отправлено: Croaker от 10 Декабря 2004, 16:22:42
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);
}


Тоже самое, можно сделать в виде обычной функции, но оформление в виде класса гораздо удобней.
Название: класс для работы с mysql
Отправлено: Tryapkonator от 12 Декабря 2004, 00:09:20
начал переписывать предоставленный класс для себя. В нем функция запроса к БД выглядит так...

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 за подсказку, так действительно можно экономить кучу времени и убирать лишнюю писанину.
Название: класс для работы с mysql
Отправлено: Tryapkonator от 12 Декабря 2004, 00:20:54
А еще вот тут

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 ";", но это опечатка. А вообще респект автору! Спасибо что есть те кто кроме как "надобы тож такое написать" да "ха-ха" реально что-то делают.
Название: класс для работы с mysql
Отправлено: Tryapkonator от 12 Декабря 2004, 00:52:12
Хы хы хы =))) вот еще 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();
}

Круто =)))
Название: класс для работы с mysql
Отправлено: Макс от 12 Декабря 2004, 19:02:32
Проверку
if($this->is_connected)  ...
достаточно делать только в одном методе (sql_dbquery) и только один раз.

В методе sql_gen_update у тебя баг.
UPDATE-запросы обычно выглядят примерно так :
UPDATE tab_name SET ...... WHERE tab_id = $id
Название: класс для работы с mysql
Отправлено: Croaker от 14 Декабря 2004, 13:06:50
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 "%ася%"

И в этом случае лучше не громоздить тучу параметров в суперуниверсальную ф-цию, а просто составить запрос. Так проще. ;)
Название: класс для работы с mysql
Отправлено: Меняздесьдавнонет от 15 Декабря 2004, 15:40:56
Алексей
Ты передергиваешь.
За это буду руки выдергивать.
выкини из своего кода цикл вывода.
получение же данных из бд прекрасно пишется и функцией, без ооп.

Tryapkonator
Цитировать

вообще, использовать mysql_fetch_array(); не безопасно. намного безопаснее юзать mysql-result();

Я давно не использовал на этом форуме слово "идиотизм".
Но никаким другим это твое высказывание охарактеризовать невозможно. Как и последующие жалкие попытки доказать свою точку зрения.