Php 无效参数编号:绑定变量的数量与第38行上的令牌数量不匹配
我正在使用一个登录和注册系统,每当我尝试注册一个新帐户时,就会出现这个错误 警告:PDOStatement::execute:SQLSTATE[HY093]:无效参数编号:绑定变量的数量与第38行/home/public_html/classes/DB.php中的令牌数量不匹配 第38行是if$this->\u query->execute{ User.php Register.phpPhp 无效参数编号:绑定变量的数量与第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.=',' 这将导致准备
在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>