Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Классы для работы с MySQL (зацените, пожалуйста)

Сообщения:  [1-10]   [11-13] 

 
 автор: newProgrammer   (28.02.2009 в 18:00)   письмо автору
 
   для: newProgrammer   (18.02.2009 в 19:51)
 

Как и обещал, после прочтения книжек и статей по ООП, решил заново сесть за написание своих классов, вернее, одного класса - "item". Я понял, что он у меня главный, т.к. все операции с БД и сайт в цлом связвны именно с этим классом. Класс "item" у меня абстрактный, потому, что это м.б. что угодно: от недвижимого имущества (как в моем случае) до обыкновенной статьи. Для начала, интерфейс класса, чтоб было понятно:
<?php
interface intItem {
     public function 
append_to($table);
     public function 
get_from($table$field$orderby$dir$limit);
     public function 
remove_from($table);
     public function 
modify_in($table$sets);
     public function 
array_to_string($array);
}
?>

А вот и сам класс:
<?php
abstract class absItem implements intItem {
    public 
$prop;
    
/*
В качестве параметра принимает как массив так и строку. Строка может быть удобной в методах данного класса.
*/
    
public function __construct($arg) {
        if (
is_array($arg) && !empty($arg)) {
            foreach (
$arg as $key => $val) {
                
$this->prop[$key] = $val;
            }
        } elseif (
is_string($arg)) {
            
$this->prop $arg;
        }
    }
    
    public function 
append_to($table) {
        foreach (
$this->prop as $field => $value) {
            
$fields .= "`"$field."`, ";
            
$values .= "'"$value."', ";
        }
        
$fields substr($fields,0,-2);
        
$values substr($values,0,-2);
        
$query .= "INSERT INTO `".$table."` (".$fields.") VALUES (".$values.")";
        
        print(
$query);
    }
    
    public function 
get_from($table$field$orderby$dir$limit) {
        
$where $this->prop;
        
$where $this->array_to_string($where);
        
//...
        //...
    
}
    
    public function 
remove_from($table) {
        
$where $this->prop;
        if (
is_array($where) && !empty($where)) {
            
$query  "DELETE FROM `{$table}` WHERE 1='1'";
            
$query .= $this->array_to_string($where);
        } elseif (
is_string($where)) {
            
$query "DELETE FROM `{$table}` WHERE {$where}";
        }
        
        print(
$query);
    }
    
    public function 
modify_in($table$sets) {
        
$where $this->prop;
        if (
is_array($where) && !empty($where)) {
            foreach (
$sets as $field => $value) {
                
$set .= "`".$field."` = '".$value."', ";
            } 
            
$set substr($set,0,-2);
            
$query  "UPDATE `{$table}` SET {$set} WHERE 1='1'";
            
$query .= $this->array_to_string($where);
        } elseif (
is_string($where)) {
            
$query "UPDATE `{$table}` SET `{$key}` = '{$val}' WHERE {$where}";
        }
        
        print(
$query);
    }
    
    public function 
array_to_string($array) {
        foreach (
$array as $key => $val) {
            if (
strstr($key"_") == "_min" && substr($key, -44) == "_min") {
                
$where .= " AND `" substr($key0strlen($key)-4) . "` >= '" intval($val)."'";
            } elseif (
strstr($key"_") == "_max" && substr($key,-4,4) == "_max") {
                
$where .= " AND `" substr($key0strlen($key)-4) . "` <= '" intval($val)."'";
            } else {
                
$where .= " AND `$key` = '$val'";
            }
        }
        return 
$where;
    }
}
?>

Пользоваться этим так:
<?php
class item extends absItem { }

$c = new item(array('type' => 'house''price' => '100''area' => '50'));
$c->append_to('table_name');
print(
"<br /><br />");
$c->remove_from('table_name');
print(
"<br /><br />");
$c->modify_in('table_name', array('type' => 'villa''price' => '200'));
?>


Класс почти готов, только пока ничего не делает, а просто выводит строку запроса, чтобы посмотреть как все рабоает. Метод "get_from()" совсем не готов, т.к. я пока думаю как лучше его реализовать. Метод "array_to_string()" тоже желательно бы переделать с тем, чтобы сделать его более универсальным.
В общем, если будут у кого-нибудь замечания или советы, буду весьма благодарен, т.к. это для меня очень важно...

  Ответить  
 
 автор: newProgrammer   (22.02.2009 в 15:08)   письмо автору
 
   для: Axxil   (16.02.2009 в 09:31)
 

1. Скажите, пожалуйста, а почему Вы считаете, что под каждый новый запрос надо писать новый класс item? Я так и не понял...
2. Вы пишете, что логичнее будет задать только одно свойство для класса ($this->array = $array_from_db). Не знаю,чем Вы это обосновываете, но в и-нете во всех статьях об ООП учат сразу задавать все свойста, которую напрямую относятся к классу. Например, если это класс "page", о сразу задать такие свойства как "url", "title" и т.д.:

