PHP会话没有注册

时间:2012-11-22 15:53:54

标签: session php

  

可能重复:
  PHP session side-effect warning with global variables as a source of data

我使用的登录脚本存在问题。问题是一些托管服务提供商在登录后没有注册会话。并在PHP错误日志中,我可以看到此错误

  

PHP警告:未知:您的脚本可能依赖于PHP 4.2.3之前存在的会话副作用。请注意,除非启用register_globals,否则会话扩展不会将全局变量视为数据源。您可以通过将session.bug_compat_42或session.bug_compat_warn分别设置为off来禁用此功能和此警告,分别在第0行的Unknown中

但是在大​​多数托管服务器中,例如bluehost,hostmonster,它运行正常,没有任何错误。有人能指出我在这里做错了什么?先谢谢你。

代码:

<?
session_start();
ob_start();
?>

        <?php
        $err=isset($_GET['error'])?$_GET['error']:""; 
        if($err=='error'){?>
        <div class="errormsgbox">Wrong Username or Password. Please try again.</div>    
        <?php }

        if(!isset($_SESSION['adminuser'])){
        if($_SERVER["REQUEST_METHOD"] == "POST")
        {
        // username and password sent from Form
        $adminuser=mysql_real_escape_string($_POST['adminuser']); 
        $adminpassword=mysql_real_escape_string($_POST['adminpassword']); 
        $gpassword=md5($adminpassword); // Encrypted Password
        $sql="SELECT id FROM admin WHERE adminuser='$adminuser' and adminpassword='$gpassword'";
        $result=mysql_query($sql);
        $count=mysql_num_rows($result);

        // If result matched $username and $password, table row must be 1 row
        if($count==1)
        {

        session_register("adminuser");

        header("location:index.php");
        }
        else
        {
        header("location:login.php?error=error");

        }
        }
        ob_end_flush();

        ?>
    <form action="login.php" method="post">
    <div class="login_input">
    <label class="loginlbl"  for="adminuser">UserName :</label>
    <input type="text" name="adminuser"/>
    </div>
    <div class="login_input">
    <label class="loginlbl"  for="adminpassword">Password :</label>
    <input type="password" name="adminpassword"/>
    </div>
    <div class="login_submit">
    <input type="submit" id="submit" value=" Login to Admin Contol Panel"/>
    </div>
    </form>
    <?php }else{
    header("location:index.php");
    }
    ?>

5 个答案:

答案 0 :(得分:3)

尝试用<?替换<?php - 它可能是您的托管商禁用所谓的短标签,因此该部分永远不会被执行。从不使用短标签基本上是个好习惯

修改

您可以通过添加以下内容来禁用此警告:

ini_set('session.bug_compat_warn', 0);
ini_set('session.bug_compat_42', 0);

或修复您的代码以不使用相同名称的脚本变量和会话密钥,即这会触发此警告:

$_SESSION['foo'] = false;
$foo = 0;

PHP4时代的遗产...

答案 1 :(得分:3)

session_register

中不推荐使用//session_register("adminuser"); //deprecated $_SESSION["adminuser"] = $adminuser;

您应该使用:

{{1}}

答案 2 :(得分:3)

session_register上的手册:

  

此功能自PHP 5.3.0起已废弃,并已删除   PHP 5.4.0。

只需使用$_SESSION['adminuser'],就像使用任何其他变量一样。

答案 3 :(得分:1)

问题是你有一个与普通变量同名的变量。

$_SESSION['yourvar'] = null;
$yourvar = 'something';

PHP session side-effect warning with global variables as a source of data

不建议使用

session_register 而是使用$_SESSION['yourvar']。函数会话寄存器导致错误。

答案 4 :(得分:0)

不是答案,而是一条不符合评论的警告:

你正在向后进行密码处理。你正在逃避,然后是md5-ing。这是不正确的。考虑一个简单的密码:

o'brien

被转义为

o\'brien

然后md5'd。反斜杠将成为散列值的一部分:

o'brien -> 255740509ca6c0e7d86c88fc4d8ddf9d
o\'brien -> afd5c6601a6df7e48d0ce5584b10bf12

请注意,哈希值完全不同。如果您在其他地方比较散列值并忘记逃逸阶段,这可能会转过来并咬你。