【问题标题】:What is the difference?有什么不同?
【发布时间】:2018-11-16 15:45:38
【问题描述】:

您能告诉我以下代码之间是否存在相关差异?

$stmtLA = "SELECT `title`, `audio`, `capa`, `link`, `alt` FROM table WHERE type = 'tes' AND formato = 'mv' ORDER BY id DESC LIMIT 6";
$IDLA       = $conn->query($stmtLA);

$IDLA = $conn->query("SELECT `title`, `audio`, `capa`, `link`, `alt` FROM table WHERE type = 'tes' AND formato = 'nv' ORDER BY id DESC LIMIT 6");

我有很多这样的查询,从我的数据库中获取记录并在屏幕上打印。我在想如果我使用“单行”查询是否能获得性能。

【问题讨论】:

  • 为自己保存一个变量不会获得更好的性能。
  • formato = 'nv' vs formato = 'mv' 在查询中有所不同,因此它们应该返回不同的结果。也许有意图使值“mv”变量?这可以通过使用 PDO 在变量中准备查询来完成
  • @SanderVisser Nop,这只是随机值。只是在这里问

标签: mysql sql pdo


【解决方案1】:

第一个版本创建一个丢弃变量,然后在查询中使用。第二个版本只是运行查询。

在性能方面没有区别,但首先存在风险,您可能会误触发并执行错误的查询。

我强烈建议您遵循第二种样式,因为您已经直接加载了查询,并且在视觉上很明显正在执行什么。在前者中,可能有两个稍微相似的变量使用两个完全不同的查询,例如 $sql3$sql8 乍一看可能看起来相同。

【讨论】:

  • 好的,但是如果我将 SELECT 放入变量中,就像第一个版本一样,我可以获得任何安全措施来抵御攻击?
  • 在这两种情况下,这 100% 取决于查询是否安全。唯一的区别是直接操作与间接操作。为了确保您的查询安全,请绝对确定您使用的是带有占位符值的准备好的语句。您在此处显示的查询没有动态数据,因此无法评论安全问题。如果您将用户数据引入实际查询中,您可能会遇到很大的问题。 query(...) 无法处理用户数据。 prepare()可以。
  • 正如我所说,我使用此查询从我的数据库中获取记录并在屏幕上打印(使用 foreach 循环),它甚至不在用户端。那么你认为我应该使用带有占位符值的准备好的语句吗?
  • 您可以在此处查看我的代码的完整示例:pastebin.com/ShvbLQKu
  • 由于查询本身没有动态组件,所以没有区别。
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多