说我有这个问题:
$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()');
答案 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())
。