<?php
class page {
public 
$url;
public 
$title;
}
?>
, а если написать "public $array;", то не совсем понятно что представляет из себя класс. Или я Вас не правильно понял или не понял как правильно создавать классы...

Буду благодарен если проясните.

  Ответить  
 
 автор: mihdan   (18.02.2009 в 23:18)   письмо автору
 
   для: DEM   (15.02.2009 в 23:48)
 

Нет, если человек написал для того, чтобы научится писать правильный, удобный, рабочий код, то я только за. Да и критику нужно принимать от двух полюсов. На то это и форум по РНР ;)

  Ответить  
 
 автор: newProgrammer   (18.02.2009 в 19:51)   письмо автору
 
   для: Loki   (18.02.2009 в 15:50)
 

На такие запросы этот класс не расчитан... Наверное проще и универсальнее написать класс, где запросы бы писались самим разработчиком, а не генерировались методами класса.

PS Все равно я пока не сдаюсь. Чувствую надо еще немного почитать про ООП. Как напишу что-нибудь по-лучше выложу сюда на всеобщее обозрение.

  Ответить  
 
 автор: Loki   (18.02.2009 в 15:50)   письмо автору
 
   для: newProgrammer   (15.02.2009 в 20:22)
 

Что-то я не понял как эта штука работает.
Как, например будет выглядеть запрос типа такого:
SELECT t1.field1, t2.field2 FROM table1 t1 LEFT JOIN table2 t2 ON t1.field3=t2.field3 WHERE t1.price_min BETWEEN 100 AND 200 LIMIT 10

  Ответить  
 
 автор: cheops   (18.02.2009 в 15:13)   письмо автору
 
   для: STEVER   (17.02.2009 в 20:17)
 

>крайности
В крайности впадать действительно не стоит, однако, политику создания собственного программного обеспечения проводить можно и нужно. Конкуренция ещё никому не помешала, да и уровень разработчика при создании собственного приложения повышается гораздо быстрее и эффективнее, чем при использовании чужих.

  Ответить  
 
 автор: STEVER   (17.02.2009 в 20:17)   письмо автору
 
   для: DEM   (15.02.2009 в 23:48)
 

DEM,

тут главное не впадать в две крайности:
- отрицать все готовое
- писать все свое

Писать все свое: это ты сначала напишешь на напишешь на асме Сишку, потом на Сишке сделаешь Пхп, ну а потом уже .... Да, и про ОС не забудь, ее бы тоже неплохо запедалить ;)

  Ответить  
 
 автор: Axxil   (16.02.2009 в 09:31)   письмо автору
 
   для: newProgrammer   (15.02.2009 в 20:22)
 

Главное преимущество классов - повторное использование кода. В вашем случае под каждый новый запрос надо писать новый класс item

Вот это вот вообще жесть:

        $this->id         = $array_from_db['id'];
        $this->thumb     = $array_from_db['thumb'];
        $this->type     = $array_from_db['type'];
        $this->country     = $array_from_db['country'];
        $this->region     = $array_from_db['region'];
        $this->price     = $array_from_db['price'];
        $this->area     = $array_from_db['area'];
        $this->rooms     = $array_from_db['rooms']; 


Гораздо логичнее тогда уж написать $this->array = $array_from_db и дальше внутри класса использовать массив.

В чём смысл назначения каждому элементу массива своего отдельного свойства?

PS Первым делом, проектируя классы нужно задавать вопрос в чём смысл и в чём выгода. Если их нет, то надо искать другой путь.

  Ответить  
 
 автор: newProgrammer   (16.02.2009 в 00:41)   письмо автору
 
   для: DEM   (15.02.2009 в 23:48)
 

Спасибо за положительный отзыв - отличная мотивация для начинающего вроде меня. С таким настроем никакая критика нестрашна. :)

Таких фобий как у Вас у меня нет, просто есть необходимость освоить ООП.

PS Тоже всегда старался писать свой код, а уж если и использую чужой, то сначало досконально его изучу, а потом уже и применяю. Не могу пользоваться кодом, в котором не знаю как все работатет.

PPS Жду, как говорится, конструктивной критики!

  Ответить  
 
 автор: newProgrammer   (16.02.2009 в 00:26)   письмо автору
 
   для: mihdan   (15.02.2009 в 23:38)
 

Я не хочу быть велосипедистом и ездить на велосипеде, сделанном кем-то. Я хочу уметь их делать сам. Поэтому учусь, что называется, методом проб и ошибок. Хотя, я не против того, чтоб совмещать и то и другое. Спасибо за ссылку.

  Ответить  

Сообщения:  [1-10]   [11-13] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования