【问题标题】:PHP PDO - Uncaught Error: Call To Undefined MethodPHP PDO - 未捕获的错误:调用未定义的方法
【发布时间】:2017-06-15 22:27:51
【问题描述】:

register.php

    <?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()。确切的错误是

致命错误:未捕获的错误:调用 C:\xampp\htdocs\LoginRegistrationSystem\classes\validate.php:50 中未定义的方法 Validate::count() 堆栈跟踪:#0 C:\xampp\htdocs\LoginRegistrationSystem\ register.php(8): Validate->check(Array, Array) #1 {main} 在第 50 行的 C:\xampp\htdocs\LoginRegistrationSystem\classes\validate.php 中抛出

请帮忙,我检查了代码 3-4 次,但找不到错误。谢谢!

【问题讨论】:

  • 是的,没错,一个名为count() 的函数似乎没有在该类中定义,我们还能说什么?你的问题是$this-&gt;count()... 但是$this-&gt;_db-&gt;count() 存在

标签: php pdo


【解决方案1】:

恕我直言,您没有在 Validate 类中实现函数 count()(您在 Validate.php 的第 50 行使用 if($this->count()) 调用它)。

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

【讨论】:

  • 我将if($this-&gt;count()) 更改为if($check-&gt;count()),然后出现新的错误提示,在布尔值上调用成员函数count()。
  • 表示 $this->_db->get 返回 true 或 false(布尔值)。那是因为您正在调用 db->get() db->action() ,这可能 for if(count($where) === 3) 返回 false 而不是您可能期望的结果集。
  • 酷,所以你应该用修复来回答你自己的问题,或者将修复作为评论附加到这个答案并接受它
  • 我刚刚删除了$field = '$where[0]'; $operator = '$where[1]'; $value = '$where[2]';中的引号
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 2018-04-11
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2017-06-11
相关资源
最近更新 更多