|
|
|
| Всем доброго времени суток.
Сразу оговорюсь, что знания 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, -4, 4) == "_min") {
$query .= " AND `" . substr($key, 0, strlen($key)-4) . "` >= '" . intval($val) . "'";
} elseif (strstr($key, "_") == "_max" && substr($key, -4, 4) == "_max") {
$query .= " AND `" . substr($key, 0, strlen($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 €</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();
}
?>
|
Подскажите пожалуйста что здесь нужно исправить или можно подправить. Заранее благодарю. | |
|
|
|
|
|
|
|
для: newProgrammer
(15.02.2009 в 20:22)
| | Зачем изобретать велосипед? В реппозитории РНР есть готовые решения, которые давно проверены и оттестированы
http://pear.php.net/search.php?q=mysql&in=packages&x=0&y=0 | |
|
|
|
|
|
|
|
для: mihdan
(15.02.2009 в 23:38)
| | Я не хочу быть велосипедистом и ездить на велосипеде, сделанном кем-то. Я хочу уметь их делать сам. Поэтому учусь, что называется, методом проб и ошибок. Хотя, я не против того, чтоб совмещать и то и другое. Спасибо за ссылку. | |
|
|
|
|
|
|
|
для: newProgrammer
(15.02.2009 в 20:22)
| | Вообще у меня какая-то классофобия :) Недолюбливаю я их, хоть и понимаю что они могут некоторые вещи облегчить.
Вот ваш, помоему, довольно енплохой класс и, оптяь же помоему, довольно удобный.
ЗЫ. сам код ен смотрел, только пример... он показался мне удобным ;)
mihdan, если программисты будут пользоваться только готовым, то они деградируют :) Лично мне всегда было удобнее своим пользоваться и мне удобнее потратить лишний день на арзработку своего компонента\функции, чем учится работать с чужим :) | |
|
|
|
|
|
|
|
для: DEM
(15.02.2009 в 23:48)
| | Спасибо за положительный отзыв - отличная мотивация для начинающего вроде меня. С таким настроем никакая критика нестрашна. :)
Таких фобий как у Вас у меня нет, просто есть необходимость освоить ООП.
PS Тоже всегда старался писать свой код, а уж если и использую чужой, то сначало досконально его изучу, а потом уже и применяю. Не могу пользоваться кодом, в котором не знаю как все работатет.
PPS Жду, как говорится, конструктивной критики! | |
|
|
|
|
|
|
|
для: DEM
(15.02.2009 в 23:48)
| | DEM,
тут главное не впадать в две крайности:
- отрицать все готовое
- писать все свое
Писать все свое: это ты сначала напишешь на напишешь на асме Сишку, потом на Сишке сделаешь Пхп, ну а потом уже .... Да, и про ОС не забудь, ее бы тоже неплохо запедалить ;) | |
|
|
|
|
|
|
|
для: STEVER
(17.02.2009 в 20:17)
| | >крайности
В крайности впадать действительно не стоит, однако, политику создания собственного программного обеспечения проводить можно и нужно. Конкуренция ещё никому не помешала, да и уровень разработчика при создании собственного приложения повышается гораздо быстрее и эффективнее, чем при использовании чужих. | |
|
|
|
|
|
|
|
для: DEM
(15.02.2009 в 23:48)
| | Нет, если человек написал для того, чтобы научится писать правильный, удобный, рабочий код, то я только за. Да и критику нужно принимать от двух полюсов. На то это и форум по РНР ;) | |
|
|
|
|
|
|
|
для: 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 Первым делом, проектируя классы нужно задавать вопрос в чём смысл и в чём выгода. Если их нет, то надо искать другой путь. | |
|
|
|
|
|
|
|
для: 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;", то не совсем понятно что представляет из себя класс. Или я Вас не правильно понял или не понял как правильно создавать классы...
Буду благодарен если проясните. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: Loki
(18.02.2009 в 15:50)
| | На такие запросы этот класс не расчитан... Наверное проще и универсальнее написать класс, где запросы бы писались самим разработчиком, а не генерировались методами класса.
PS Все равно я пока не сдаюсь. Чувствую надо еще немного почитать про ООП. Как напишу что-нибудь по-лучше выложу сюда на всеобщее обозрение. | |
|
|
|
|
|
|
|
для: 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, -4, 4) == "_min") {
$where .= " AND `" . substr($key, 0, strlen($key)-4) . "` >= '" . intval($val)."'";
} elseif (strstr($key, "_") == "_max" && substr($key,-4,4) == "_max") {
$where .= " AND `" . substr($key, 0, strlen($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()" тоже желательно бы переделать с тем, чтобы сделать его более универсальным.
В общем, если будут у кого-нибудь замечания или советы, буду весьма благодарен, т.к. это для меня очень важно... | |
|
|
|
|