За последние 24 часа нас посетили 16095 программистов и 1673 робота. Сейчас ищут 1499 программистов ...

Проэктирование телефонного справочника.

Тема в разделе "PHP Free-Lance", создана пользователем Jmunb, 22 ноя 2011.

  1. Jmunb

    Jmunb Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Россия
    Требуется выполнить данное задание:

    Нужно написать на PHP с использованием ООП веб-приложение для работы с телефонными номерами, состоящими из кода страны, кода города, номера телефона и комментария. Номера нужно хранить в таблице MySQL, веб-интерфейс - список (постраничная разбивка и сортировка по названиям колонок не нужны) со ссылками для изменения и удаления каждой записи, сверху - окно поиска (ищем всё что ввели сразу по всем полям) и ссылка для добавления номера. По нажатию на ссылки добавления и изменения открывается форма для редактирования всех полей номера, сохранение формы возвращает обратно к списку, если нет ошибок, с сообщением, что всё успешно сохранено, если есть ошибки - открывается форма, заполненная введёнными данными с информацией об ошибках (либо возле каждого поля, либо общим списком ошибок сверху). Проверки формы должны быть на PHP, использовать JavaScript для этого не нужно. После нажатия на кнопку поиска, а также без поискового запроса, нужно
    писать, сколько номеров найдено. Искать - просто подстроку по всем полям таблицы с телефонами.

    Предполагается следующий набор классов: номер телефона, список номеров, форма редактирования номера, контроллер веб-приложения. Пояснение по классу номера телефона: там должны быть реализованы методы получения данных из БД (загрузка из БД в свойства класса), доступа к данным (геттеры), записи данных в объект класса (сеттеры), сохранения данных в БД. Использование библиотек и фреймворков нежелательно.

    Хотелось бы получить несколько советов. Какова должна быть структура классов(если считаете что эта не подходит к данной задаче) и каким набор свойств и методов должны обладать классы приложения?

    Очень нужна помощь именно в проектировании, думал над структурой приложения и зашел в тупик=( Изначально предполагал сделать класс номера и два дочерних первый - список номеров, второй - форма редактирования. Которые будут наследовать от родительского класса свойства номера. Но при таком подходе класс список номеров будет вытаскивать все номера из бд по 1-й записи что не есть хорошо а если делать свое метод получения списка из бд то теряется смысл наследования. То же самое с формо редактирования если делать свои классы изменения и удоления но ведь вставка и селект уже реалезованы в родительском классе есть ли смысл отделять эти методы.

    Спасибо за внимание жду ваших советов!
     
  2. Jmunb

    Jmunb Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Россия
    Быть может было бы верным реализовать какой либо патерн в рамках данного задания?
     
  3. Jmunb

    Jmunb Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Россия
    В общем начал с класса работы с бд
    Использую класс PDO, реализую как Singleton.

    Вот код

    PHP:
    1. class MysqlPDO
    2. {
    3.     private $PDOInstance = null;    //Экземпляр класса PDO
    4.     private static $instance = null;    //Экземпляр класса MysqlPDO
    5.    
    6.     const DEFAULT_SQL_USER = 'root';    //Постоянное имя пользователя
    7.     const DEFAULT_SQL_HOST = 'localhost';   //Постоянный адрес хоста
    8.     const DEFAULT_SQL_PASS = '';    //Постоянный пароль пользователя
    9.     const DEFAULT_SQL_DTB = 'b2b';  //Постоянное название базы данных
    10.     const DEFAULT_SQL_CHARSET = 'utf8'; //Кодировка
    11.  
    12.     /**
    13.     * Конструктор
    14.     */
    15.     private function __construct() {
    16.         $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));
    17.     }
    18.    
    19.     /*
    20.     *Защищаем от клонирование
    21.     */
    22.     final private function __clone() {}
    23.    
    24.     /*
    25.     *Защищаем от создания через unserialize
    26.     */
    27.     final private function __wakeup() {}
    28.    
    29.     /**
    30.     * Создает и возвращает объект класса MysqlPDO
    31.     */
    32.     final public static function getInstance() {
    33.         if(is_null(self::$instance)) {
    34.             self::$instance = new MysqlPDO();
    35.         }
    36.         return self::$instance;
    37.     }
    38.  
    39.     /**
    40.     * Выполняем SQL запрос в PDO
    41.     */
    42.     public function query($query) {
    43.         return $this->PDOInstance->query($query);
    44.     }
    45.    
    46.     // Выполняет запросы к БД
    47.     public function prepare($statement, $driver_options = array()) {
    48.         return $this->PDOInstance->prepare($statement, $driver_options);
    49.     }
    50.    
    51.     /*
    52.     *Деструктор
    53.     */
    54.     public function __destruct() {
    55.         unset($this->PDOInstance);
    56.     }
    57. }
    58.  
    С PDO работаю недавно так что не все еще понятно. Например как лучше обрабатывать ошибки? Как лучше выполнять запросы? И вообще какие функции нужно еще реализовать в данном классе в рамках ТЕЛЕФОННОГО СПРАВОЧНИКА? [/php]
     
  4. Jmunb

    Jmunb Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Россия
    ах да ну и пример использования
    PHP:
    1.  
    2. require_once("classes/mysqlPDO.class.php");
    3.    
    4. foreach (MysqlPDO::getInstance()->query('SELECT user_id, ip , uri , time FROM `log`') as $membre) {
    5.     echo '<pre>', print_r($membre) ,'</pre>';
    6. }
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    final есть смысл применять к public и protected
     
  6. Jmunb

    Jmunb Активный пользователь

    С нами с:
    22 окт 2010
    Сообщения:
    21
    Симпатии:
    0
    Адрес:
    Россия
    Еще чтото можете подсказать?
    Стоит ли использовать интерфейсы в данном классе?
     
  7. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Проектировал что-то подобное, у меня было так:
    PHP:
    1. <?php
    2. class Db
    3. {
    4.     public static $instance = null;
    5.     private $db;
    6.  
    7.     private function __construct()
    8.     {
    9.         $data = Config::getConfig('db');
    10.  
    11.         try
    12.         {
    13.             $this->db = new PDO(
    14.                 'mysql:host=' .$data['host']
    15.                   .';dbname=' .$data['dbname'],
    16.                 $data['username'],
    17.                 $data['password'], array(
    18.                     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    19.                     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' .$data['charset'],
    20.                 )
    21.             );
    22.         }
    23.         catch( Exception $e)
    24.         {
    25.             throw $e;
    26.             //$logger->log( 'Caught exception: ' .$e->getMessage(), PEAR_LOG_EMERG);
    27.         }
    28.     }
    29.  
    30.     private function __clone() {}
    31.  
    32.     private function __wakeup() {}
    33.  
    34.     private static function getInstance()
    35.     {
    36.         if( empty( self::$instance))
    37.         {
    38.             $className = __CLASS__;
    39.             self::$instance = new $className;
    40.         }
    41.  
    42.         return self::$instance;
    43.     }
    44.  
    45.     public static function query( $sql)
    46.     {
    47.         return self::getInstance()->db->query( $sql);
    48.     }
    49.  
    50.     public static function prepare( $sql, $driver_options = array())
    51.     {
    52.         return self::getInstance()->db->prepare( $sql, $driver_options);
    53.     }
    54. }
    55. ?>