首页 > 解决方案 > 来自 XMLHttpRequest 的带有 $_POST 的 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”列/行匹配。

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

$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();

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

标签: phpmysqliprepared-statement

解决方案


您快到了。

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

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

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

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

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


编辑:针对下面的评论,在您的代码中启用 mysqli 异常通常也是一个好主意。默认情况下,像这样的错误“静默失败”,这会使它们难以捕捉。(这可能只是为了与以前的 mysql/mysqli 错误检查向后兼容。)

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


推荐阅读