我正在尝试确认用户电子邮件,其中用户验证密钥是变量$verify_mod
。但是,我收到错误,
您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在第 1 行的"WHERE verification="72b4ad7ee82dd6e177f2588c168abb51user=test123"附近使用的正确语法
这是我的查询:
$confirm_query = "INSERT INTO users (confirm_email) VALUES ('1') WHERE verification='$verify_mod'";
INSERT 语句不附带 WHERE 子句。要么你试图插入一些东西,在这种情况下你应该删除 WHERE 子句,要么你想修改一个值,在这种情况下你应该使用 UPDATE ..设置。
// For an insert:
$confirm_query = "INSERT INTO users (confirm_email) VALUES ('1')";
// For an update:
$confirm_query = "UPDATE users SET confirm_email='1' WHERE verification='$verify_mod'";
除此之外,最好在表和列名称周围放置 ' 字符以降低 SQL 注入的风险。所以:
// For an insert:
$confirm_query = "INSERT INTO `users` (`confirm_email`) VALUES ('1')";
// For an update:
$confirm_query = "UPDATE `users` SET `confirm_email`='1' WHERE `verification`='$verify_mod'";
最后,我不知道您使用的是mysqli_*函数还是PDO或mysql_*函数(在后一种情况下,您绝对应该更改为其他函数之一,因为mysql_*已被弃用)。在前两种情况下,都应使用参数化查询或预准备语句。准备查询,然后填写变量(此处$verify_mod
)。这样,变量就可以正确转义,再次降低SQL注入的风险。
您正在执行插入,这听起来应该是一个更新语句(您也不能在插入中的位置,因为它没有意义):
$confirm_query = "UPDATE users set confirm_email=1 WHERE verification='$verify_mod'"
扩展@CamilStaps答案,以下是使用 mysqli 参数化查询的方法。
// For an insert: (No need to bind parameters for this one)
$confirm_query = $mysqli->prepare("INSERT INTO `users` (`confirm_email`) VALUES ('1')");
$confirm_query->execute();
// For an update:
$confirm_query = $mysqli->prepare("UPDATE `users` SET `confirm_email`='1' WHERE `verification`= ? ");
$confirm_query->bind_param('s', $verify_mod);
$confirm_query->execute();