2015-05-21 2 views
0

Я продолжаю получать предупреждение при попытке сделать этот объектно-ориентированный журнал в системе. Я пытаюсь сделать функцию вставки прямо сейчас, но предупреждение останавливает меня.php Ошибка при попытке создания системы входа в систему OOP

Предупреждение: Неверный аргумент поставляются для Еогеасп() в C: \ XAMPP \ HTDOCS \ YetiDraft \ yetidb \ Классы \ db.php на линии 32

Строка 32 является утверждение Foreach функцией запроса,

<?php 

class db { 
    private static $_instance = null; 
    private $_pdo, 
      $_query, 
      $_error = false, 
      $_results, 
      $_count = 0; 

    private function __construct() { 
     try { 
      $this->_pdo = new PDO('mysql:host=' . config::get('mysql/host') . ';dbname=' . config::get('mysql/db'), config::get('mysql/username'), config::get('mysql/password')); 
     } catch(PDOException $e) { 
      die($e->getMessage()); 
     } 
    } 

    public static function getInstance(){ 
     if(!isset(self::$_instance)){ 
      self::$_instance = new db(); 
     } 
     return self::$_instance; 

    } 

    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++; 
       } 
      } 

      if($this->_query->execute()){ 
       $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
       $this->_count = $this->_query->rowCount(); 
      }else{ 
       $this->_error = true; 
      } 
     } 
     return $this; 
    } 


    public function action($action, $table, $where = array()){ 
     if(count($where) === 3){ 
      $operators = array('=', '>', '<', '>=', '<=',); 

      $field = $where[0]; 
      $operator = $where[1]; 
      $value = $where[2]; 

      if(in_array($operator, $operators)){ 
       $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; 
       if(!$this->query($sql, array($value))->error()){ 
        return $this; 
       } 
      } 
     } 
     return false; 
    } 

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

    public function delete($table, $where){ 
     return $this->action('DELETE', $table, $where); 
    } 

    public function insert($table, $fields = array()){ 
     if(count($fields)){ 
      $keys = array_keys($fields); 
      $values = ''; 
      $x = 1; 

      foreach($fields as $fields){ 
       $values .= "?"; 
       if($x < count($fields)){ 
        $values .= ', '; 
       } 
       $x++; 
      } 

      $sql = "INSERT INTO users (`" . implode('`, `', $keys) ."`) VALUES ({$values})"; 

      if(!$this->query($sql, $fields)->error()){ 
       return true; 
      } 
     } 
     return false; 
    } 

    public function results(){ 
     return $this->_results; 
    } 

    public function first(){ 
     return $this->results()[0]; 
    } 

    public function error(){ 
     return $this->_error; 
    } 

    public function count() { 
     return $this->_count; 
    } 

} 



?> 
+0

Kishor Я предполагаю, что вы имеете в виду var_dump ($ params)? – Jobst

+0

Вы не даете достаточно информации ... с чем вы называете класс? – Jobst

+0

Можете ли вы 'var_dump ($ params)' и посмотреть, что выводит? – Kishor

ответ

0

Эта часть может вызвать проблемы:

foreach($fields as $fields){ 
    $values .= "?"; 
    if($x < count($fields)){ 
     $values .= ', '; 
    } 
    $x++; 
} 

Вы используете переменную $fields как в качестве источника и в качестве итератора.

Выполнение перезаписывает $fields с последним элементом массива. По этой причине, в следующем вызове, $fields не является массив больше:

if(!$this->query($sql, $fields)->error()){ 

И так как вы пытаетесь итерация по значению $fields в $this->query(), вы получаете сообщение об ошибке.

Благодаря Barmar для наконечника!


Попробуйте вместо этого:

foreach($fields as $field){ 
    $values .= "?"; 
    if($x < count($fields)){ 
     $values .= ', '; 
    } 
    $x++; 
} 

Edit: Или использовать решение Barmar вместо этого. Его решение лучше.

+0

Это не строка, которая получает ошибку, и это не приведет к ошибке. 'foreach' сохраняет массив внутри, поэтому он не вызывает проблем, если вы повторно используете переменную. Это просто сбивает с толку читателей (таких как вы). – Barmar

+0

Фактически, это вызывает проблему косвенно. Затем он вызывает запрос '$ this-> ($ sql, $ fields)' из этой функции. В этот момент '$ fields' содержит последнее поле, а не исходный массив. – Barmar

+0

В вашем ответе 'count ($ field)' должно быть 'count ($ fields)' - он хочет избежать добавления ',', когда он добавляет последнее поле в строку. – Barmar

0

Мое предположение, что $params не является массивом и, следовательно, не пересекается. Сделайте небольшую проверку перед этим foreach.

if (is_array($params)) 
    { 
    foreach ($params as $param) 
    { 
    //do things here 
    } 
    } 

count() не является надежным способом проверить, является ли переменная массивом. Используйте is_array вместо count(). Вероятно, ваша ошибка - это переменная isnt array, и вы пытаетесь пройти через переменную.

+0

Это избавит вас от ошибки, но не сделает код работать. – Barmar

+0

ему нужно исправить проблему, из-за которой '$ params' не должен быть массивом в первую очередь. – Barmar

+0

Да. Я попросил его сделать var_dump, и он еще не ответил. – Kishor

0

Замените петлю:

foreach($fields as $field){ 
    $values .= "?"; 
    if($x < count($field)){ 
     $values .= ', '; 
    } 
    $x++; 
} 

с

$values = implode(', ', array_fill(0, count($fields), '?')); 

Потому что вы повторно использовать переменную $fields как итерационные переменные, когда ваш цикл не делаются $fields больше не содержит массив полей, он содержит значение последнего поля. Поэтому, когда вы вызываете $this->query($sql, $fields), вы передаете строку вместо массива, а foreach внутри query() не будет работать.

+0

Ошибка встречается в строке 32. Thats foreach выше той, которую вы цитируете. Это строка 'foreach ($ params as $ param) {' – Kishor

+0

Я понимаю. Он получает аргумент '$ params' из этого кода. Из-за этой ошибки '$ params' является строкой вместо массива, как это должно быть. – Barmar

+0

Спасибо, Бармар, который отлично работал, как я тоже этого хотел. –

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