2012-10-29 26 views
0

我有一个文件内的下列PHP脚本的login.php命名显示一个div如果一个PHP if语句是真的

<?php 
$ref = $_SERVER['HTTP_REFERER']; 
if ($ref == 'http://example.com/dir/invalid.php' || $ref == 'http://www.example.com /dir/invalid.php') { 
echo ' 
    <div id="invalid"> 
     TESTTESTTESTTESTTESTTESTTESTTEST 
    </div> 
    '; 
} 
?> 

我特意去了invalid.php页(其中使用重定向报头()到login.php),这个div不显示。这与推荐人有没有关系,不是真的是invalid.php或者脚本有问题吗?

感谢

+2

你的脚本看起来不错试试echo $ _SERVER ['HTTP_REFERER']看看它的值是多少 – bumperbox

+0

你应该尝试一些基本的调试,为什么不输出'$ ref'的值看看它是什么? – meagar

+0

那么,如果你使用'header()',你永远不会看到任何东西,因为它只是在重定向之前输出div。但我不知道我明白这个问题100% –

回答

1

我不认为HTTP_REFERER是你认为它是。也就是说,它是用户从其中链接到当前页面的页面。然而,这是非常不可靠的,因为我们依靠用户的浏览器来正确报告这个值。

我会建议我认为你需要的选项,除了我能想到的唯一一个可能没有意义...(检查url是否与当前脚本不匹配)。所以我不明白你在做什么。


正如所承诺的几种方法可以做到你想要达到的目标:

首先,我不喜欢这一切的解决方案,真正认为这是丑陋,但它是一个最接近于你在哪里试图去做。

invalid.php

require 'login.php'; // we include the file instead of referring to it 

的login.php

if ($_SERVER['SCRIPT_NAME'] == 'invalid.php') 
{ 
    // do whatever 
} 

之间你做了什么和我所做的用户将是这里的地址栏将显示的主要区别在于你”重新在invalid.php而不是其他地方。这也意味着清爽不会使信息消失。

在我看来,一个更好的解决方案是:

在脚本中记录了一个用户(检查数据库和一切):

if (!valid_login()) // pseudo-code, obviously 
{ 
    $_SESSION['invalid_login'] = true; 
    header('Location: login.php'); 
    // previously, we had something like this instead of the two lines above: 
    // header('Location: invalid.php'); 
} 

中的login.php

if (isset($_SESSION['invalid_login']) && $_SESSION['invalid_login']) 
{ 
    $_SESSION['invalid_login'] = false; 

    // do whatever 
} 

当然,这应该通过适当的会话设施完成,例如在这两个文件中启动会话。您可以使用会话变量来包含文件并使用普通变量或通过头部请求发送GET变量,但这两种解决方案都存在一个共同的问题:刷新不会使消息消失。但是,如果您要将代码从上面两个文件的顶层文件移动到login.php(如果它不在那里,我不知道实际上是什么文件...),您可以再次使用普通变量而不是会话变量,并有一个解决方案,在这个解决方案中,刷新使它消失。在这种情况下,您可能会争辩说,您的商业逻辑和演示文件混乱,但有解决方案(如将其保存在单独的文件中,并将其包含到login.php中,将html移动到另一个文件并包含该文件到login.php或这两者

+0

我试图让错误(如“错误的密码/用户名”)与登录表单在同一页面上出现,而不是在单独的页面上。我认为这会做到这一点,但不幸的是没有。我知道我可以用javascript来做到这一点,这就是我打算做的,如果没有办法使用PHP – user1710563

+0

这可能是好的,你只是以错误的方式去做(事实上,我的原创答案是基于我没有仔细阅读的事情,我会稍微修改一下)。事实上,在使用标题重定向之后,您所在页面的痕迹将会消失。我还会在回答中添加一些方法来做到这一点,因为我在这里没有足够的空间来这样做。 – Jasper