Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Can';t通过引用$stmt传递常量变量->;bind_param()?_Php_Mysqli_Constants - Fatal编程技术网

Php Can';t通过引用$stmt传递常量变量->;bind_param()?

Php Can';t通过引用$stmt传递常量变量->;bind_param()?,php,mysqli,constants,Php,Mysqli,Constants,这是我的代码片段: 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-&

这是我的代码片段:

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\u USER\u 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()
不能将常量变量作为参数


谢谢

很简单,这是因为不能通过引用传递常量,这样做没有意义,因为它是不可变的。顺便说一下,常数不是变量;它就在名称中。

以下内容可以通过引用传递:

  • 变量,即foo($a)
  • 新语句,即foo(newfoobar())
  • 从函数返回的引用
不应通过引用传递其他表达式,因为结果未定义

另外,

mysqli_stmt_bind_param()要求参数通过引用传递,而call_user_func_array()可以接受可以表示引用或值的变量列表作为参数


Mysqli的bind_参数定义如下:

bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
解释
&
意味着变量是通过引用传递的,因为PHP中的常量(例如
默认值\u用户\u限制
)不能以这种方式引用,它们只能作为值传递,因为它们就是值

因此,如果您有一个强制按引用传递的函数,那么首先必须将常量的值存储到变量并传递变量(就像您所做的那样…)

现代解决方案-公正 如果您可以使用PDO接口,并且不需要通过引用传递值,
只需使用PDO“s+PDO”在常见情况下的使用方式与Mysqli几乎相同

public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
如果您仍然需要通过引用传递,PDO也有一个


我赞赏你使用参数化查询。在这方面,您比99%的SQL开发人员要好。然而,您可能在这里做得太过分了:将常量绑定为参数没有意义,因为它不是用户输入。它总是安全的,除非您有目的地定义常量来包含SQL注入(出于某种原因)。简而言之,只需将常量直接连接到查询字符串中。至于您的问题,“reason”bind_param()只能接受引用只是一个愚蠢的设计限制。没有真正的“理由”。尽管如此,我并不是想暗示没有理由绑定一个常数。如果是那样的话,我很抱歉。合理的理由可能包括:更好的可读性、更好的程序流、效率(向SQL server发送更少的字节)、程序员偏好。只是安全性不是绑定常量的原因。干杯。@Lakey谢谢你的评论。将常量绑定为参数没有意义,因为它不是用户输入。它总是安全的,除非您有目的地定义常量来包含SQL注入(出于某种原因)。简而言之,只要将常量直接连接到查询字符串中,这一行就是我的答案。不要忘记通过引用传递的第二个目的:避免移动大数据。。。它不需要编辑,在C++中很好地看到,const引用经常被用作函数参数……是的,但是这是PHP,它使用了一个“拷贝-写”机制,这意味着,只要不修改值,就可以有效地随时引用。您可以通过编写包含大变量的脚本,然后分配副本,并在修改这些副本之前和之后检查内存使用情况来了解这一点。我知道,这并没有改变我说过的任何内容:),只是您似乎不知道通过引用传递的第二个目的-此注释是为您而不是为OP:)
public bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )