php cookie无法正常工作

时间:2010-04-24 06:58:12

标签: php cookies

我正在尝试使用带身份验证的Cookie。

此页面一旦进入用户即可使用并传递

   <?
    if ((!$_POST[username]) || (!$_POST[password])) {
        header("Location: show_login.html");
        exit;
    }
    $db_name = "testDB";
    $table_name = "auth_users";
    $connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error());
    $db = @mysql_select_db($db_name, $connection) or die(mysql_error());
    $sql = "SELECT * FROM $table_name WHERE username ='$_POST[username]' AND password = password('$_POST[password]')";
    $result = @mysql_query($sql, $connection) or die(mysql_error());
    $num = mysql_num_rows($result);
        if ($num != 0) {
            $cookie_name = "auth";
            $cookie_value = "ok";
            $cookie_expire = "0";
            $cookie_domain = "domain.com.au";
            setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0);
            $display_block = "
            <p><strong>Secret Menu:</strong></p>
            <ul>
                <li><a href=\"secretA.php\">secret page A</a>
                <li><a href=\"secretB.php\">secret page B</a>
            </ul>"; 
        } else {
            header("Location: show_login.html");
            exit;
        }
    ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Secret Area</title>
    </head>

    <body>
    <? echo "$display_block"; ?>


    </body>
    </html>

点击secretA.php或secretB.php时我被重定向再次登录,它应该可以工作。这是代码。 secretB.php

<?php

if ($_COOKIE[auth] == "ok") {
    $msg = "<p>Welcome to secret page B, authorised user! </P>";
} else {
    header( "Location: /show_login.html");
    exit;
}
?>
<HTML>
<HEAD>
<title>Secret Page B:</title>
</HEAD>
<BODY>

<? echo "$msg"; ?>

</BODY>
</HTML>

5 个答案:

答案 0 :(得分:2)

这可能让你搞砸了......

setcookie($cookie_name, $cookis_value , $cookie_expire, "/", $cookie_domain, 0);

答案 1 :(得分:1)

这就是坏代码的好例子 谢谢你发布它。很多人都可以阅读并从中学习。

让我解释一下 PHP可以帮助您找到一些模糊的错误。不是每一个,而是一些 例如,如果您错误输入变量名称,PHP将抛出错误...当然,如果您让PHP说出来 要使每个错误都可见,必须最大化错误报告级别。 为此,每个脚本都必须包含以下行:

error_reporting(E_ALL);

添加它之后,如果它是正确编写的代码,您将只看到一个指向错误输入变量的错误消息。 但是,
相反,你会看到一个错误的瀑布。 因为PHP无法区分故意错误和偶然错误。

因此。 代码中一定不是故意的错误,让你偶尔看到它们 这是值得记住的重要教训。

这些错误是什么?

  1. php中的字符串用引号分隔。
    因此,如果您有一个字符串username,则必须将其写为"username" 并且$ _POST [用户名]变为$ _POST [“用户名”] (相反,变量不需要引号,因此,echo "$msg";必须为echo $msg;
  2. 必须设置或检查所有变量是否存在。所以,
    if ((!$_POST[username]) || (!$_POST[password])) {
    必须成为
    if (!empty($_POST["username"]) OR !empty($_POST["password"])) {
  3. 使用这样的代码,您只会看到偶然的错误并能够立即纠正它。

答案 2 :(得分:1)

有时它是最简单的解决方案。这样的事情我也经历过。我在localhost(wampserver)上运行。我发现我的防火墙阻止了来自localhost的所有cookie请求。我当时使用ZoneAlarm,但我认为其他防火墙可能会产生相同的效果。尝试禁用防火墙以查看它是否仍无效。

答案 3 :(得分:1)

try this :
   <?php
    if (isset($_POST['username']) and isset($_POST['password'])) 
    {

    $db_name = "testDB";
    $table_name = "auth_users";
    $connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error());
    $db = @mysql_select_db($db_name, $connection) or die(mysql_error());
    $sql = "SELECT * FROM $table_name WHERE username ='".$_POST['username']."' AND password = password('".$_POST['password']."')";
    $result = @mysql_query($sql, $connection) or die(mysql_error());
    $num = mysql_num_rows($result);
        if ($num != 0) {
            $cookie_name = "auth";
            $cookie_value = "ok";
            $cookie_expire = "0";
            $cookie_domain = "domain.com.au";
            setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0);
            $display_block = "
            <p><strong>Secret Menu:</strong></p>
            <ul>
                <li><a href=\"secretA.php\">secret page A</a>
                <li><a href=\"secretB.php\">secret page B</a>
            </ul>"; 
        } else {
            header("Location: show_login.html");
            exit;
        };


    }
    else
    {
    header("Location: show_login.html");
    exit;
    };

答案 4 :(得分:0)

尝试使用php设置cookie:

setcookie(<name>,<value>, time()+3600*24);

有时,在localhost中,使用以下内容未设置Cookie:$_COOKIE[<name>] = <value>