php - 来自 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();
我的代码有问题吗?我真的不明白我在这里做错了什么。
解决方案
您快到了。
目前您正在尝试执行此查询而不是准备它:
$sql = $mysqli->query("UPDATE test_users SET FULLNAME=? WHERE NAME=?");
删除对 的调用query()
。您可以将该行替换为:
$sql = "UPDATE test_users SET FULLNAME=? WHERE NAME=?";
由于您将该变量传递给prepare()
下一行。
编辑:针对下面的评论,在您的代码中启用 mysqli 异常通常也是一个好主意。默认情况下,像这样的错误“静默失败”,这会使它们难以捕捉。(这可能只是为了与以前的 mysql/mysqli 错误检查向后兼容。)
通过启用这些异常,这些错误会更明显地报告并更容易找到。
推荐阅读
- css - 是否可以使用 CSS 使图像中的白色像素透明或接近它?
- neo4j - Neo4j APOC 删除所有触发器
- kubernetes - Kubernetes 集群中每个节点一个用户
- python - Python - 复制排序列表的索引
- c# - 调整 .NET 中的“夏令时”(DST)选项,就像 Windows
- vb.net - IntelliSense 和折叠的 XML 注释在设计视图中未按需要显示
- arrays - 如何将结构保存到领域,以及另一个结构的列表
- html - HTML 电子邮件:Outlook 中的粗体字重不起作用
- office365-apps - Office 365 文档查看器 - 不适用于具有端口号的 URL
- python - 我可以编写在执行期间修改自身的python代码吗?