【问题标题】:PHP setcookie is never settingPHP setcookie 从不设置
【发布时间】:2013-11-23 00:15:35
【问题描述】:

我正在尝试制作 cookie。来不及了。

此代码有效,但在最近的系统中无效。 login_check.html 如下。

<?
include "../_cfg/siteCfg.php"; //Site common values
include "$SITE_PATH/_class/dbms.php"; //mysql_class
include "$SITE_PATH/_class/Function.php";

$my_func = new PublicFunction();
$db = new mydb();   //DB Access

if ( $HTTP_POST_VARS[id] && $HTTP_POST_VARS[passwd] ) {
    $sql = "select uid, passwd, m_id, name, level from member_list where m_id = '$HTTP_POST_VARS[id]'";
    $result = $db->select($sql);

    if ( !$result ) {
        $my_func->virtual_function( "login_error ('ID_ERR')" );
    }
    else if ( $HTTP_POST_VARS[passwd] != $result[0][1] ) {
        $my_func->virtual_function( "login_error ('PW_ERR')" );
    }
    else if ( $result && ( $HTTP_POST_VARS[passwd] == $result[0][1] )) {
        $m_id = $result[0][m_id];
        $uid = $result[0][uid];
        $name = $result[0][name];
        $level = $result[0][level];

        setcookie("c_m_id",$m_id,0,'/');
        setcookie("c_uid",$uid,0,'/');
        setcookie("c_name",$name,0,'/');
        setcookie("c_level",$level,0,'/');

        $my_func->virtual_function("alert($_COOKIE[c_level])");  // This is for a log

    $my_func->virtual_function( "loginOk()" );
    }
} else {
    $my_func->virtual_function("alert('Bad Access!!!')");
}

?>

当我提醒检查 COOKIE 值时,它为空。

我使用了 var_dump(isset($_COOKIE[c_uid]));,ant 然后它返回 bool(false)

另外我更改了标题 @header('P3P: CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"'); to header('P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"'); .

这也不起作用。

此代码由以下调用。上面的代码是login.html

<?
    require_once "$DOCUMENT_ROOT/_cfg/siteCfg.php"; //site value
    require_once "$SITE_PATH/_class/htmlHead.php";

    $title = "Login"; //title value
    $htmlTPL = new htmlTPL($title); //HEAD Instance creation
?>
<title></title>
<link href="<?=$SITE_HOME?>/_styles/style.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="<?=$SITE_HOME?>/_js/common.js"></script>
<script>
//<!--
    function login_check(){
        var fm = document.login_form;

        fm.target = "vr_url";
        fm.action = "./login_check.html";
        fm.submit();
    }
    function login_error ( num ) {
        fm = document.login_form;
        if ( num == "ID_ERR" ) {
            alert ( "Not registered user.");
            fm.passwd.value = "";
            fm.id.focus();
            fm.id.select();
        } else if ( num == "PW_ERR" ) {
            alert ( "Wrond Pasword." );
            fm.passwd.focus();
            fm.passwd.select();
        }
    }

    function loginOk(){
        opener.location.reload(true);
        window.close();
    }
//-->
</script>

这是 siteCfg.php 的一部分

<?
//@header("Cache-Control: no-cache,must-revalidate");
//@header ("Pragma: no-cache");
@header('P3P: CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"');

//header('P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"'); 
//error_reporting(E_ALL); 

$SITE_PATH  = $DOCUMENT_ROOT;
$IMG_PATH = $SITE_PATH."/image";
$MANAGER_PATH = $SITE_PATH."/manager";


$SITE_HOME  = 'http://www.mysite.com';
$MANAGER_HOME = $SITE_HOME."/manager";
$IMAGE_HOME = $SITE_HOME."/image";
$ADMIN_HOME = $SITE_HOME."/manager_admin";

//Login Return URL
$PREURL = urlencode($SITE_HOME.$_SERVER["REQUEST_URI"]);

//Values Setting

$_name = $_COOKIE[c_name];
$_mid = $_COOKIE[c_m_id];
$_uid = $_COOKIE[c_uid];
$_mlevel = $_COOKIE[c_level];

//var_dump(isset($_name));      

//FTP Setting

PHP 版本 5.2.17 。有什么我可以检查来解决这个问题的。请告诉我。 我在 IE 11、Chrome 30.0.1599.101 m、Firefox、Safari 上进行了测试。根本不工作

【问题讨论】:

  • 你确定else if ( $result &amp;&amp; ( $HTTP_POST_VARS[passwd] == $result[0][1] )) { 循环被调用了吗?
  • 在调用setcookie 之前,您是否检查过没有发送任何内容?如果有任何内容写入输出,则将发送 HTTP 标头,设置 cookie 为时已晚。很多时候,您会发现一个文件已被编辑,并且编辑器在文件的开头放置了一个 Unicode 字节顺序标记。见stackoverflow.com/questions/2045550/…
  • 我检查了是否输入 else if ( $result && ( $HTTP_POST_VARS[passwd] == $result[0][1] )) 。通过添加警报。
  • 显示此页面时,我找不到类似 **Warning: Cannot modify header information - headers already sent by ~ **, not using obstart() 之类的消息。我还检查了 echo、var_dump 或其他打印方法。我没找到。
  • 我也被使用过 error_reporting(E_ALL); 我检查了类似 Notice: Undefined index: c_name in ~ 之类的警告

标签: php cookies


【解决方案1】:

脚本的开头有一个空格。 如果您之前有 HTTP 正文,则不会设置 Cookie。

见:

 <?
^-----
include "../_cfg/siteCfg.php"; //Site common values
incl....

还有你的编码风格can be much improved。例如,不使用短开放标签并将单引号括起来字符串索引:$varRS['id']

这行不通:

virtual_function("alert($_COOKIE[c_level])");

您需要正确连接变量并在字符串周围使用引号:

virtual_function("alert(" . $_COOKIE['c_level'] . ")");

如果您没有看到任何错误消息,请确保您已打开错误报告。 http://blog.flowl.info/2013/enable-display-php-errors/

【讨论】:

  • 这是我在复制和粘贴时的错误。实际上,您提到的空间在实际代码中并不存在。
  • 我按照您的建议重新检查了它。警报什么也没显示。该代码在值为整数时有效。我在其他代码中对其进行了测试。实际上我有一个问题,为什么它不适用于字符串。你的方式让我的问题很满意。
  • $variable[test]$variable['test'] 的区别在于第一个测试是一个常量,第二个测试是一个字符串。见php.net/manual/en/language.oop5.constants.php
  • 只要总是转义变量并将字符串包装在(单)引号中,那么您就安全了。例如使用这个:include($SITE_PATH . "/_class/Function.php");
  • 我使用 Firebug 再次检查了它。我发现了五个警告。像警告:无法修改标头信息 - 标头已经发送(输出开始于/home1/hosting_users/www/member/login_check.html:1)但是这种形式如上,login_check.html如果完整的php代码和登录.html 通过函数 login_check() 调用 login_check.html。我找不到任何空白或其他东西。我在哪里可以检查?
【解决方案2】:

您可能会尝试将 $HTTP_POST_VARS 转换为 $_POST(因为 $HTTP_POST_VARS 已被弃用,我什至不确定 PHP > 5 是否仍然支持它,如果它停止在新系统上运行,这可能是您的问题) .

【讨论】:

  • 如上所述,我检查了进入第三个 else if 循环 - setcookie 部分。因此,如果没有其他原因,使用 $HTTP_POST_VARS 不是主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2013-10-09
  • 2018-06-05
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多