PHP处理AJAX注册请求报PDOException:SQLSTATE[HY093参数不匹配错误
问题根源
你收到的SQLSTATE[HY093]报错是PDO预处理语句的占位符数量和绑定参数数量不匹配导致的,问题出在查询用户是否存在的SQL语句上:
$find_user = $con->prepare("SELECT * FROM usuarios WHERE nickname = '$nickname' LIMIT 1");
你直接把$nickname变量用单引号拼接进了SQL语句,此时预处理语句里根本没有:nickname这个命名占位符,但你后续又调用bindParam(':nickname', $nickname, PDO::PARAM_STR)绑定了1个参数,绑定的参数找不到对应的占位符,就触发了这个报错。
修复方案
1. 修正PHP代码
除了调整预处理语句的写法,还要补充session开启逻辑,否则后续存储$_SESSION会失效:
<?php require_once "../inc/config.php"; // 开启session才能操作$_SESSION变量 session_start(); if($_SERVER['REQUEST_METHOD'] == 'POST'){ header("Content-Type: application/json"); $return_array=[]; $nickname = strtolower($_POST['nickname']); /* 修复查询语句,使用命名占位符 */ $find_user = $con->prepare("SELECT * FROM usuarios WHERE nickname = :nickname LIMIT 1"); $find_user->bindParam(':nickname', $nickname, PDO::PARAM_STR); $find_user->execute(); if($find_user->rowCount() == 1){ $return_array['error'] = "Este usuario ya está registrado"; $return_array['is_login']= false; }else{ $password =password_hash($_POST['password'],PASSWORD_DEFAULT); $new_user = $con->prepare("INSERT INTO usuarios (nickname, password) VALUES(:nickname, :password)"); $new_user->bindParam(':nickname', $nickname, PDO::PARAM_STR); $new_user->bindParam(':password', $password, PDO::PARAM_STR); $new_user->execute(); $user_id = $con->lastInsertId(); $_SESSION['user_id']= (int) $user_id; $return_array['redirect']= ''; $return_array['is_login']= true; } echo json_encode($return_array); }else{ exit("Refused"); } ?>
2. 可选修复前端逻辑笔误
你的JS代码中密码校验逻辑存在不一致:提示文案是密码最少8位,但判断条件是长度小于5就触发提示,可以调整为:
}else if(data_form.password.length < 8){ $("#msg_error").text("Tu password debe ser minimo de 8 caracteres.").show(); return false; }
内容的提问来源于stack exchange,提问作者Ander Canales Medina
相关产品推荐
相关产品推荐

