来自 XMLHttpRequest 的带有 $_POST 的 MySqli 准备语句不起作用

MySqli prepared statement with $_POST from XMLHttpRequest isn't working

我正在尝试让一个简单的 mysqli 准备好的语句工作。我 运行 这个脚本使用 XMLHttpRequest。

在我正在处理的网站上,您可以提供大量输入,我需要清理所有内容。由于 mysqli_real_escape_string 不够,我必须使用准备好的语句。

这是没有准备语句的查询:

$account = $_POST["passaccountname"];
$newFullName = $_POST["userNameUpdate"];

$mysqli = new mysqli('localhost', 'root', '', 'os_test');
$sql = $mysqli->query("UPDATE test_users SET FULLNAME='".$newFullName."' WHERE LOWER(REPLACE(NAME, ' ', ''))='".$account."'");

效果很好,但当然不安全!

所以我研究了如何制作准备好的声明,看起来并不难。我更改了 passaccountname 变量并将其匹配到 'NAME' column/row.

尽管表面上看起来很简单,但似乎什么也没发生,现在是代码:

$account = $_POST["passaccountname"];
$newFullName = $_POST["userNameUpdate"];

$mysqli = new mysqli('localhost', 'root', '', 'os_test');
$sql = $mysqli->query("UPDATE test_users SET FULLNAME=? WHERE NAME=?");
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ss", $n, $a);

$n = $newFullName;
$a = $account;
$stmt->execute();

我的代码有问题吗?我真的不明白我在这里做错了什么。

你快到了。

目前您正在尝试执行此查询而不是准备它:

$sql = $mysqli->query("UPDATE test_users SET FULLNAME=? WHERE NAME=?");

删除对 query() 的调用。您可以将该行替换为:

$sql = "UPDATE test_users SET FULLNAME=? WHERE NAME=?";

由于您将该变量传递给下一行的 prepare()


编辑: 响应代码中的 , it's also generally a good idea to enable mysqli exceptions。默认情况下,像这样的错误 "fail silently",这使得它们很难被捕捉到。 (这可能只是为了与以前的 mysql/mysqli 错误检查向后兼容。)

通过启用这些例外,这些错误会更明显地报告并更容易找到。