通过表单更新登录用户信息时遇SQL未知列错误求助
问题分析与解决方案
嘿,这问题一看就明白啦!你碰到的Unknown column 'Adrian93' in 'where clause'错误,核心原因是WHERE子句里的用户名没加单引号。
MySQL会把没有引号包裹的Adrian93当成一个列名去查找,而你的users表根本不存在这个名字的列,自然就抛出错误了。
先快速修复当前报错
把WHERE子句里的用户名用单引号包裹起来就行:
$query = "UPDATE users SET firstName='$firstName', lastName='$lastName', DOB='$DOB', natInsNo='$natInsNo', address='$address', email='$email', mobile='$mobile', password='$password' WHERE username = '{$_SESSION['username']}'";
注意看'{$_SESSION['username']}'这部分,外层加了单引号后,MySQL就会把它当成字符串值去匹配用户名字段了。
更关键的:改用预处理语句杜绝SQL注入
不过上面的写法存在SQL注入风险,强烈建议用MySQLi的预处理语句来实现,这才是安全规范的做法:
if(isset($_POST['update'])) { // 获取表单提交的数据 $firstName = $_POST['firstName']; $lastName = $_POST['lastName']; $DOB = $_POST['dob']; $natInsNo = $_POST['natInsNo']; $address = $_POST['address']; $email = $_POST['email']; $mobile = $_POST['mobile']; $password = $_POST['password']; $username = $_SESSION['username']; // 准备预处理SQL语句 $stmt = $conn->prepare("UPDATE users SET firstName=?, lastName=?, DOB=?, natInsNo=?, address=?, email=?, mobile=?, password=? WHERE username = ?"); // 绑定参数(s代表字符串类型,可根据你的字段实际类型调整) $stmt->bind_param("sssssssss", $firstName, $lastName, $DOB, $natInsNo, $address, $email, $mobile, $password, $username); // 执行更新操作 if($stmt->execute()){ echo "用户信息更新成功!"; } else { echo "更新失败:" . $stmt->error; } // 关闭预处理语句 $stmt->close(); }
预处理语句会自动处理字符串的引号问题,还能彻底避免SQL注入攻击,比直接拼接SQL的写法安全得多。
内容的提问来源于stack exchange,提问作者Adrian Lanigan
相关产品推荐
相关产品推荐

