использование обьекта PEAR DB внутри класса, помогите оценить подход

st_falcon

Новичок
использование обьекта PEAR DB внутри класса, помогите оценить подход

есть класс который должен работать с базой данных. но нужно учитывать что к базе мы или уже подключены (в данном случае через PEAR DB), или не подключены (connect)...

я посмотрел как сделали в PEAR Auth и сделал для примера класс обратной связи:
PHP:
class feedback {
  function feedback($db, $dsn='', $db_options='')
  {
        if (is_object($db)) {
            // обьект DB уже создан
            $this->db =& $db;
        } else {
            // подключаем PEAR::DB
            require_once "DB.php";
            $this->db =& DB::connect($dsn, $db_options);
            // показывать ошибки соединения с БД если сайт работает в тестовом режиме
            if (PEAR::isError($db) && TEST_MODE===true) {
              die($db->getMessage());
            }
        }
  }
}
=======================================
index.php
=======================================
$feedback = new feedback($db, $dsn, $db_options);
насколько это правильно с вашей точки зрения?


еще вопрос. переменные в класс могут передаваться из POST и DB. как правильно реализовать инициализацию переменных класса?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Re: использование обьекта PEAR DB внутри класса, помогите оценить подход

Автор оригинала: st_falcon
насколько это правильно с вашей точки зрения?
воп'осом на воп'ос.
а ты собираешься этот код продублировать во всех классах, работающих с базой?
 

st_falcon

Новичок
Sad Spirit
да... немного переделал. сделал base_class

PHP:
// базовый класс
class base_class {
  var $db;
  var $fields;
  var $tpl;
  var $op;

  // конструктор
  function base_class($db='', $tpl='') {
    if (is_object($db))
      $this->db =& $db;
    else
      return false;

    global $op; $this->op = $op; // операция
    $this->tpl = $tpl; // шаблон

    // конструктор
    $this->construct();
  }

  function construct() {
    // конструктор для классов наследователей
  }

  // системное сообщение
  function system_msg($message) {
    $_SESSION['system_msg'] = "$message";
  }

  // проверяем форму на предмет заполнения обязательных полей
  function validator($control=null) {
    if(isset($control))
    {
      $control = explode("|", $control);
      foreach($control as $v)
        // если хоть одна с обязательных переменных пуста
        if(empty($_POST[$v]))
        {
          $this->system_msg('Обязательно заполните поля отмеченные звездочкой!');
          return false;
        }
      return true; // все ок
    }
    else
      return false; // не задан список переменных для проверки
  }

  // проверяем переменные полученые ИЗ-В-НЕ
  function get_var($value, $type=null)
  {
    if(isset($type))
    {
       settype($value, $type);
       return $value;
    }
    else
      return trim(addslashes(stripslashes(htmlspecialchars($value))));
  }
}
и переделал класс для формы обратной связи
PHP:
class feedback extends base_class {
    var $subject;             // заголовок сообщения
    var $name;              // имя пользователя
    var $email;             // email пользователя
    var $message;              // текст сообщения

/*
CREATE TABLE `ln_message` (
  `mid` int(11) NOT NULL default '0',
  `subject` varchar(255) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `email` varchar(255) NOT NULL default '',
  `message` text NOT NULL
)
*/

  function construct()
  {
    global $smarty;

    switch($this->op)
    {
      case 'send':
          if($this->validator($_POST['control']))
          {
            $this->send_message();  // если все ок - отправляем сообщение
            break;
          }
      default:
          // если не все ок - играемся дальше...
          $smarty->assign("include_tpl", $this->tpl);
    }
  }

  function tipizator()
  {
    $this->subject = $this->get_var($_POST['subject']);
    $this->name = $this->get_var($_POST['name']);
    $this->email = $this->get_var($_POST['email']);
    $this->message = $this->get_var($_POST['message']);
  }

  // отправляем сообщение
  function send_message()
  {
    $this->tipizator();

    $sql = "INSERT INTO `ln_message` (`mid`, `subject`, `name`, `email`, `message`)
            VALUES ('', '$this->subject', '$this->name', '$this->email', '$this->message')";
    $result = $this->db->query($sql);

    if (DB::isError($result))
    {
      $this->system_msg("Произошла ошибка при отправке сообщения!");
      return false;
    }
    else
    {
      $this->system_msg("Спасибо! Ваше сообщение отправлено!");
      return true;
    }
  }
}
использую это все вот так...
PHP:
      switch($cat)
      {
          case "feedback":
          {
             $feedback = new feedback($db, "main/$cat.tpl");
             break;
          }

          default:
            $smarty->assign("include_tpl", "main/$cat.tpl");
            break;
      }
интуитивно чувствую не правильно... что обьект DB и smarty нужно передавать не так... да и вобще не красивый помоему код...

укажите плиз на самые грубые ошибки. это мои первые потуги юзать ООП. а делать неправильно не хочу...
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: st_falcon
интуитивно чувствую не правильно... что обьект DB и smarty нужно передавать не так... да и вобще не красивый помоему код...
Вот это
PHP:
      return trim(addslashes(stripslashes(htmlspecialchars($value))));
называется "неиллюзорный п@#дец", а не "некрасивый код".

укажите плиз на самые грубые ошибки. это мои первые потуги юзать ООП. а делать неправильно не хочу...
первая ошибка --- использование php4 для изучения ООП, вместо php5.
вторая ошибка --- нежелание знакомиться с достижениями человечества в плане обработки форм. Ну ё-маё, на том же sitepoint'е куча тредов про то, как обрабатывать формы. Да и здесь в "теоретическом" форуме это всё не раз обсуждалось.
 

st_falcon

Новичок
Sad Spirit
PHP:
называется "неиллюзорный п@#дец", а не "некрасивый код".
:)
это я с одного класса вытянул...

смотрю сейчас выдачу поиска по "обработка форм". хороший у вас форум ;)
 
Сверху