Автор Тема: класс для работы с mysql  (Прочитано 11827 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #15 : 08 Декабря 2004, 00:03:30 »
Макс
это все понятно и правильно. А что если я просто не хочу юзать классы? Что такое ООП, создание и описавыние объектов я знаю, и классы писать для php я умею, мне просто не нравится и все =). Я не понимаю Зачем юзать класс даже в 7 кило, если от меня требуется 1 коннект и тот для отоброжении 10 последних новостей? А зачем юзать класс если на странице всего 5-10 запросов, настройки сайта, пара топов, контент и прочая требудень?

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

Оффлайн Daiz13

  • наблюдатель
  • Постоялец
  • ***
  • Сообщений: 150
  • +0/-0
  • 2
    • Просмотр профиля
    • http://rg.com.ua/
класс для работы с mysql
« Ответ #16 : 08 Декабря 2004, 12:44:56 »
не вижу связи между процедурным подходом и портируемостью кода...

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

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

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

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #17 : 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();


или писать на структурированном языке, таская текущий ид соеденения, гемороиться с циклами и т.д.:


<?php
    
/* Соединение, выбор БД */
    
$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 "<table>\\n";
    while (
$line mysql_fetch_array($resultMYSQL_ASSOC)) {
        print 
"\\t<tr>\\n";
        foreach (
$line as $col_value) {
  print 
"\\t\\t<td>$col_value</td>\\n";
        }
        print 
"\\t</tr>\\n";
    }
    print 
"</table>\\n";

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

    
/* Закрытие соединения */
    
mysql_close($link);
?>

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #18 : 08 Декабря 2004, 16:26:27 »
2 Daiz13
Тогда определи мою позицию в этой эволюции. Я терпеть не могу классы и плохо переношу функции.

2 Алексей
Я не считаю таскать за собой id соединения, и циклы гемороем. А вообще, использовать mysql_fetch_array(); не безопасно. намного безопаснее юзать mysql-result();

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
класс для работы с mysql
« Ответ #19 : 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 для работы с БД, использующих ООП-стиль "соединение с БД" - это отдельный класс/компонент.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #20 : 08 Декабря 2004, 17:01:55 »
Цитировать
Макс:
аргументируй безопасность.

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

bla.ru/?id=325

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

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


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

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


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

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


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

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


Возможно. иностранным разработчикам никогда не понять русских программеров.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
класс для работы с mysql
« Ответ #21 : 08 Декабря 2004, 17:14:23 »
Цитировать
Tryapkonator:
 Очень просто. допустим ты НЕ отфильтровал ковычку,

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

Я сам в течение года не признавал классы, потом втянулся :)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #22 : 10 Декабря 2004, 06:44:50 »
Цитировать
Макс:
Нет, нет, нет . Это все проблемы фильтрации данных и не имеют отношения к безопасности функции.

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

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

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

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

После этого топа я походу тоже =) Типа уговорили =)))) спасибо =)))))))))))))))))

Оффлайн Croaker

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 927
  • +0/-0
  • 0
    • Просмотр профиля
    • http://alex-files.ru
класс для работы с mysql
« Ответ #23 : 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);
}


Тоже самое, можно сделать в виде обычной функции, но оформление в виде класса гораздо удобней.
Не все коту матрица.

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #24 : 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 за подсказку, так действительно можно экономить кучу времени и убирать лишнюю писанину.

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #25 : 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 ";", но это опечатка. А вообще респект автору! Спасибо что есть те кто кроме как "надобы тож такое написать" да "ха-ха" реально что-то делают.

Оффлайн Tryapkonator

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 92
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #26 : 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();
	
}

Круто =)))

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
класс для работы с mysql
« Ответ #27 : 12 Декабря 2004, 19:02:32 »
Проверку
if($this->is_connected)  ...
достаточно делать только в одном методе (sql_dbquery) и только один раз.

В методе sql_gen_update у тебя баг.
UPDATE-запросы обычно выглядят примерно так :
UPDATE tab_name SET ...... WHERE tab_id = $id
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Croaker

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 927
  • +0/-0
  • 0
    • Просмотр профиля
    • http://alex-files.ru
класс для работы с mysql
« Ответ #28 : 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 "%ася%"

И в этом случае лучше не громоздить тучу параметров в суперуниверсальную ф-цию, а просто составить запрос. Так проще. ;)
Не все коту матрица.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
класс для работы с mysql
« Ответ #29 : 15 Декабря 2004, 15:40:56 »
Алексей
Ты передергиваешь.
За это буду руки выдергивать.
выкини из своего кода цикл вывода.
получение же данных из бд прекрасно пишется и функцией, без ооп.

Tryapkonator
Цитировать

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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28