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

Should I bind internal values when preparing queries in PDO?

有如下代码

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

我是否应该绑定 'age' 即使它不是来自用户(即外部)?

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

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

各有优缺点还是只是个人喜好?

是的,由于 sql 语句中的使用参数,您需要在上下文中进行绑定(参见:http://php.net/manual/fr/pdostatement.bindvalue.php)。

或者,您可以这样做:

<?php
$age = get_age(); // <- Of course I made sure this is an unsigned integer
$sth= $db->prepare("SELECT * FROM Customers WHERE name = ? AND age = ?");
$values = array("john", $age);
$sth->execute($values);

在这种情况下,这只是个人喜好。而且我认为当这是一个大查询时,这更有助于理解查询。但是,如果有一天有人更改函数 get_age() 以按用户检索数据,这可能很危险。

Should I bind "internal" values when preparing queries in PDO?

是的。

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

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

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