Возможный дубликат:
Предупреждение о побочном эффекте сеанса PHP с глобальными переменными как источник данных
У меня проблема с скриптом входа, который я использую. Проблема заключается в том, что некоторые хостинг-провайдеры после входа в систему сеанс не регистрируется. и в журналах ошибок php я вижу эту ошибку
PHP Предупреждение: Неизвестно: ваш скрипт, возможно, полагается на побочный эффект сеанса, который существовал до PHP 4.2.3. Пожалуйста, имейте в виду, что расширение сеанса не рассматривает глобальные переменные как источник данных, если только register_globals не включен. Вы можете отключить эту функциональность и это предупреждение, установив session.bug_compat_42 или session.bug_compat_warn в выключенном состоянии, соответственно, в Unknown в строке 0
но в большинстве хостингов, таких как 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"); } ?>
Использование session_register
устарело, как указано в PHP: SESSION_REGISTER
Вы должны использовать:
//session_register("adminuser"); //deprecated $_SESSION["adminuser"] = $adminuser;
Попробуйте заменить <?
с <?php
– это может быть ваш хост-менеджер, отключенный так называемыми короткими тегами, поэтому эта часть никогда не выполняется. В основном хорошая привычка никогда не использовать короткие теги
РЕДАКТИРОВАТЬ
Вы можете отключить это предупреждение, добавив следующее:
ini_set('session.bug_compat_warn', 0); ini_set('session.bug_compat_42', 0);
или исправить свой код, чтобы не использовать переменную сценария имени и сеансового ключа, то есть это вызовет это предупреждение:
$_SESSION['foo'] = false; $foo = 0;
наследие от PHP4 …
Руководство по session_register
:
Эта функция была DEPRECATED с PHP 5.3.0 и удалена с PHP 5.4.0.
Просто используйте $_SESSION['adminuser']
поскольку вместо этого вы будете использовать любую другую переменную.
Проблема в том, что у вас есть переменная с тем же именем, что и обычная переменная.
$_SESSION['yourvar'] = null; $yourvar = 'something';
Предупреждение о побочном эффекте сеанса PHP с глобальными переменными как источник данных
А также:
session_register не рекомендуется использовать $_SESSION['yourvar']
. Ошибка регистрации сеанса функции вызывает ошибку.
Не ответ, а предупреждение, которое не вписывается в комментарий:
Вы делаете обработку пароля назад. Вы убегаете, ТОГДА md5-ing. Это неверно. Рассмотрим простой пароль:
o'brien
который ускользает от
o\'brien
а затем md5'd. Эта обратная косая черта станет ЧАСТЬю хэш-значения:
o'brien -> 255740509ca6c0e7d86c88fc4d8ddf9d o\'brien -> afd5c6601a6df7e48d0ce5584b10bf12
обратите внимание, что значения хэша совершенно разные. Это может обернуться и укусить вас, если вы сравните хешированные значения в другом месте и забудете этап побега.