php - 如何在多用户网站中使用准备好的语句?
问题描述
哪里(在代码中)将准备好的语句的元素放置在许多用户与数据库交互的网站中?
我正在将我的代码从使用转换$mysqli->escape_string
为使用准备好的语句,因为人们说这是防止 sql 注入的更好方法。
它只是简单地删除所有$mysqli->escape_string
s 并替换我的代码的其他部分,如下所示:
$mysqli->query("update `users` set `email`='$newEmail' where `userid`={$_SESSION['userid']} limit 1");
替换为:
$stmt = $mysqli->prepare("update `users` set `email`=? where `userid`=? limit 1");
$stmt->bind_param('si',$newEmail,$_SESSION['userid']);
$stmt->execute();
$stmt->close();
?
人们说准备好的语句更有效,因为语句模板只准备一次,然后可以与不同的参数一起重复使用。但是在上面的代码替换中,不是每次用户想要更新他们的电子邮件地址时都要完成模板准备吗?我应该在服务器启动时准备所有语句吗?并且不再准备它们?(虽然我不知道该怎么做。)prepare
,bind_param
和close
应该放在我网站代码的什么地方?
解决方案
是否只是删除所有 $mysqli->escape_strings 并用占位符替换变量
是的。
人们说准备好的语句更有效,因为语句模板只准备一次,然后可以与不同的参数一起重复使用。
忘掉它。没有办法在请求之间重用准备好的语句。
它仅适用于语句变量,因此仅适用于单个 PHP 实例。意味着您只能将其用于重复插入/更新。即使在那里,收益也不是什么显着的东西。
这更像是一种营销技巧,而不是真正有用的功能。
推荐阅读
- vue.js - 获取 HTML 元素作为 v-bind 数据
- email - 我的 Google Apps 脚本应用程序发送的电子邮件来自哪个服务器?
- css - VuePress - 忽略页面特定部分中的核心样式
- java - 用户发送消息时消息重复两次
- firefox - Firefox 本地文件系统链接在量子
- reactjs - 如何创建\合并函数
- python-3.x - 使用 Python 绘制 3D 散点图仅返回一个空白区域(Jupyter Notebook)
- javascript - 在点击事件时从本地存储更改值并不总是有效
- java - 如何知道 Future 是用 Callable 还是 Runnable 创建的
- karate - 如何在空手道功能文件中转义“(”