在 PDO 中准备查询时是否应该绑定内部值?

Zer*_*x18 2 php mysql pdo prepared-statement

有以下代码

<?php
$age = get_age(); // a generated or random unsigned integer
$db->prepare("SELECT * FROM Customers WHERE name = :name AND age = :age");
$db->bindValue('name', $_POST['name']);
$db->bindValue('age',  $age, PDO::PARAM_INT);
$db->execute();
Run Code Online (Sandbox Code Playgroud)

即使它不是来自用户(即外部),我是否应该绑定“年龄”?

如果我有一个固定的年龄或者它是由我以某种方式产生的,我应该这样做吗?

<?php
$age = get_age(); // <- Of course I made sure this is an unsigned integer
$db->prepare("SELECT * FROM Customers WHERE name = :name AND age = $age");
$db->bindValue('name', $_POST['name']);
$db->execute();
Run Code Online (Sandbox Code Playgroud)

每个人都有优点和缺点还是只是个人喜好?

You*_*nse 5

在 PDO 中准备查询时是否应该绑定“内部”值?

是的。

在其生命周期内,您应该理解愚蠢的人工示例和成熟的现实生活代码之间的区别。

如果您想学习如何编写成熟的代码,请考虑以下几点:

  • 有一种东西叫做一致性。您的第一个示例看起来一致,而第二个则不是。毕竟,这只是一个简单的规则——每个变量都应该通过占位符进入查询。为什么要阻碍你的发展并让你自己思考异常?
  • 每个应用程序都趋于增长和演变。$age 的来源将来可能会更改。
  • 并非每个代码都只是一个带有 SQL 查询的意大利面条碗。一些程序员能够掌握关注点分离的概念,使他们的应用程序模块化和灵活。在这样的应用程序中,在执行查询时,数据库层完全不知道数据来自哪里,它是否“安全”,也根本不知道“安全”是什么意思。
  • 所有这些绑定麻烦都与“外部”变量无关。但只是为了查询完整性。任何“内部”值都可能有不正确的格式直接放置在查询中。想象一下你的函数失败并返回一个空字符串。在第二种情况下会导致 SQL 错误。您必须明白,您不是为 Bobby Tables 而是为 Sarah O'Hara绑定您的价值观。