我准备在nads中打击PHP。我有一个非常简单的操作,基本上是以自己的想法行事。
$this->user = $this->processToken($token);
if(!isset($this->user))
{
$this->sendError(401);
}
w /一个有效的$令牌,它发送401,它不应该。但是这个:
$this->user = $this->processToken($token);
print_r($this->user);
if(!isset($this->user))
{
$this->sendError(401);
}
毫无障碍地工作,除了我现在在屏幕上打印出一个阵列的事实。 $user
是一个VO,将print_r(...)
替换为echo $this->user->name
,产生的结果相同(当然没有数组)。
修改 我应该补充一下,此后的操作返回一个递增的int。即使发送错误仍然增加(只要令牌是正确的)。所以它看起来像标题覆盖了最终结果。我原以为if会阻止标题写入吗?
更新
让事情变得怪异。如果我echo '';
在同一个地方,它不会覆盖任何内容,并且错误仍会显示....再次,即使有良好的令牌。
答案 0 :(得分:1)
如果您的sendError
函数正在使用header
发送401
响应,那就是print_r正在更改结果的原因。
除非您启用了输出缓冲,否则在调用header
之前发送的任何内容都将导致无法正确发送标头。这是因为标题和一些内容已经发送。
看起来无论如何你的标题都会被发送。在不查看其余代码的情况下,我无法确定,但print_r
,echo
或标头之前的任何其他类型的输出都会导致无法发送。
答案 1 :(得分:0)
print_r()
取消了发送到浏览器的标头401 Unauthorized
- 现在导致Headers already sent
错误。