Jump to content

PHP: вопросы и ответы


Recommended Posts

DAGpro,

Актуально, это стандартный функционал, плюс свои подходы в программировании, учить лучше не по этим статьям, а по манулу, изучить что такое буфер обмена, конструкция try catch, ООП, обработка исключений, функции обработки ошибок. А потом уже читать разного рода подходы, такие как в этих статьях, которые используют этот синтаксис языка.

Link to comment
Share on other sites

  • 3 weeks later...

Есть вот такой метод по выполнению запроса к базе данных на PDO:

 

static public function One($id_article)
   {
       $db = PdoDB::getPdoInstance();
       
       $query = 'SELECT * FROM tarif WHERE id = :id';
       
       $result = $db->prepare($query);
       
       $result->bindParam(':id',$id_article);
       
       $s = $result->execute();

       if (!$s)
       {
           $error =  $result->errorInfo();
           echo $error[2];
           die();
       }
       
       self::$tarif[] = $result->fetch(PDO::FETCH_ASSOC);
       if(!self::$tarif[0])
       {
           header("HTTP/1.1 404 Not Found");
           die(include(ROOT_DIR . '/incl/404.php'));
       };
       
       return self::$tarif;
   }

 

Правильно ли я сделал все проверки на ошибки?

Надо обработать переменную перед выполнением запроса на инъекции? Ведь в PDO предусмотрена защита от инъекций.

Не говнокод ли получился у меня? :)

В общем выслушаю любую критику :)

Link to comment
Share on other sites

Код ужасен :)

 

1. Очень сильная связанность. У тебя всего один метод отвечает и за посылку заголовков, и за 404.php, идет проверка количества, вобщем, кошмар, название метода, тоже не очень, почему метож статичный? что за static $tarif

Ты слишком обьемно все сделал. Глобальные переменные (ROOT_DIR) - нехорошо

 

Представь, для ошибки 404 вдруг понадобится другая страница. Или вывести кастомное сообщение об ошибке?

Или ROOT_DIR переименовал.

Или ты заходишь на сайт и видишь 404, и тебе придется все методы смотреть кто что возвращает.

 

Насчет защиты, да, ты экранировал

 

if (!$s)

{

$error = $result->errorInfo();

echo $error[2];

die();

}

тоже плохо) у тебя в каждом методе будет проверка и die()? Такие вещи нужно на уровень выше выносить

 

и не совсем понятна твоя обьектно-ориентированность, присмотрись к ORM, там многое уже сделано, или к фреймворкам, очень помогает, по мере того как разбираешься в библиотеке или фреймворке, изучаешь его корни лучше понимаешь как стоит делать как нет, так как там зачастую бывает красивый проверенный кучей людей код)

Edited by paxadm
Link to comment
Share on other sites

   
static public function One($id_article)
   {
       $db = PdoDB::getPdoInstance();
       
       $query = 'SELECT * FROM tarif WHERE id = :id';
       
       $result = $db->prepare($query);
       
       $result->bindParam(':id',$id_article,PDO::PARAM_INT);
       
       $s = $result->execute();

       //проверяем на ошибку
       error_execute($s);
       
       self::$tarif[] = $result->fetch(PDO::FETCH_ASSOC);

       if(!self::$tarif[0]){ return false };
       
       return self::$tarif;
   }

 

Так лучше?

Что за проверка количества?

Метод статичный по причине не желания писать одну строчку кода по созданию объекта класса в контролере. Каким лучше сделать метод?

 

В статическом методе нельзя использовать $this поэтому решил сделать его статичным. Как использовать свойство класса в статическом методе или использовать переменную локальной области видимости ?

 

404: А зачем может понадобиться другая страница? Сообщаешь пользователю,что такой страницы не существует и все? Если старая не устраивает просто заменить ее. Не? Или эту страницу еще для чего то используют?

 

Что не так с обьектно-ориентированностью?

 

ROOT_DIR зачем ее переименовывать? Ведь по названию понятно, что она указывает путь до корневой директории,если и надо будет менять,так это значение этой константы.

Link to comment
Share on other sites

Обычно бывает так, (ORM) базовый бд класс, который отвечает за запросы.

Наследуешься от него указывая свои параметры (название таблицы, заголовки полей)

 

Не так то, что в каждом методе у тебя будут повторения кода. Не должен метод вытаскивающий запись с БД переадресовывать пользователя. Ты сказал "контроллер" вот в нем это и должно быть (MVC)

 

Про сильную связанность, ну вот, изменишь ты название таблицы (допустим понадобится префикс добавить), тебе придется каждый метод менять

 

 

404: А зачем может понадобиться другая страница? Сообщаешь пользователю,что такой страницы не существует и все? Если старая не устраивает просто заменить ее. Не? Или эту страницу еще для чего то используют?

