在准备好的语句中,您是否必须将所有参数指定为?,包括mysql函数?

时间:2018-06-18 14:24:06

标签: php mysqli prepared-statement

说我有这个问题:

$query = "INSERT INTO table(one, two, date) VALUES (1, 2,  CURDATE())";

当为预备语句重写时,它会是这样的吗?:

$query = "INSERT INTO table(one, two, date) VALUES (?, ?,  CURDATE())";
OR
$query = "INSERT INTO table(one, two, date) VALUES (?, ?, ?)";

在bind_param上,省略MySQL函数或包含它?:

...
$stmt->bind_param('ii', 1, 2);
OR
$stmt->bind_param('iis', 1, 2, 'CURDATE()');

1 个答案:

答案 0 :(得分:2)

Iff你会绑定函数调用,这意味着任何用户输入都可以被解释为一个函数。 E.g:

$stmt->bind_param('iis', 1, 2, 'CURDATE()');
$date = 'CURDATE()';
$stmt->bind_param('iis', 1, 2, $date);
$stmt->bind_param('iis', 1, 2, $someUserValue);

这本身就是不安全的,与简单的不安全字符串插值相同。

不,任何绑定参数都是某种原始值,例如字符串或整数等。从不包含任何结构部件或代码,包括函数调用。请注意,bind_param('s', 'CURDATE()')相当于VALUES(..., 'CURDATE()'),而不是VALUES(..., CURDATE())