致命错误:无法中断/继续1级



我有一个函数,必须检查基本授权设置凭据,如果用户存在于文件。htgroup和检查他们的密码文件。htpasswd和返回0,如果没有匹配1,如果匹配

$password = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : '';
function authenticate($user, $password) {
    $AuthUserFile = file(".htpasswd");
    $AuthGroupFile = file(".htgroup");
    $group = "Members";
        if(!preg_grep("/$group: $user$/", $AuthGroupFile)) {
            if(!($authUserLine = array_shift(preg_grep("/$user:.*$/", $AuthUserFile)))) {
                preg_match("/$user:((..).*)$/", $authUserLine, $matches);
                $authPW = $matches[1];
                $salt = $matches[2];
                $submittedPW = crypt($password, $salt);
                if($submittedPW != $authPW) { return 0; } else { return 1; };
            } else { return 0; };
        }else { return 0; };
}

我在if(!($authUserLine = array_shift(preg_grep("/$user:.*$/", $AuthUserFile)))) {上得到错误

Strict Standards: Only variables should be passed by reference in /var/www/auth.php on line 54

怎么了?

array_shift需要将第一个参数作为引用传递,因为它需要更新您传递的数组并删除第一个元素。

为了使它工作,您需要将preg_grep的结果存储在一个变量中:
$matches = preg_grep("/$user:.*$/", $AuthUserFile);
if(!($authUserLine = array_shift($matches))) {
  ...
}

从PHP.net文档中可以通过引用传递以下内容:

  1. 变量,即foo($a)
  2. 新建语句,即foo(New foobar())
  3. 函数返回的引用

不应该像结果那样通过引用传递其他表达式未定义的。例如,下面的例子通过引用传递无效。

array_shift是唯一一个通过引用传递的数组参数。$AuthGroupFile返回值没有任何参考。因此产生了错误。您应该首先将preg_grep("/$user:.*$/", $AuthUserFile);生成的值存储到$pregGrap变量中。之后使用array_sift()进行引用。

最终代码如下:

if(!($authUserLine = array_shift(preg_grep("/$user:.*$/", $AuthUserFile)))) {}

如果你不传递一个变量,那么就没有任何引用可以指向。

谢谢!

最新更新