来自 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 错误检查向后兼容。)
通过启用这些例外,这些错误会更明显地报告并更容易找到。
我正在尝试让一个简单的 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()
。
编辑: 响应代码中的
通过启用这些例外,这些错误会更明显地报告并更容易找到。