在PDO中准备查询时,我应该绑定内部值吗?

时间:2016-06-17 02:35:22

标签: 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();

我是否应该绑定'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();

每个人都有利弊吗,还是只是个人偏好?

3 个答案:

答案 0 :(得分:4)

  

我应该绑定&#34;内部&#34;在PDO中准备查询时的值?

你应该理解一个愚蠢的人为例子和一个成熟的现实生活代码在其生命周期中的区别。

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

  • 有一种叫做一致性的东西。你的第一个例子看起来是一致的,而第二个例子看不到。毕竟,它只是一个简单的规则 - 每个变量都应该通过占位符进行查询。为什么会阻碍你的发展并且在思考异常时会困惑?
  • 每个应用程序都会增长和发展。 $ age的来源将来可能会改变。
  • 并非每个代码都只是一个现场运行SQL查询的意大利面条。一些程序员能够掌握分离关注概念,使他们的应用程序模块化和灵活。在这样的应用程序中,在执行查询时,数据库层完全不知道数据来自何处,是否安全&#34;安全&#34;或不是,它是什么&#34;安全&#34;意思是。
  • 所有这些有约束力的麻烦不是关于&#34;外部&#34;变量即可。但只是为了查询完整性。无论什么&#34;内部&#34; value可能只是将不正确的格式直接放在查询中。想象一下你的函数失败并返回一个空字符串。在第二种情况下,它将导致SQL错误。 您必须了解自己正在约束自己的价值观not for Bobby Tables but for Sarah O'Hara

答案 1 :(得分:1)

是的,由于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);

答案 2 :(得分:0)

在这种情况下,这只是个人偏好。我认为当这是一个大查询时,这对理解查询更好。但是,如果有一天有人更改了函数get_age()以便用户检索数据,那么这可能很危险。