Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Небольшой class для работы с PDO в PHP
Форумы портала PHP.SU » PHP » Пользовательские функции » Небольшой class для работы с PDO в PHP

Страниц (1): [1]
 

1. De-Luxis - 14 Января, 2011 - 07:41:23 - перейти к сообщению
Сваял для себя небольшой класс.
Удобная штука. Почти как в ezSQL.

PHP:
скопировать код в буфер обмена
  1.  
  2. if (!class_exists('PDO'))
  3.     die('<b>Fatal Error:</b> Для работы нужна поддержка PDO.');
  4.  
  5. class MyPDO extends PDO {
  6.  
  7.     public $num_queries = 0;
  8.     public $last_query = '';
  9.  
  10.     public function q($query,$array = false) {
  11.         $query = str_replace("/[\n\r]/", '', trim($query));
  12.         $this->last_query = array('sql' => $query,'execute' => $array);
  13.         $this->num_queries++;
  14.  
  15.         if ($array == false and preg_match("/^(insert|delete|update|replace|drop|create|set)\s+/i", $query))
  16.         {
  17.             $this->exec($query);
  18.             $return_val = $this->lastInsertId();
  19.  
  20.             $this->error($this);
  21.                 }
  22.         elseif ($array == false)
  23.         {
  24.             $res = $this->query($query);
  25.  
  26.             $this->error($this);
  27.  
  28.             if ($res != false)
  29.                 $return_val = $res->fetchAll(PDO::FETCH_ASSOC);
  30.             else
  31.             {
  32.                 $return_val = false;
  33.             }
  34.         }
  35.                 elseif (is_array($array))
  36.                 {
  37.                         $res = $this->prepare($query);
  38.                         $res->execute($array);
  39.  
  40.                         if (!preg_match("/^(insert|delete|update|replace|drop|create|set)\s+/i", $query))
  41.                                 $return_val = $res->fetchAll(PDO::FETCH_ASSOC);
  42.  
  43.                         $this->error($res);
  44.                 }
  45.  
  46.         return $return_val;
  47.     }
  48.  
  49.         function insert ($table, $fields = array())
  50.         {
  51.                 if (is_array($fields) and count($fields) > 0)
  52.                 {
  53.                         $sql = 'INSERT INTO `'.$table.'` SET ';
  54.                         $p = $this->prepareSQL($fields);
  55.                         $this->q($sql.$p['sql'],$p['keys']);
  56.                        
  57.                         return $this->lastInsertId();
  58.                 }
  59.         }
  60.  
  61.         function prepareSQL($fields)
  62.         {
  63.                 $keys = array();
  64.                 if (is_array($fields) and count($fields) > 0)
  65.                 {
  66.                         $n = count($fields);
  67.                         $i = 1;
  68.                         foreach ($fields AS $key => $value)
  69.                         {
  70.                                 $keys[':'.$key] = trim($value);
  71.                                 $sql .= $key.' = :'.$key;
  72.                                 if ($n != $i)
  73.                                         $sql .= ', ';
  74.                                 $i++;
  75.                         }
  76.  
  77.                         return array('sql' => $sql,'keys'=>$keys);
  78.                 }
  79.         }
  80.  
  81.     public function error($obj)
  82.     {
  83.                 $arError = $obj->errorInfo();
  84.  
  85.                 if (DEBUG and $arError[2] != '')
  86.                         echo 'SQL error: '.$arError[2]."<br/>\n";
  87.         }
  88.  
  89.     public function __destruct()
  90.     {
  91.         //if (DEBUG) echo '<div><center>[ Всего sql запросов на странице: '.$this->num_queries.' ]</center></div>';
  92.     }
  93. }
  94.  


UPD: Пофиксил.
2. Ch_chov - 14 Января, 2011 - 10:02:24 - перейти к сообщению
1. В чем удобство?
2. Регулярка на каждом запросе это действительно нужно?
3. Почему не сделать наследование MyPDO от PDO?
4. Для чего нужна $this->last_result
5. Для чего нужно в цикле записывать результаты в массив?
3. De-Luxis - 14 Января, 2011 - 10:53:32 - перейти к сообщению
1. Не надо много писать, и во всех запросах достаточно использовать метод query.
2. Без регулярки не определить тип запроса.
3. Да, можно было бы сделать и так. Переделать пять минут.
4. Чтобы можно было в некоторых случаях работать с результатами как с объектами.
5. Согласен, можно было сделать иначе.

На самом деле я многое просто скопировал из ezsql
(Добавление)
gеределал:
Радость
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. if (!class_exists('PDO'))
  4.         die('<b>Fatal Error:</b> Для работы нужна поддержка PDO.');
  5.  
  6. class MyPDO extends PDO {
  7.  
  8.         public $num_queries = 0;
  9.         public $last_query = '';
  10.  
  11.         function error() {
  12.                 return $this->errorInfo();
  13.         }
  14.  
  15.         function q($query) {
  16.                 $query = str_replace("/[\n\r]/", '', trim($query));
  17.                 $this->last_query = $query;
  18.                 $this->num_queries++;
  19.  
  20.                 if (preg_match("/^(insert|delete|update|replace|drop|create)\s+/i", $query))
  21.                         $return_val = $this->exec($query);
  22.                 else
  23.                         $return_val = $this->query($query)->fetchAll(PDO::FETCH_ASSOC);
  24.                
  25.                 return $return_val;
  26.         }
  27. }
4. garvey - 14 Января, 2011 - 11:43:47 - перейти к сообщению
Я понимаю, что всем нравится писать что-то свое. Но давайте писать что-то действительно "свое" и полезное.

 

Powered by ExBB FM 1.0 RC1