【发布时间】:2011-05-25 19:53:02
【问题描述】:
这是我的代码 sn-p:
private function add_user_limit()
{
global $mysqli;
$stmt = $mysqli->prepare("INSERT INTO `user_limits` (user_ip, downloads_left) VALUES (?, ?)");
$stmt->bind_param("si", $this->user_ip, DEFAULT_USER_LIMIT);
$stmt->execute();
if($stmt->affected_rows == 0)
throw new Exception("Couldn't add new user to the user_limits table");
$stmt->close();
$this->downloads_left = DEFAULT_USER_LIMIT;
}
DEFAULT_USER_LIMIT 被定义为8,但是使用上面的代码我得到了这个错误:
Fatal error: Cannot pass parameter 3 by reference in C:\xampp\htdocs\classes\limits.class.php on line 38
但如果我这样做:
private function add_user_limit()
{
global $mysqli;
$stmt = $mysqli->prepare("INSERT INTO `user_limits` (user_ip, downloads_left) VALUES (?, ?)");
$user_limit = DEFAULT_USER_LIMIT; // For some reason we can't pass a constant to bind_param
$stmt->bind_param("si", $this->user_ip, $user_limit);
$stmt->execute();
if($stmt->affected_rows == 0)
throw new Exception("Couldn't add new user to the user_limits table");
$stmt->close();
$this->downloads_left = DEFAULT_USER_LIMIT;
}
它有效。我只是想知道为什么会发生这种情况,因为这对我来说真的没有意义。我看不出bind_param() 不能将常量变量作为参数的任何原因。
谢谢!
【问题讨论】:
-
我为您使用参数化查询而鼓掌。在这方面,您比 99% 的 SQL 开发人员要好。但是,您可能在这里有点过分了:将常量绑定为参数是没有意义的,因为它不是用户输入。它总是安全的,除非您有目的地定义常量以包含 SQL 注入(出于某种原因)。简而言之,只需将您的常量直接连接到查询字符串中。至于您的问题,“原因” bind_param() 只能引用只是一个愚蠢的设计限制。没有真正的“理由”。就是这样
-
尽管如此,我并不是在暗示从不绑定一个常量的理由。对不起,如果它看起来那样。正当理由可能包括:更好的可读性、更好的程序流程、效率(向 SQL 服务器发送更少的字节)、程序员的偏好。只是安全性不是绑定常量的原因。干杯。
-
@Lakey 感谢您的评论。 将常量绑定为参数是没有意义的,因为它不是用户输入。它总是安全的,除非您有目的地定义常量以包含 SQL 注入(出于某种原因)。简而言之,只需将您的常量直接连接到查询字符串中这行就是我的答案。