PHP PDO - 未捕获的错误:调用未定义的方法

问题描述:

register.phpPHP PDO - 未捕获的错误:调用未定义的方法

<?php 
    require_once 'core/init.php'; 

    if(Input::exists()) 
    { 
     $validate = new Validate(); 
     $validation = $validate->check($_POST, array(
      'username' => array(
       'required' => true, 
       'min' => 2, 
       'max' => 20, 
       'unique' => 'users' 
      ), 
      'password' => array(
       'required' => true, 
       'min' => 6, 

      ), 
      'password_again' => array(
       'required' => true, 
       'matches' => 'password' 
      ), 
      'name' => array(
       'required' => true, 
       'min' => 2, 
       'max' => 50 
      ), 
     )); 

     if($validation->passed()) 
     { 
      echo "Passed"; 
     } 
     else 
     { 
      foreach ($validation->errors() as $error) 
      { 
       echo $error, '<br>'; 
      } 
     } 
    } 
    ?> 

    <form action="" method="post"> 
     <div class="field"> 
      <label for="username">Username</label> 
      <input type="text" name="username" id="username" value="<?php echo escape(Input::get('username')) ?>" autocomplete="off"> 
     </div> 
     <div class="field"> 
      <label for="password">Choose a password</label> 
      <input type="password" name="password" id="password" value="<?php echo escape(Input::get('password')) ?>" autocomplete="off"> 
     </div> 
     <div class="field"> 
      <label for="password_again">Enter your password again</label> 
      <input type="password" name="password_again" id="password_again" value="<?php echo escape(Input::get('password_again')) ?>" autocomplete="off"> 
     </div> 
     <div class="field"> 
      <label for="name">Your name</label> 
      <input type="text" name="name" id="name" value="<?php echo escape(Input::get('name')) ?>" autocomplete="off"> 
     </div> 
     <input type="submit" name="register"> 
    </form> 

db.php中

<?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()) 
     { 
      $keys = array_keys($fields); 
      $values = ''; 
      $x = 1; 

      foreach($fields as $field) 
      { 
       $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 update($table, $id, $fields) 
     { 
      $set = ''; 
      $x = 1; 

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

      $sql = "UPDATE {$table} SET {$set} WHERE id = {$id}"; 

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

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

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

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

validate.php

<?php 
    class Validate 
    { 
     private $_passed = false, 
       $_errors = array(), 
       $_db = null; 

     public function __construct() 
     { 
      $this->_db = db::getInstance(); 
     } 

     public function check($source, $items = array()) 
     { 
      foreach($items as $item => $rules) 
      { 
       foreach($rules as $rule => $rule_value) 
       { 
        $value = trim($source[$item]); 
        $item = escape($item); 

        if($rule === 'required' && empty($value)) 
        { 
         $this->addError("{$item} is required"); 
        } 
        else if(!empty($value)) 
        { 
         switch($rule) 
         { 
          case 'min': 
           if(strlen($value) < $rule_value) 
           { 
            $this->addError("{$item} must be a minimum of {$rule_value} characters"); 
           } 
          break; 
          case 'max': 
           if(strlen($value) > $rule_value) 
           { 
            $this->addError("{$item} must be a maximum of {$rule_value} characters"); 
           } 
          break; 
          case 'matches': 
           if($value != $source[$rule_value]) 
           { 
            $this->addError("{$rule_value} must match {$item}"); 
           } 
          break; 
          case 'unique': 
           $check = $this->_db->get($rule_value, array($item, '=', $value)); 
           if($this->count()) 
           { 
            $this->addError("{$item} already exists"); 
           } 
          break; 
         } 
        } 
       } 
      } 

      if(empty($this->_errors)) 
      { 
       $this->passed = true; 
      } 
      return $this; 
     } 

     private function addError($error) 
     { 
      $this->_errors[] = $error; 
     } 

     public function errors() 
     { 
      return $this->_errors; 
     } 

     public function passed() 
     { 
      return $this->_passed; 
     } 
    } 

的init.php

<?php 
    session_start(); 

    $GLOBALS['config'] = array 
    (
     'mysql' => array 
     (
      'host' => '127.0.0.1', 
      'username' => 'root', 
      'password' => '', 
      'db' => 'lr' 
     ), 
     'remember' => array 
     (
      'cookie_name' => 'hash', 
      'cookie_expiry' => 604800 
     ), 
     'session' => array 
     (
      'session_name' => 'user' 
     ) 
    ); 

    spl_autoload_register(function($class) 
    { 
     require_once 'classes/'.$class.'.php'; 
    }); 

register.php包含一个登记表。我还没有写代码将其存储在数据库中,我只是做了输入验证。 register.php返回错误,说未定义的方法count()。确切的错误是

致命错误:未捕获错误:调用未定义的方法验证:: count()在C:\ xampp \ htdocs \ LoginRegistrationSystem \ classes \ validate.php:50堆栈跟踪:#0 C:\ xampp \ htdocs \ LoginRegistrationSystem \ register.php(8):验证 - >检查(数组,数组)帮助,我通过代码3-4次,但无法找到错误。谢谢!

+2

是的,这是正确的,名为count()的函数似乎没有在该类中定义,我们还能说什么?你的问题是'$ this-> count()'...但是'$ this - > _ db-> count()'存在,虽然 – Scuzzy

Imho你没有在Validate类中实现函数count()(你在Validate.php的第50行用if($ this-> count())调用它)。

实现该函数或更改调用它的函数应该来自不同的类。 ($ this - > _ db-> count()最可能)

+0

if($ this-> count())'if' $ check-> count())',然后出现新的错误:调用boolean上的成员函数count()。 –

+0

这意味着$ this - > _ db-> get返回true或false(布尔值)。这是因为你正在调用db-> get()db-> action(),这可能会影响if(count($ where)=== 3)返回false而不是结果集,因为你可能期望。 – Dolfa

+0

感谢您的帮助,我发现我的错误。 –