PHP登录表单SQL语法错误排查:为何执行SQL语句报错?
问题分析与解决方法
1. 语法错误的直接原因
你踩了MySQL语法里的一个常见坑:用**单引号(')**包裹了表名Catalogue和字段名username、password。MySQL的规则很明确:
- 字符串值(比如你输入的
konsskou、1234)才用单引号包裹; - 表名、字段名如果需要转义(比如和MySQL关键字重名),得用反引号(`),要是名字没冲突,甚至可以不用任何引号。
修正后的SQL语句可以是这样:
$query = "SELECT * FROM `Catalogue` WHERE `username` = '$u_n' AND `password` = '$psw' ;";
或者去掉反引号(如果你的表名和字段名不是MySQL关键字的话):
$query = "SELECT * FROM Catalogue WHERE username = '$u_n' AND password = '$psw' ;";
2. 必须重视的安全问题:SQL注入
虽然上面的修改能解决语法错误,但直接把用户输入的变量拼进SQL语句里,等于给攻击者敞开了SQL注入的大门——他们可以构造恶意输入,轻松窃取甚至篡改你的数据库数据。
正确的姿势是用PHP的预处理语句,不管是PDO还是mysqli都可以,这里给你举个mysqli的例子:
// 假设你已经通过mysqli建立了数据库连接$conn $stmt = $conn->prepare("SELECT * FROM Catalogue WHERE username = ? AND password = ?"); $stmt->bind_param("ss", $u_n, $psw); // "ss"表示两个参数都是字符串类型 $stmt->execute(); $result = $stmt->get_result(); $user = $result->fetch_assoc();
这种方式不仅能彻底避免SQL注入,还能省去手动拼接字符串时的语法烦恼。
3. 额外的安全提醒:密码存储
另外,直接把明文密码存在数据库里是非常危险的操作!你应该用PHP内置的password_hash()函数对密码做哈希处理后再存入数据库,登录时用password_verify()来验证,示例如下:
// 用户注册时存储密码 $hashedPsw = password_hash($psw, PASSWORD_DEFAULT); // 登录时验证密码 if(password_verify($psw, $user['password'])) { // 登录成功逻辑 } else { // 密码错误提示 }
内容的提问来源于stack exchange,提问作者user3697365
相关产品推荐
相关产品推荐

