Вопрос по старту сессии

igortik

Новичок
Вопрос по старту сессии

PHP: 5.2

Начал разбирать пример из фака http://phpfaq.ru/sessions#main

Делаю форму авторизации.


Пример не работает у меня, т.к. сессия не стартуется (session_star) при выполнении условия ввода верных данных (логин, пароль).

Я полагаю, что связано это с расположением session_start, который вроде как должен быть заявлен раньше всех переменных и т.п. в скрипте.

Так вот мне не ясно, как же тогда НЕ ДЛЯ всех стартовать сессию.

P.S. прошу не пинать Ж-)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Включи вывод ошибок.
 

igortik

Новичок
вот кусок кода:

PHP:
$query = "SELECT * FROM `users` WHERE `email`='$email' AND `act` = '1'";
$result = mysql_query($query);
$num_users = mysql_num_rows($result);
	if($num_users == '1') 
	{
	$check_pass = md5($password);
	$query = "SELECT * FROM `users` WHERE `email`='$email'";
	$result = mysql_query($query);
	$row = mysql_fetch_array($result);
	$pass = $row["pass_hash"];
		if($check_pass == $pass)
			{
			session_start();
			$_SESSION['valid_user'] = '1'; 
    		        $_SESSION['user_id'] = $row['id'];
    		        $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
			$_SESSION['sess_id'] = session_id();
			
			mysql_free_result($result);
			Header("Location: ".$_SERVER['PHP_SELF']);
			exit;
			}
			else
			{
			mysql_free_result($result);
			$errors = 'Пароль введен неверно!';
			}
	}
никаких ошибок, помимо неопределенных _SESSION не возникает

P.S.
ini_set('display_errors',1);
error_reporting(E_ALL);

Если же я стартую сессию с самого начала, то все отменно работает. Скрипт выполняет все необходимые мне проверки исходя из данных в $_SESSION

-~{}~ 19.05.08 03:27:

попробовал сделать такой редирект:
PHP:
Header("Location: ".$_SERVER['PHP_SELF']."?PHPSESSID=".session_id());
чтобы увидеть устанавливается ли идентификатор.
Идентификатор присваивается.

Но тогда почему массив $_SESSION не наполняется значениями................
 

Андрейка

Senior pomidor developer
igortik
а де в коде можно увидеть, что сессия не стартуется или массив $_SESSION не наполняется значениями ??
 

SiMM

Новичок
> никаких ошибок, помимо неопределенных _SESSION не возникает
Ни одного сообщения об ошибке в Вашем посте - не вижу. Даже про якобы неопределённый _SESSION
 

igortik

Новичок
Простите, вот полный код для наглядности:
PHP:
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);

include("inc/cnf.inc");
$errors = '';
if(isset($_POST['dologin']))
{
$email = mysql_real_escape_string($_POST['email']);
$password = mysql_real_escape_string($_POST['password']);
if(strlen($email) > 1 && strlen($password) > 1)
{
//Проверяем существует ли пользователь с таким email
$query = "SELECT * FROM `users` WHERE `email`='$email' AND `act` = '1'";
$result = mysql_query($query);
$num_users = mysql_num_rows($result);
	if($num_users == '1') 
	{
	$check_pass = md5($password);
	$query = "SELECT * FROM `users` WHERE `email`='$email'";
	$result = mysql_query($query);
	$row = mysql_fetch_array($result);
	$pass = $row["pass_hash"];
		if($check_pass == $pass)
			{
			session_start();
    		        $user_id = $row['id'];
    		        $ip = $_SERVER['REMOTE_ADDR'];
                        $_SESSION['valid_user'] = '1';
			$_SESSION['user_id'] = $user_id;
			$_SESSION['sess_id'] = session_id();
			
			mysql_free_result($result);
			header("Location: ".$_SERVER['PHP_SELF']);
			exit;
			}
			else
			{
			mysql_free_result($result);
			$errors = 'Пароль введен неверно!';
			}
	}
	else //Пользователь не найден
	{
	$errors .= "Пользователь с таким именем не зарегистрирован";

	}
} else {$errors .= "<em>Одно из полей не было заполнено!</em>";}
}

if($_GET['u'] == '0') {$_SESSION['valid_user'] = '0';}
if($_SESSION['valid_user'] == '1') {$field_status = 'disabled';}
?>
После обработки формы следующие ошибки:

Notice: Undefined index: u in C:\apache\localhost\www\guestbook\login.php on line 53
//Строка: if($_GET['u'] == '0') {$_SESSION['valid_user'] = '0';}

Notice: Undefined variable: _SESSION in C:\apache\localhost\www\guestbook\login.php on line 54
//Строка: if($_SESSION['valid_user'] == '1') {$field_status = 'disabled';}


Notice: Undefined variable: _SESSION in C:\apache\localhost\www\guestbook\login.php on line 65
//Строка: <?php if ($_SESSION['valid_user'] == '0') { ?>Представьтесь, пожалуйста ...<?php } ?>

Notice: Undefined variable: _SESSION in C:\apache\localhost\www\guestbook\login.php on line 78
Строка: <?php if($_SESSION['valid_user'] == '1') { ?><a href="login.php?u=0">Выход</a> <?php } else {?> <a href="reg.php">Регистрация</a> | <a href="remind.php">Забыли пароль?</a> <?php } ?>
 

igortik

Новичок
У меня для наглядности после присвоения:
PHP:
$_SESSION['valid_user'] = '1';
полям ввода логина, пароля и кнопке устанавливается параметр disabled.
Т.е. я сразу же вижу, были ли занесены данные в массив $_SESSION на этом промежутке кода:

PHP:
session_start();
$user_id = $row['id'];
$ip = $_SERVER['REMOTE_ADDR'];
$_SESSION['valid_user'] = '1';
$_SESSION['user_id'] = $user_id;
$_SESSION['sess_id'] = session_id();
mysql_free_result($result);
header("Location: ".$_SERVER['PHP_SELF']);
exit;
-~{}~ 19.05.08 14:09:

Андрейка
Ответ хороший, но на данном этапе не помог.

-~{}~ 19.05.08 14:19:

Все .. разобрался.

необходимо было всего-то в начале скрипта прописать:
PHP:
if($_REQUEST[session_name()]) {session_start();}
 

AmdY

Пью пиво
Команда форума
ужос то какой, слава богу хоть затычку типо нашёл, но вот не разобрался всё же.
 

AmdY

Пью пиво
Команда форума
необходимо было всего-то в начале скрипта прописать:
if($_REQUEST[session_name()]) {session_start();}
этот вывод ошибочен.
во первых, для $_REQUEST[session_name()] - возвращает sid полученый из любого источника, а по хорошему, sid не должен передаваться в адресной строке $_GET
if($_GET['u'] == '0') {$_SESSION['valid_user'] = '0';}
if($_SESSION['valid_user'] == '1') {$field_status = 'disabled';}
здесь в любом случае используется массив $_SESSION, значит сессия должна быть стартанута, а для того, чтобы она стартанула у тебя нужно иметь $_REQUEST[session_name()] - который создаётся, когда пользователь верно залогинился
 
Сверху