php - 如何在多用户网站中使用准备好的语句?

标签 php mysql mysqli prepared-statement

在许多用户与数据库交互的网站中,将准备好的语句的元素放置在哪里(在代码中)?

我正在将代码从使用 $mysqli->escape_string 转换为使用准备好的语句,因为人们说这是防止 SQL 注入(inject)的更好方法。

是否只是删除所有 $mysqli->escape_string 并替换代码的其他部分,如下所示:

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

人们说准备好的语句更有效,因为语句模板仅准备一次,然后可以使用不同的参数重复使用。但是在上面的代码替换中每次用户想要更新其电子邮件地址时是否都会完成模板准备?我应该在服务器启动时准备所有语句吗?并且不再准备它们? (虽然我不知道该怎么做。) preparebind_paramclose 应该放在我网站代码的什么位置?

最佳答案

Is it simply removing all $mysqli->escape_strings and also replacing variables with placeholders

是的。

People say prepared statements is more efficient as statement template is prepared only once and then it can be re-used with different parameters.

忘记它吧。无法在请求之间重用准备好的语句。

它仅在语句变量中工作,因此仅适用于单个 PHP 实例。意味着您只能将其用于重复插入/更新。即使在那里, yield 也不显着。

这更像是一种营销技巧,而不是真正有用的功能。

关于php - 如何在多用户网站中使用准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59768332/

相关文章:

javascript - 使用服务器发送的事件将更新推送到网页

javascript - Ajax:表单数据未传递到电子邮件

php - 从 mysqli_query 获取成功/失败响应

php - 转义特殊字符

php - 如何将 Num1 与 Num2 与 num1-num2 格式组合?

php - 发送带有自定义 header PHP 的 GET HTTPS 请求

mysql - 更新 SQL 查询

mysql - mysql中物化 View 和普通表的区别?

php - 将多个参数绑定(bind)到mysqli查询中

php - htaccess 创建集中的 php 文件