Требуется выполнить данное задание: Нужно написать на PHP с использованием ООП веб-приложение для работы с телефонными номерами, состоящими из кода страны, кода города, номера телефона и комментария. Номера нужно хранить в таблице MySQL, веб-интерфейс - список (постраничная разбивка и сортировка по названиям колонок не нужны) со ссылками для изменения и удаления каждой записи, сверху - окно поиска (ищем всё что ввели сразу по всем полям) и ссылка для добавления номера. По нажатию на ссылки добавления и изменения открывается форма для редактирования всех полей номера, сохранение формы возвращает обратно к списку, если нет ошибок, с сообщением, что всё успешно сохранено, если есть ошибки - открывается форма, заполненная введёнными данными с информацией об ошибках (либо возле каждого поля, либо общим списком ошибок сверху). Проверки формы должны быть на PHP, использовать JavaScript для этого не нужно. После нажатия на кнопку поиска, а также без поискового запроса, нужно писать, сколько номеров найдено. Искать - просто подстроку по всем полям таблицы с телефонами. Предполагается следующий набор классов: номер телефона, список номеров, форма редактирования номера, контроллер веб-приложения. Пояснение по классу номера телефона: там должны быть реализованы методы получения данных из БД (загрузка из БД в свойства класса), доступа к данным (геттеры), записи данных в объект класса (сеттеры), сохранения данных в БД. Использование библиотек и фреймворков нежелательно. Хотелось бы получить несколько советов. Какова должна быть структура классов(если считаете что эта не подходит к данной задаче) и каким набор свойств и методов должны обладать классы приложения? Очень нужна помощь именно в проектировании, думал над структурой приложения и зашел в тупик=( Изначально предполагал сделать класс номера и два дочерних первый - список номеров, второй - форма редактирования. Которые будут наследовать от родительского класса свойства номера. Но при таком подходе класс список номеров будет вытаскивать все номера из бд по 1-й записи что не есть хорошо а если делать свое метод получения списка из бд то теряется смысл наследования. То же самое с формо редактирования если делать свои классы изменения и удоления но ведь вставка и селект уже реалезованы в родительском классе есть ли смысл отделять эти методы. Спасибо за внимание жду ваших советов!
В общем начал с класса работы с бд Использую класс PDO, реализую как Singleton. Вот код PHP: class MysqlPDO { private $PDOInstance = null; //Экземпляр класса PDO private static $instance = null; //Экземпляр класса MysqlPDO const DEFAULT_SQL_USER = 'root'; //Постоянное имя пользователя const DEFAULT_SQL_HOST = 'localhost'; //Постоянный адрес хоста const DEFAULT_SQL_PASS = ''; //Постоянный пароль пользователя const DEFAULT_SQL_DTB = 'b2b'; //Постоянное название базы данных const DEFAULT_SQL_CHARSET = 'utf8'; //Кодировка /** * Конструктор */ private function __construct() { $this->PDOInstance = new PDO('mysql:dbname='.self::DEFAULT_SQL_DTB.';host='.self::DEFAULT_SQL_HOST, self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.self::DEFAULT_SQL_CHARSET)); } /* *Защищаем от клонирование */ final private function __clone() {} /* *Защищаем от создания через unserialize */ final private function __wakeup() {} /** * Создает и возвращает объект класса MysqlPDO */ final public static function getInstance() { if(is_null(self::$instance)) { self::$instance = new MysqlPDO(); } return self::$instance; } /** * Выполняем SQL запрос в PDO */ public function query($query) { return $this->PDOInstance->query($query); } // Выполняет запросы к БД public function prepare($statement, $driver_options = array()) { return $this->PDOInstance->prepare($statement, $driver_options); } /* *Деструктор */ public function __destruct() { unset($this->PDOInstance); } } С PDO работаю недавно так что не все еще понятно. Например как лучше обрабатывать ошибки? Как лучше выполнять запросы? И вообще какие функции нужно еще реализовать в данном классе в рамках ТЕЛЕФОННОГО СПРАВОЧНИКА? [/php]
ах да ну и пример использования PHP: require_once("classes/mysqlPDO.class.php"); foreach (MysqlPDO::getInstance()->query('SELECT user_id, ip , uri , time FROM `log`') as $membre) { echo '<pre>', print_r($membre) ,'</pre>'; }
Проектировал что-то подобное, у меня было так: PHP: <?php class Db { public static $instance = null; private $db; private function __construct() { $data = Config::getConfig('db'); try { $this->db = new PDO( 'mysql:host=' .$data['host'] .';dbname=' .$data['dbname'], $data['username'], $data['password'], array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' .$data['charset'], ) ); } catch( Exception $e) { throw $e; //$logger->log( 'Caught exception: ' .$e->getMessage(), PEAR_LOG_EMERG); } } private function __clone() {} private function __wakeup() {} private static function getInstance() { if( empty( self::$instance)) { $className = __CLASS__; self::$instance = new $className; } return self::$instance; } public static function query( $sql) { return self::getInstance()->db->query( $sql); } public static function prepare( $sql, $driver_options = array()) { return self::getInstance()->db->prepare( $sql, $driver_options); } } ?>