我有这样的查询:
$result = $db
-> prepare("SELECT value FROM mytable WHERE id = ?")
-> execute(array($id))
-> fetch(PDO::FETCH_ASSOC);
我想使用$result['value']
作为另一个查询(UPDATE
语句)的参数。我应该为UPDATE
声明使用准备好的声明吗?或者因为我从数据库中获取它,那么不需要将它作为预处理语句传递?
答案 0 :(得分:0)
是。使用带有绑定占位符的预准备语句。
仅仅因为从数据库返回值并不意味着该值可以安全地包含在SQL文本中。
您可能知道value
中的mytable
列是INTEGER类型的域知识,因此它是安全的。但是在更一般的情况下,以及不了解mytable
的定义以及value
可能包含的内容的读者。您的代码的读者会认为value
不是“安全的”。就我们所知,我们可以得到这样的东西:
Robert'); DROP TABLE students; --
每当我们看到一个变量连接到SQL文本中时,我们就会假设变量可以包含除值之外的其他内容,并且它可能包含实际的SQL。 (或者,如果我们确实看到一个变量连接到SQL语句的文本中,我们就会期望它在被连接时正确地进行转义。)
因此,首选模式将使用带有绑定占位符的预准备语句。这使得读者明确value
确实是一个值,并且不打算将其解释为SQL文本。