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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

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

Всем доброго времени суток.
Сразу оговорюсь, что знания PHP у меня кое-какие есть, только с опытом напряг. Так что сильно не ругайтесь, а будет что сказать, внимательно выслушаю. Написал я тут пару классов для сайта по недвижимости и не знаю правильно ли я все делаю. Конечно все еще очень сыро, но не хотелось бы в начале наделать принципиальных ошибок, противоречащих ООП и PHP в целом.
Вот и сам код:

<?php
class mysql {
    private 
$host "localhost";
    private 
$user "root";
    private 
$pass "";
    
    private 
$cnxn;
    
    public function 
__construct($db) {
        
$this->cnxn mysql_connect($this->host$this->user$this->pass);
        if (
$this->cnxn) {
            if (
mysql_select_db($db$this->cnxn)) {
                return 
true;        
            } else {
                die(
mysql_error());
            }
        } else {
            die(
mysql_error());    
        }
    }

    
// $s - something / Например: '*'
    // $f - from / Например: 'table_name'
    // $w - where_opt / Например: array('type'=>'Апартаменты', 'price_min'=>'100000','price_max'=>'500000') или $_GET...
    // $o - order by / Например: 'price'
    // $d - direction / Например: 'ASC' (по умолчанию) или 'DESC'
    // $l - limit / Например: '5'
    
public function select($s$f$w=array(), $o=''$d='ASC'$l='') {
        
$query "SELECT " $s " FROM `" $f "` WHERE 1 = '1'";
        
        if (!empty(
$w)) {
            foreach (
$w as $key => $val) {
                if (
strstr($key"_") == "_min" && substr($key, -44) == "_min") {
                    
$query .= " AND `" substr($key0strlen($key)-4) . "` >= '" intval($val) . "'";
                } elseif (
strstr($key"_") == "_max" && substr($key, -44) == "_max") {
                    
$query .= " AND `" substr($key0strlen($key)-4) . "` <= '" intval($val) . "'";
                } else {
                    
$query .= " AND `$key` = '$val'";
                }
            }            
        }
        if (!empty(
$o)) $query .= " ORDER BY `".$o."` $d";
        if (!empty(
$l)) $query .= " LIMIT $l";
        
        
$result mysql_query($query$this->cnxn);
        if (
mysql_num_rows($result) > 0) {
            while (
$row mysql_fetch_assoc($result)) {
                
$array_from_db[] = $row;
            }    
            return 
$array_from_db;
        } else {
            echo 
"\t <div class=\"div\">\n"
                
."\t\t<h1 class=\"div_heading\">РЕЗУЛЬТАТ ПО ВАШЕМУ ЗАПРОСУ</h1>\n"
                
."\t\t<p class=\"warn\">По Вашему запросу ничего не найдено!</p>\n"
                
."\t </div>";
        }
    }
}

class 
item {
    public 
$id;
    public 
$thumb;
    public 
$type;
    public 
$country;
    public 
$region;
    public 
$price;
    public 
$area;
    public 
$rooms;
    
    public function 
__construct($array_from_db) {
        
$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'];
    }
    
    public function 
view() {
        
$this->price strrev(chunk_split(strrev($this->price),3" "));
        
$it "\t <div class='item'>\n"
            
"\t\t<a href='viewdetails.php?id=$this->id'>"
            
"<img src='$this->thumb' class='thumb' alt='' /></a>\n"
            
"\t\t<p><strong>Цена:</strong><span class='price'>$this->price &euro;</span></p>\n"
            
"\t\t<p><strong>Тип:</strong> $this->type</p>\n"
            
"\t\t<p><strong>Страна:</strong> $this->country</p>\n"
            
"\t\t<p><strong>Регион:</strong> $this->region</p>\n"
            
"\t\t<p><strong>Площадь:</strong> $this->area</p>\n";
        
$it     .=($this->type == "Земельные участки") ? "\t\t<br />\n" 
            
"\t\t<p><strong>Кол-во комнат:</strong> $this->rooms</p>\n";
        
$it     .="\t\t<p class='details'><a href='viewdetails.php?id=$this->id'>подробнее</a></p>\n"
            
"\t </div>";
        return 
$it;
    }
}
?>

А пользоваться этим можно так:

<?php
$mysql 
= new mysql('db_name');
$a $mysql->select('*','items',array('price_min'=>'100000','price_max'=>'500000')); // или $a = $mysql->select('*','items',$_GET);

foreach ($a as $val) {
    
$item = new item($val);
    echo 
$item->view();
}
?>


Подскажите пожалуйста что здесь нужно исправить или можно подправить. Заранее благодарю.

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

Зачем изобретать велосипед? В реппозитории РНР есть готовые решения, которые давно проверены и оттестированы

http://pear.php.net/search.php?q=mysql&in=packages&x=0&y=0

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

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

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

Вообще у меня какая-то классофобия :) Недолюбливаю я их, хоть и понимаю что они могут некоторые вещи облегчить.

Вот ваш, помоему, довольно енплохой класс и, оптяь же помоему, довольно удобный.

ЗЫ. сам код ен смотрел, только пример... он показался мне удобным ;)




mihdan, если программисты будут пользоваться только готовым, то они деградируют :) Лично мне всегда было удобнее своим пользоваться и мне удобнее потратить лишний день на арзработку своего компонента\функции, чем учится работать с чужим :)

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

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

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

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

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

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

DEM,

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

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

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

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

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

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

  Ответить  
 
 автор: 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   (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;", то не совсем понятно что представляет из себя класс. Или я Вас не правильно понял или не понял как правильно создавать классы...

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

  Ответить  
 
 автор: 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

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

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

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

  Ответить  
 
 автор: 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()" тоже желательно бы переделать с тем, чтобы сделать его более универсальным.
В общем, если будут у кого-нибудь замечания или советы, буду весьма благодарен, т.к. это для меня очень важно...

  Ответить  
Rambler's Top100
вверх

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