За последние 24 часа нас посетили 16079 программистов и 1666 роботов. Сейчас ищут 936 программистов ...

Вопрос по ООП.

Тема в разделе "PHP для новичков", создана пользователем alexander.pro, 23 апр 2009.

  1. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Здравствуйте уважаемые PHP профессионалы.
    Недавно стал вникать в ООП,(коечто понял, но не всё) даже написал свой первый серьёзный класс для БД.
    Кому интересно вот: http://narod.ru/disk/7977510000/alexander_class.zip.html.
    У меня вопрос, если нужно защитить базу от инъекций, то метод защиты нужно вставлять в класс который отвечает за соединение с базой или все-так нужно писать отдельный класс.
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Не нужно этого делать. Сохраняя на архив на файловом сервере Вы только тратите свое и наше время. Никто не будет вводить каптчи и смотреть порнуху, чтобы скачать архив, а потом распаковать его и посмотреть код.
    Используйте http://codepaste.ru/

    Я думаю, что первое. И можно использовать подготовленные выражения, забыв о слешировании.
     
  3. alexeurodnepr

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

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    прикольный сайтец)

    alexander.pro

    брат :) жаль не из днепра..)
     
  4. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Kreker - Спасибо за сайт!
    И возник вопрос. Подготовленные выражения - это стандартные выражения с вставленными переменными или что-то другое.
     
  5. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    http://phpclub.ru/detail/article/mysqli

    Деструктор для класса базы в данном случае не нужен, потому что по выполнению скрипта соединение закрывается автоматически.

    SQL_Array() - я бы посоветовал, чтобы этот метод выводил массив не текущего разбираемого Mysql-результата, а массив с данными полной выборки (Т.е. в цикле fetch).
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Kreker
    мало, ещё советуй :)
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Сил уже нет...
     
  9. Cron

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

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    давай я помогу :)

    1. Выбор конкретной базы данных mysql_select_db лучше вынести в отдельный метод и вызывает его из конструктора. Это даст возможность в случае необходимости выбрать другую db.

    2. Использование die в классе с точки зрения ООП слишком грубо (даже как-то жестоко). Нужно просто возвращать ошибку в каком-либо виде. А обработка этой ошибки уже будет зависит от приложения, в котором этот класс будет использоваться.
     
  10. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я из Днепра!
     
  11. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Cron
    В каком виде?
     
  12. Cron

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

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Помещайте в отдельную переменную error и добавьте функцию getError().
    Можете возвращать константу self::CONNECTION_ERROR_MESSAGE.
    Или использовать конструкцию trigger_error.
    Можете генерировать исключение.

    Но не умирать же сразу :)
     
  13. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    alexander.pro
    PHP:
    1. <?php
    2. if ($this->define == FALSE){
    3.             $this->connected = mysql_connect($myhost, $myname, $mypass);
    4.             mysql_select_db($mydata, $this->connected) or die('Error_Select_Data_Base');
    5.             $this->define = TRUE;
    6. ?>
    есть более подходящий вариант использования такого флага.
    в конструкторе $this->define = false, а в методе, выполняющем запрос
    PHP:
    1. <?php
    2. if(!$this->define){
    3.     $this->connect();
    4.     $this->define = true;
    5. }
    6. $this->query = mysql_query($sql);
    7. ?>
    то зависит от реализации и степени абстракции. В твоём случае достаточно метода escape()
    PHP:
    1. <?php
    2. public function escape($param)
    3. {
    4.     if (is_array($param)) {
    5.         foreach ($param as $k => $v) {
    6.             $param[$k] = $this->escape($v);
    7.          }
    8.     }
    9.     else {
    10.         $param = mysql_real_escape_string($param);
    11.     }
    12.     return $param;
    13. }
    14. ?>
    если применять отложенное подключение, о чём первоначально писал, то коннект надо проверять ещё и в escape()
     
  14. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Всем спасибо..... Всё учту и выложусь опять....
     
  15. Cron

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

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Будет интересно посмотреть на класс, написанный почти коллективно. Самому трудно учесть все тонкости.
     
  16. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    На данный момент пытаюсь вникнуть в 'подготовленные заявления'... По статьям вроде как все понятно, осталось найти пример без использования MySQLi, а то получается что методы SQL_Connect() и SQL_SelectDB я писал зря. Что не радует! :(
     
  17. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Подготовленные выражение -- это как раз малина mysqli.
     
  18. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    да вообще зря для mysql писал. Mysqli (improved) — улучшеная версия библиотеки mysql. Все изменения и улучшения происходят имено в mysqli
     
  19. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    - тоже интересно. С учетом всего написал:

    PHP:
    1.  
    2. <?php
    3.   class MySQL{
    4.     private $connected;
    5.     private $result;
    6.     private $query;
    7.     private $define = FALSE;
    8.     public function __construct($myhost, $myname, $mypass, $mydata){
    9.         if (!$this->define){
    10.             $this->SQL_Connect($myhost, $myname, $mypass);
    11.             $this->SQL_SelectDB($mydata);
    12.             $this->define = TRUE;
    13.         }else{
    14.             die('Close_join');
    15.         }
    16.     }
    17.     public function __destruct(){
    18.         $this->SQL_Close();
    19.     }
    20.     private function SQL_Connect($myhost, $myname, $mypass){
    21.         $this->connected = mysql_connect($myhost, $myname, $mypass) or die ('Ошибка!!!');
    22.     }
    23.     private function SQL_SelectDB($mydata){
    24.         mysql_select_db($mydata, $this->connected) or die ('Ошибка БД');
    25.     }
    26.  
    27.  
    28.     public function SQL_ResultSet($SQLent){
    29.         $SQLent = mysql_real_escape_string($SQLent);
    30.         $this->query = mysql_query($SQLent, $this->connected);
    31.     }
    32.     public function SQL_ConnectGet(){
    33.         return $this->connected;
    34.     }
    35.     public function SQL_Array(){
    36.         return mysql_fetch_array($this->query);
    37.     }
    38.     private function SQL_Close(){
    39.         $this->define = FALSE;
    40.         if (isset($this->connected)){
    41.             mysql_close($this->connected);
    42.             unset($this->connected);
    43.         }
    44.     }
    45.   }
    46. ?>
    47.  
     
  20. Cron

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

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Не зря. Как минимум потренировался.
     
  21. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    мдя, и что ты этим хотел сказать?

    и ещё, долго вчитываться не хотелось
       
    PHP:
    1. <?php
    2.            if (!$this->define){
    3.                $this->SQL_Connect($myhost, $myname, $mypass);
    4.                $this->SQL_SelectDB($mydata);
    5.                $this->define = TRUE;
    6.            }else{
    7.                die('Close_join');
    8.            }
    9. ?>
    зачем здесь эти танцы с дефайном? учитывая, что конструктор отработает 1 раз при создании объекта.
     
  22. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Ну да, для этого и писал...
     
  23. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Luge
    Про дефайн я прочитал в народных советах... Чтоб два раза к SQL нельзя было подключиться. Да и вы сами советовали мне так сделать.
     
  24. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Я советовал сделать отложенное подключение, вынести вызов $this->SQL_Connect из конструктора. Чтоб соединялись с базой действительно когда надо сделать запрос, а не при каждой инициализации класса.
    К тому же, в вашем варианте соединение произойдёт 1 раз после вызова $obj = new MySQL($myhost, $myname, $mypass, $mydata); Думаю,ещё раз вызывать конструктор для подключения к той же базе никто не будет. Точно так же, как и создавать ещё один объект.
     
  25. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а я лоханулся с такой байдой, потому что получилось что в некоторых местах было двойное "спасение" - а это бред