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 :: Версия для печати :: Замыкание в PHP, жесткий мозгошторм
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Замыкание в PHP, жесткий мозгошторм

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

1. jora_xrenov - 16 Сентября, 2013 - 17:34:29 - перейти к сообщению
Помогите докумекать

Есть вот такой вот код (часть класса)
PHP:
скопировать код в буфер обмена
  1.  
  2.     protected $q;
  3.  
  4.     public function query($query) {
  5.         $this->q=$this->db->query($query);
  6.         return $this->q;
  7.     }
  8.  
  9.     public function fetch_object() {
  10.         if(!is_object($this->q)) {
  11.             return false;
  12.         }
  13.         return $this->q->fetchObject();
  14.     }


Вот так используется и все работает нормально


PHP:
скопировать код в буфер обмена
  1. if($this->db->query("SELECT * FROM `blog`;") {
  2.     while($row = $this->db->fetch_object()) {
  3.        
  4.     }
  5. }


Но если сделать вложенность, то ничего работать не будет

PHP:
скопировать код в буфер обмена
  1. if($this->db->query("SELECT * FROM `blog`;") {
  2.     while($row = $this->db->fetch_object()) {
  3.         if($this->db->query("SELECT * FROM `comment`;") {
  4.             while($row_x = $this->db->fetch_object()) {
  5.                
  6.             }
  7.         }
  8.     }
  9. }


Все дело в $this->db->q в которой сохраняется ссылка на обьект

В общем нужно как то применив замыкание сделать $this->q для каждого вызова функции query свою
2. caballero - 16 Сентября, 2013 - 18:09:50 - перейти к сообщению
потому что ты перезатираешь выборку первого запроса
и при чем тут замыкание
3. alexxorlovv - 16 Сентября, 2013 - 23:12:03 - перейти к сообщению
Попробуй такое решение(давно как то с пьяну набросал для себя Радость )Для простых запросов в самый раз.
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. class Sql
  3. {
  4.         private $_db;
  5.  
  6.         function __construct($db)
  7.         {
  8.                 $this->_db = $db;
  9.        
  10.         }
  11.        
  12.         private function keyParse($array)
  13.         {
  14.                 return implode(', ',array_keys($array));
  15.         }
  16.         private function valueParse($array)
  17.         {
  18.                 return implode(', ',array_values($array));
  19.         }
  20.        
  21.         private function valueQuote($array)
  22.         {
  23.        
  24.                 foreach($array as $k => $v)
  25.                         $array[$k] = $this->_db->quote($v);
  26.                 return $array;
  27.         }
  28.        
  29.         private function keyValueParse($array)
  30.         {
  31.                 foreach($array as $k => $v){
  32.                         $keyValue .= $k." = ".$v.", ";}
  33.                 return substr($keyValue,0,strlen($keyValue) - 2);      
  34.         }
  35.        
  36.          
  37.         public function insert($table,$params)
  38.         {
  39.                 $params = $this->valueQuote($params);
  40.                 $keys = $this->keyParse($params);
  41.                 $values = $this->valueParse($params);
  42.                 $sql = "INSERT INTO `{$table}` ({$keys}) VALUES({$values})";
  43.                 $insert = $this->_db->exec($sql);
  44.                 return $insert;
  45.        
  46.         }
  47.        
  48.         public function update($table,$params,$where = '')
  49.         {
  50.                 $params = $this->valueQuote($params);
  51.                 $params = $this->keyValueParse($params);
  52.                 $sql = "UPDATE {$table} SET {$params} WHERE {$where}";
  53.                 $update = $this->_db->exec($sql);
  54.                 if($update) return true;
  55.                 else return false;
  56.         }
  57.        
  58.         public function delete($table,$where)
  59.         {
  60.                 $sql = "DELETE FROM {$table} WHERE {$where}";
  61.                
  62.                 $delete = $this->_db->exec($sql);
  63.                 return $delete;
  64.         }
  65.        
  66.        
  67.        
  68.         public function select($table,$selection,$where = "",$type = null,$fetch="fetch")
  69.         {
  70.                 switch($type)
  71.                 {
  72.                 case "num": $pdo = PDO::FETCH_NUM;break;
  73.                 case "assoc": $pdo = PDO::FETCH_ASSOC;break;
  74.                 case "obj": $pdo = PDO::FETCH_OBJ;break;
  75.                 default: $pdo = PDO::FETCH_OBJ;
  76.                 }
  77.                 if($where != "") $where = "WHERE {$where}";
  78.                
  79.                         $sql = "SELECT {$selection} FROM {$table} {$where}";
  80.                
  81.                         $stmt = $this->_db->query($sql);
  82.                         $select = $stmt->$fetch($pdo);
  83.                         return $select;
  84.         }              
  85. }
  86. ?>

Хотелось бы подчеркнуть. Юзается PDO object
4. esterio - 16 Сентября, 2013 - 23:37:07 - перейти к сообщению
ничего хорошео в етом коде нет
5. alexxorlovv - 16 Сентября, 2013 - 23:57:32 - перейти к сообщению
Не буду отрицать, писал давно, но это решение неплохо упрощало работу с PDO
6. Stierus - 17 Сентября, 2013 - 09:24:06 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. if($result = $this->db->query("SELECT * FROM `blog`;") {
  3.     while($row = $result->fetch_object()) {
  4.         if($this->db->query("SELECT * FROM `comment`;") {
  5.             while($row_x = $this->db->fetch_object()) {
  6.                
  7.             }
  8.         }
  9.     }
  10. }

 

Powered by ExBB FM 1.0 RC1