【问题标题】:How to use prepared statements in multi user website?如何在多用户网站中使用准备好的语句?
【发布时间】:2020-05-03 05:15:01
【问题描述】:

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

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

它只是简单地删除所有$mysqli->escape_strings 并替换我的代码的其他部分,如下所示:

$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 应该放在我网站的代码中的什么位置?

【问题讨论】:

  • 不会每次都做模板准备是的,但这不是问题
  • 我是否应该在服务器启动时准备所有语句不,实际上不可能,因为没有地方可以存储准备好的语句
  • 当您更新数据库中的 20 行时,会出现重用概念,其中包含来自一个表单的 20 个输入,所有这些输入都集中在一次点击中。然后你准备语句once outside循环,然后将参数泵入循环内的执行

标签: php mysql mysqli prepared-statement


【解决方案1】:

是否只是删除所有 $mysqli->escape_strings 并用占位符替换变量

是的。

人们说准备好的语句更有效,因为语句模板只准备一次,然后可以与不同的参数一起重复使用。

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

它仅在语句变量中起作用,因此仅适用于单个 PHP 实例。意味着您只能将其用于重复插入/更新。即使在那里,收益也不是什么显着的东西。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多