Php 无效参数编号:绑定变量的数量与第38行上的令牌数量不匹配

Php 无效参数编号:绑定变量的数量与第38行上的令牌数量不匹配,php,login,system,Php,Login,System,我正在使用一个登录和注册系统,每当我尝试注册一个新帐户时,就会出现这个错误 警告:PDOStatement::execute:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与第38行/home/public_html/classes/DB.php中的令牌数量不匹配 第38行是if$this->\u query->execute{ User.php Register.php 在insert方法中构建查询时,我认为行$values.='.;需要改为$values.=',' 这将导致准备

我正在使用一个登录和注册系统,每当我尝试注册一个新帐户时,就会出现这个错误

警告:PDOStatement::execute:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与第38行/home/public_html/classes/DB.php中的令牌数量不匹配

第38行是if$this->\u query->execute{

User.php

Register.php


在insert方法中构建查询时,我认为行$values.='.;需要改为$values.=','


这将导致准备好的语句格式正确。

您不应该在构造函数中执行die$e->getMessage。如果由于任何原因无法连接,它将显示您的登录凭据。您还应该让我们知道您的SQL是什么,以及向查询方法传递了哪些参数。@Mike,尽管我不再是getti对于这个错误,我仍然收到一个错误,说无法创建帐户。创建帐户时出现问题。你仍然没有发布实际的SQL查询。当你发布200多行逻辑,甚至没有给出它产生的结果时,你希望人们如何调试你的代码?因此错误现在已经消失,但现在我得到了错误,创建帐户时出现问题。请检查以确保mysql未返回任何错误,并查看数据库中是否实际创建了任何记录。如果仍然存在问题,请发布输出该错误消息的代码。我将Users.php添加到主帖子中,这就是显示错误的内容。要调试此错误,您应该检查您的$sql string看起来像,并检查附加到上次执行的查询的任何错误消息。在这种情况下,我认为您的值后面有一个尾随?,?,?,?,string。若要解决此问题,请在insert方法中设置$x=0;而不是$x=1;。我更改了该行,但不幸的是,我仍然无法生成帐户错误。
<?php

error_reporting(E_ALL); 

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 = null;
            $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;


    }
}
<?php
class User {
    private $_db,
            $_data,
            $_sessionName,
            $_isLoggedIn;

    public function __construct($user = null) {
        $this->_db = DB::getInstance();

        $this->_sessionName = Config::get('session/session_name');

        if(!$user) {
            if(Session::exists($this->_sessionName)) {
                $user = Session::get($this->_sessionName);

                    if($this->find($user)) {
                        $this->_isLoggedIn = true;
                    } else {
                        // process Logout
                    }   
                }
            } else {
                $this->find($user);
        }   
    }

    public function create($fields = array()) {
        if(!$this->_db->insert('users', $fields)) {
            throw new Exception('There was a problem creating an account.');
        }
    }

    public function find($user = null) {
        if($user) {
            $field = (is_numeric($user)) ? 'id' : 'username';
            $data = $this->_db->get('users', array($fields, '=', $user));

            if($date->count()) {
                $this->_data = $date->first();
                return true;
            }
        }
    }

    public function login($username = null, $password = null) {
        $user = $this->find($username);

        if($user) {
            if($this->data()->password === Hash::make($password, $this->data()->salt)) {
                Session::put($this->_sessionName, $this->data()->id);
                return true;
            }   
        }

            return false;

    }

    public function logout() {
        Session::delete($this->_sessionName);
    }

    public function data() {
        return $this->_data;
    }

    public function isLoggedIn() {
        return $this->_isLoggedIn;
    }
}
<?php
require_once 'core/init.php';

if(Input::exists()) {
    if(Token::check(Input::get('token'))) {
    $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()) {
            $user = new User();

            $salt = Hash::salt(32);

            try {

                $user ->create(array(
                    'username' => input::get('username'),
                    'password' => hash::make(input::get('password'), $salt),
                    'salt' => $salt,
                    'name' => input::get('name'),
                    'joined' => date('Y-m-d H:i:s'),
                    'group' => 1
                ));

                Session::flash('home', 'you have been registered and can now log in!');
                Redirect::to('index.php');

            } catch(Exception $e) {
                die($e->getMessage());
            }
        } 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">
    </div>

    <div class="field">
        <label for="password_again">Enter your password again</label>
        <input type="password" name="password_again" id="password_again">
    </div>

    <div class="field">
        <label for="name">Enter your name</label>
        <input type="text" name="name" value"<?php echo escape(Input::get('username')); ?>" id="name">
    </div>

    <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
    <input type="submit" value="Register">
</form>