2014-01-21 2 views
3

Согласно этой теме: https://codereview.stackexchange.com/questions/29362/very-simple-php-pdo-class люди обычно говорят, что глупо создавать пользовательские обработчики запросов PDO, которые мне очень трудно понять.Почему глупо создавать пользовательские обработчики запросов PDO?

Например, в моих проектах я предпочитаю иметь класс/функцию, чтобы делать то, что я делаю все время, быстрее для меня.

Например, когда вам нужно выполнять простые обновления в таблице, я создал эту функцию, которую я использую все время:

function UpdateData($table, $data, $where, $params=array()) { 
    $sql = 'UPDATE `' . tbl_prefix.$table . '` SET '; 
     foreach($data as $name => $value) { 
      $params[':' . $name] = $value; 
      $runs++; 
      $sql .= "`$name` = :" . $name; 

      if(end($data) !== $value) // if not last run 
       $sql .= ','; 
     } 

    if(!is_array($where)) { 
     $sql .= ' ' . $where; // insert where clause 
    } else { 
     // Array format can be used 
     $sql .= ' WHERE'; 

     foreach($where as $argument => $value) { 
      $params[':where_'.$argument] = $value; 

      $num++; 
      $sql .= " `" . $argument . "` = :where_" . $argument . " "; 

      if(end($where) !== $value) 
       $sql .= ' AND'; 
     } 
    } 

    $query = doQuery($sql, $params); // do the update 

    if($query) 
     return true; 
} 

И doQuery (который я использую, когда я хочу база запросов):

function doQuery($query, $params=array()) { 
    global $db; 
    try { 
     $result = $this->$db->prepare($query); 
     $result->execute($params); 
     $result->setFetchMode(PDO::FETCH_ASSOC); 

     return $result; 
    } catch(PDOException $ex) { 
     $real_query = $query; 
     foreach($params as $name => $value) { 
      $real_query = str_replace($name, '\''.$value.'\'', $real_query); 
     } 

     SystemLog($ex->GetMessage(), array('real_query' => $real_query, 'query' => $query), 1); // log error 
    } 

    return false; 
} 

Есть ли что-то не так с этим? Мне это очень полезно.

некоторый код, были выведены из сценариев для упрощения кода

+0

Если это вам полезно, то идите на это. Вы создали утилиту, которую вы повторно используете в своих проектах, что отрицает аргумент принятого ответа о повторном использовании. В то время как я получаю то, что он говорит, он может ссылаться на создание массивного класса абстракции или что-то еще, а не только на несколько вспомогательных методов. В любом случае, ваш проект должен соответствовать вашим потребностям. Если вы достаточно знаете об этом материале, чтобы даже сделать эти 2 помощника выше, вы, вероятно, будете в безопасности использовать их. –

ответ

0

Я думаю, что вы делаете это хорошо. Основной аргумент в этом потоке заключается в том, что вы пропустите подготовленные утверждения: я использую SQL с 1984 года, и СУБД были достаточно хороши, что использование инструкции «Готово» не имеет никакого реального разницы, поскольку, возможно, 1994 год. Я не использовал его для более 20 лет, и мои системы работают правильно.

Тем не менее, у каждого свое мнение. Я делал то, что делал много раз, и у меня не было проблем с этим. В настоящее время я использую ORM, что означает, что мне тоже не нужно это делать.

+0

Я считаю, что большинство разработчиков PHP используют подготовленные заявления из-за более высокой безопасности, не так ли? –

+0

Это не имеет никакого отношения к безопасности! Подготовленные утверждения «предварительно скомпилированы». Еще в старые времена компиляция - разработка плана запроса - была довольно большой накладной, так что вы могли сделать это один раз и больше не пострадать. В наши дни это не так. Не использовать Подготовленные утверждения также затрагивает проблему с искаженными распределениями данных, где фактические значения в предложениях where могут сделать разные планы лучше. –

+0

Собственно, с PHP и PDO я беру это обратно. Похоже, что с MySQL Prepare требуется связать параметры (после быстрого просмотра трех документов) и его использование параметров, которые добавляют безопасность к SQL Injection. Извини за это! (Это не требуется для других СУБД) –

0

В моем предыдущем проекте у меня была настройка нескольких функций для выполнения запросов SQL с использованием PDO. Они будут охватывать большинство случаев: основные вставки, базовые обновления, базовые удаления и т. Д.

Если вы реализуете его достаточно хорошо, используя PDO, подготовленные операторы и catch Exceptions, то вы должны быть в порядке, и вы получаете лучшее из обоих миры, простое использование и более высокая безопасность подготовленных отчетов PDO.

У меня никогда не было проблемы. Вы просто должны убедиться, что вы это прекрасно реализуете.

Смежные вопросы