1

可能重复:
使用全局变量作为数据源的 PHP 会话副作用警告

我使用的登录脚本有问题。问题是一些托管服务提供商在登录后会话未注册。在 php 错误日志中我可以看到这个错误

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

但是在大多数托管服务中,例如 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");
    }
    ?>
4

5 回答 5

3

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

编辑

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

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

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

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

PHP4 时代的遗产...

于 2012-11-22T15:55:22.567 回答
3

如PHP:SESSION_REGISTERsession_register中所述,不推荐使用

你应该使用:

//session_register("adminuser"); //deprecated
$_SESSION["adminuser"] = $adminuser;
于 2012-11-22T15:59:47.510 回答
3

手册session_register

自 PHP 5.3.0 起,该函数已被弃用,自 PHP 5.4.0 起已移除。

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

于 2012-11-22T16:00:04.880 回答
1

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

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

使用全局变量作为数据源的 PHP 会话副作用警告

和:

session_register已被弃用$_SESSION['yourvar']。功能会话寄存器导致错误。

于 2012-11-22T16:01:38.780 回答
0

不是答案,而是不适合评论的警告:

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

o'brien

逃到

o\'brien

然后md5'd。该反斜杠将成为哈希值的一部分:

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

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

于 2012-11-22T16:00:16.747 回答