Например использовать другую логику, не показать 404, а отправить отчет какой нибудь, я для примера говорю

 

 

error_execute? Ты неправильно используешь принципы ООП. С ROOT_DIR не так вот это - зачем методу который находит запись знать о корневой директории

 

Общее нужно вывести отдельные классы, от них наследовать свойства, переопределять, и т.п в контроллере проверки (если модель не вернула запись то 404)

 

 

self::$tarif[] и if(!self::$tarif[0]){ return false }; тоже непонянто

 

 

 

 

На примере фреймворка Yii , это было бы так (вообще, находить запись по ключу можно и без отдельного метода) ты усложняешь статичными свойствами, проверкой есть ли $tarif[0]

 

псевдокод:

 

модель:

 

class Tarif {

 

public static tableName()

{

return "{{tarif}}";

}

 

public static function One($id)

{

return self::model()->findByPk($id);

}

 

}

 

контроллер:

$model = Tarif::One($id);

if($model==null)

{

throw blabla(404);

}

 

$this->render('view',$model);

 

 

Link to comment
Share on other sites

  • 3 months later...

      $regex =array('options' =>
               array('regexp' => "/^[а-яА-Я -]{3,50}$/u"));
       $this->name = filter_var($name,FILTER_VALIDATE_REGEXP,$regex);
       $this->email = filter_input(INPUT_POST, 'email',FILTER_VALIDATE_EMAIL);
       $regex =array('options' =>
               array('regexp' => "[^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$]"));
       $this->phone = filter_input(INPUT_POST,'phone',FILTER_VALIDATE_REGEXP,$regex);
       $this->address = filter_input(INPUT_POST,'address',FILTER_SANITIZE_STRING,FILTER_FLAG_NO_ENCODE_QUOTES);
       $this->prim = filter_input(INPUT_POST,'prim',FILTER_SANITIZE_STRING,FILTER_FLAG_NO_ENCODE_QUOTES);

      $query = "INSERT INTO customers (`name`, `email`, `phone`, `address`)
                       VALUES (:name, :email, :phone, :address)";
      $placeholder = array(':name' => $this->name, ':email'=> $this->email ,':phone' => $this->phone ,
                     ':address' => $this->address);
      $stmt = $this->db->prepare($query);
      $stmt->execute($placeholder);

 

 

Использование такой фильтрации и подготовленных запросов достаточно для защиты от инъекций и xss?

Link to comment
Share on other sites

  • 7 months later...

Есть ли специалисты по zend framework на этом форуме?

 

$select->from(array('t' => 'tarifs'))
                   ->join(array('o' => "operator"),'o.id_operator = t.id_operator')
                   ->join(array('c' => 'category'),'c.id = t.id_category')
                   ->where(array('t.id' => array('in' => $select2)));

Возможно ли в zende использование вложенных запросов?

И еще есть вопрос про использование объектов сущности , Если работать с одной таблицей в базе данных,то достаточно передать в ResultSet->setArrayObjectPrototype() экземпляр класса.

public function __construct(Adapter $adapter)
       {
               $this->adapter = $adapter;
               $this->resultSetPrototype = new ResultSet();
          $this->resultSetPrototype->setArrayObjectPrototype(new Album);
               $this->initialize();
       }

Но как быть если работать сразу с несколькими таблицами? Единственный способ,который я смог использовать это передача в конструктор ResultSet, константы,которая говорит,что будем работать с ArrayObyect.

public function __construct(Adapter $adapter)
       {
               $this->adapter = $adapter;
               $this->resultSetPrototype = new ResultSet(ResultSet::TYPE_ARRAYOBJECT);
               $this->initialize();
       }

Link to comment
Share on other sites

  • 8 months later...
  • 3 months later...

Друзья/товарищи. Помогите. Есть плагин к некой вебморде(подробности будут позже, если кто-то решит помочь). Этот плагин средствами php переносит файлы из одной директории в другую (попутно может создавать директории, если их нет, делать симлинки и т.п.). Так вот, этот php не умеет в 32битной среде работать с файлами больше 2гиг. Если пересобрать с определенными флагами, то лимит увеличивается до 4гиг. Но дальше уже никак. Надо использовать уже 64битную среду. Мне сейчас сносить рабочую среду (она 32бита) и ставить 64 нет возможности. Есть варианте, заменить встроенные функции вызова переноса/копирования на вызовы sh скриптов. Sh скрипты я написать могу, не проблема. Но вот вот в пхп я ноль. Могу разве что приблизительно понимать что там, читая код. Но вот залезть и изменить знаний не хватит. Поэтому нужна помощь. Как мне кажется там не должно быть что-то очень сложное. 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...