Способ база данных для запроса


У меня есть база данных класса, который в метод__Construct() инициализировать ПДО соединение и вставить экземпляр в $дБ частная ВАР. Сейчас я работаю на метод, который можно использовать для запроса в таком виде:

$db = new db;
$db->query(array(
 'select' => 1,
 'from' => 'table',
 'where' => array('id' => 1, 'name' => 'charlie'),
 'limit' => array(1, 5)
));

Я сделала то, что очень хорошо работает давным-давно, а ПДО был чем-то неизведанным, но мне было интересно:

  1. Как я могу улучшить этот код немного
  2. Как я могу покончить с этим? Я имею в виду, как использовать ПДО затем, чтобы отправить запрос?

Вот метод запроса():

# Defining the type
     if (isset($array['select'])) { $type = 'SELECT'; $type_value = (is_int($array['select'])) ? '*' : $array['select']; }
     if (isset($array['update'])) { $type = 'UPDATE'; $type_value = $array['update']; }
     if (isset($array['delete'])) { $type = 'DELETE FROM'; $type_value = $array['delete']; }
     if (isset($array['insert'])) { $type = 'INSERT INTO'; $type_value = $array['insert']; }
     if (!isset($type)) { trigger_error("Database, 'type' not selected."); } // Error

     # From
     if (isset($array['from'])) 
     {
      $from = 'FROM'; 
      $from_value = mysql_real_escape_string($array['from']); // table cannot be pdoed
     }
     # Where
     if (isset($array['where'])) 
     { 
      if (!is_array($array['where'])) { trigger_error("Database, 'where' key must be array."); }
      $where = 'WHERE'; $where_value = $array['where']; 
      # Fixing the AND problem
      if (count($array['where']) > 1)
      {
       $list = $where_value;
       foreach ($list as $a => $b) { $w[] = "{$a} = {$b}"; }
       $and = implode(' AND ', $w);
       $where_value = $and;
      }
     }
     # Limit
     if (isset($array['limit'])) 
     {
      if (!is_array($array['limit'])) { trigger_error("Database, 'limit' key must be array."); }
      if (count($array['limit']) != 2) { trigger_error("Database, 'limit' array must be two-keys-long"); }
      $limit_first = $array['limit'][0];
      $limit_second = $array['limit'][1];
      $limit = 'LIMIT';
      $limit_value = "{$limit_first}, {$limit_second}";
     }

     # Set
     if (isset($array['set']))
     {
      if (!is_array($array['set'])) { trigger_error("Database, 'set' key must be array."); }
      $edits = $array['set'];
      foreach ($edits as $a => $b) { $e[] = "{$a} = {$b}"; }
      $set = 'SET';
      $set_value = implode(',', $e);
     }

     $vals = array('from', 'from_value', 'set', 'set_value', 'where', 'where_value');
     foreach ($vals as $v) { if (empty($$v)) { $$v = ''; } }

     $sql = "
      {$type} {$type_value}
      {$from} {$from_value}
      {$set} {$set_value}
      {$where} {$where_value}
     ";

# Here there would be something like mysql_query($sql), but i'd like PDO! PDO get me hornier.

А сейчас? Как привязать параметры? Это возможно, чтобы разобраться в этом?



532
7
задан 25 января 2011 в 02:01 Источник Поделиться
Комментарии
1 ответ

Этот метод запроса (и класс DB) имеет много обязанностей:


  • Делать это вещество, соединение

  • Быть построителя запросов

  • быть исполнителем запроса

  • Справиться с params и, возможно, выполнить одну инструкцию с разными параметрами (это было бы слишком)

  • Делать все проверки ошибок

  • может, больше я не вижу

Как правило, функциональность обрабатывается в 2-3 классах, иногда даже еще и не в одну-единственную функцию.

И вы делаете очень жутко магию, чтобы добиться всю работу

foreach ($vals as $v) { if (empty($$v)) { $$v = ''; } }

и все, что так можно писать

array("select " => "something" , ...

вместо

"select something" ...

Также вы используете использования mysql_real_escape_string так кажется, вы не хотите использовать ПДО побега (не обязательные параметры), так зачем пытаться использовать PDO если вы ограничиваете себя в MySQL в любом случае ?

До сих пор все, что я заметил, думая об этом в течение 5 минут. Улучшить обратную связь / направление от вас, если это помогло :)

5
ответ дан 25 января 2011 в 06:01 Источник Поделиться