可能重复:
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");
}
?>
答案 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)
答案 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
请注意,哈希值完全不同。如果您在其他地方比较散列值并忘记逃逸阶段,这可能会转过来并咬你。