将 mysql 的 INTERVAL 与准备好的语句一起使用

Using mysql's INTERVAL with prepared statement

我准备我的数据库请求以防止 SQL 扩展名为 Mysqlnd 的注入。 像这样的请求在我的网站上有效:

SELECT a, b FROM table where a = ?;

下一个请求在我的网站上不起作用:

SELECT a, b FROM table where b > DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ? ?);

Error log : PHP Fatal error: Call to a member function execute() on a non-object in ..." This is because the syntax of the request is wrong.

当我在我的数据库 IDE 中尝试时,双问号计为一个参数而不是 2 个参数。

我该如何解决这个问题?

使用占位符,您只能绑定数据文字,换句话说 - 字符串和数字。

INTERVAL 接受两个参数,expressionunit

虽然expression部分是一个数字并且可以绑定,但是unit部分是一个关键字因此不能绑定。所以你只能把它列入白名单。这是我写的 white-listing function 可以帮助解决这个问题。

$unit = white_list($_GET['unit'], ["DAY","MINUTE","SECOND"], "Invalid time unit name");
$sql = "SELECT a, b FROM table where b > DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ? $unit)";

虽然不是很整洁,但至少简洁安全。