使用预准备语句(查询)保存从客户端接收的数据。例如:
if ($stmt = $mysqli->prepare("INSERT INTO table_1 VALUES (?, ?, ?);"))
{
$stmt->bind_param(/* data */);
$stmt->execute();
// ...
}
如果稍后我想使用客户端的数据,我是否必须再次使用准备好的语句?是否有使用经典查询的风险?例如:
if ($stmt = $mysqli->prepare("SELECT * FROM table_2 WHERE something = ?;")
{
$stmt->bind_param("s", /* Selected value from the `table_1` */ );
$stmt->execute();
// ...
}
答案 0 :(得分:2)
您应始终使用参数化查询,因为它们可确保在数据库级别正确转义数据。这是你可以自己处理的事情,但这样做很容易出错。
请注意,必须正确参数化查询。仅使用prepare
并不一定足够。
考虑一下您在另一个表中存储的列中是否有撇号。如果没有正确转义,您将收到错误。
答案 1 :(得分:1)
是的,如果您的查询可以包含任何用户输入(比如从用户搜索词中形成指定WHERE子句),则应使用预准备语句/参数化查询。
允许用户在查询中输入的最大危险不是持久化恶意数据,而是SQL injection。这可以在任何类型的查询上完成,因此,在运行包括用户输入的查询的地方,您应该始终使用参数化预处理语句(或根据您的RDBMS规则手动转义所有用户输入)。