2015-05-12 2 views
0

У меня возникли проблемы с использованием GROUP BY, ORDER BY, LIMIT, в общем, мои запросы отлично работают, но когда я пытаюсь получить более конкретную информацию, я продолжаю сталкиваться с проблемами. Я пытаюсь сломать его и идти шаг за шагом, но я не могу понять проблему.Конструкция запросов PDO с GROUP BY, ORDER BY

Из моего пользователя класса Я называю DB, как это:

$this->_db->get('listings', array('userid', '=', $this->data()->id, ' AND ', 
'email', ' = ', $this->data()->email, ' GROUP BY reference ORDER BY row ASC')); 

Мой DB Класс настроен так:

public function get($table, $where){return $this->action('SELECT * ', $table, $where);} 


private function action($action, $table, $where = array()){ 
     $operators = array('=', '>', '<', '>=', '<=' , 'AND' ,'OR', 'LIKE', 'GROUP BY','ORDER BY', 'ASC', 'DESC'); 

     if(!empty($where)){ 
      $sql = "{$action} FROM {$table} WHERE "; 
      if(count($where) > 3){ 
       $sql .= "("; 
       $isOp = FALSE; 
       foreach ($where as $key => $value) { 
        if($isOp){ 
         if(in_array($value, $operators)){ 
          $sql .= " {$value} "; 
          $isOp = FALSE; 
         }else{return FALSE;} 
        }else{ 
         $sql .= " {$value} "; 
         $isOp = TRUE; 
        } 
       } 
       $sql .= ")"; 

       if(!$this->query($sql, array($value))->error()){return $this;} 
      }else if(count($where) === 3){ 
       $field  = $where[0]; 
       $operator = $where[1]; 
       $value  = $where[2]; 
       if(in_array($operator, $operators)){ 
        $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; // NO $value ? 
        if(!$this->query($sql, array($value))->error()){return $this;} 
       } 
      } 
     }else{ 
      // If array is empty 
      $sql = "{$action} FROM {$table}"; 
      if(!$this->query($sql)->error()){return $this;} 
     } 
     return FALSE; 
    } 


public function query($sql, $params = array()){ 
     $this->_error = FALSE; 
     if($this->_query = $this->_pdo->prepare($sql)){ 
      $x = 1; 
      if(count($params)){ 
       foreach($params as $param){ 
        $this->_query->bindValue($x, $param); 
        $x++; 
       } 
      }// End IF count 

      if($this->_query->execute()){ 
        $this->_lastID = $this->_pdo->lastInsertId(); 
        try{ 
         $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
        }catch(Exception $e){ 
         // Catch Error 
        } 
        $this->_count = $this->_query->rowCount(); 
      }else{$this->_error = TRUE;} 
     } 
     return $this; 
    } 

В общем я строю все с нуля чтение учебников и последующие инструкции из книг.

Снова у меня возникают проблемы со следующей группой «По порядку, как, лимит». Я, вероятно, не привязываю ее правильно, но у меня недостаточно знаний, чтобы найти мою ошибку.

Заранее спасибо.

ОШИБКА ПОЛУЧИТЬ

SELECT * FROM предложений WHERE (идентификатор пользователя = 4 GROUP BY ссылки) за исключением 'PDOException' с сообщением «SQLSTATE [42000]: Ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «GROUP BY ссылки)» в строке 1

+0

https://dev.mysql.com/doc/refman/5.0/en/select.html – Uueerdo

+0

@Uueerdo, это не моя проблема, у меня проблема с привязкой значений правильно. Я считаю, что моя проблема лежит внутри функции query() – theStudent

+0

Указанная вами ошибка указывает иначе: 'GROUP BY' не является допустимым условием для WHERE. – Uueerdo

ответ

0

Я бы избавиться от() в вас код (DB класс):

$sql .= "("; 
$sql .= ")"; 

Группа GROUP BY не должна находиться в разделе() ГДЕ.

WHERE (идентификатор пользователя = 4 GROUP BY ссылки)

Должно быть:

WHERE (userid = 4) GROUP BY reference; 

Или лучше:

WHERE userid = 4 GROUP BY reference; 

Вы используете GROUP BY функции при использовании SUM, COUNT, и т. д. в SELECT. Иначе вам это не нужно.