You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:08:28