我有一个函数,必须检查基本授权设置凭据,如果用户存在于文件。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文档中可以通过引用传递以下内容:
- 变量,即foo($a)
- 新建语句,即foo(New foobar())
- 函数返回的引用
不应该像结果那样通过引用传递其他表达式未定义的。例如,下面的例子通过引用传递无效。
array_shift
是唯一一个通过引用传递的数组参数。$AuthGroupFile
返回值没有任何参考。因此产生了错误。您应该首先将preg_grep("/$user:.*$/", $AuthUserFile);
生成的值存储到$pregGrap
变量中。之后使用array_sift()
进行引用。
最终代码如下:
if(!($authUserLine = array_shift(preg_grep("/$user:.*$/", $AuthUserFile)))) {}
如果你不传递一个变量,那么就没有任何引用可以指向。
谢谢!