Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с сессиями
 
 автор: Felix   (14.01.2005 в 10:29)   письмо автору
 
 


<?php
    
// Это файл handler.php
    // Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
    // сейчас выставлен сервер локальной машины
    
$dblocation "192.168.1.202";
    
// Имя базы данных
    
$dbname "knp";
    
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
    // у нас, например $dbuser = "softtime";
    
$dbuser "root";
    
// Пароль - в комментариях не нуждается ;-)
    
$dbpasswd "wrdz98x";
    
// Соединяемся с сервером базы данных
    
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
    if (!
$dbcnx) {
      echo( 
"<P>В настоящий момент сервер базы данных не
                          доступен, поэтому корректное отображение
                          страницы невозможно.</P>" 
);
      exit();
    }
    
// Выбираем базу данных
    
if (! @mysql_select_db($dbname,$dbcnx) ) {
      echo( 
"<P>В настоящий момент база данных не доступна,
                          поэтому корректное отображение страницы
                          невозможно.</P>" 
);
      exit();
    }
    
// Формируем и выполняем SQL-запрос для посетителя с
    // именем $_POST['name']
    
$query "SELECT password FROM avtoriz WHERE login='".$_POST['name']."'";
    
$nme mysql_query($query);
    if(!
$nme)
    {
      echo 
mysql_error();
      echo 
"Ошибка выполнения запроса";
      exit();
    }
    
// Если запрос вернул результат - производим дальнейшую обработку
    
if(mysql_num_rows($nme) > 0)
    {
       
// Получаем пароль
       
$password mysql_result($nme0);
       
// Сравниваем пароль из базы данных и введённый посетителем
       
if ($_POST['password'] == $password)
       {
         
// Идентификация прошла успешно - осуществляем
         // "вход" посетителя. Для того, чтобы в течении текущей
         // сесси посетитель не вводил своё имя пароль повторно -
         // передаём их через сессию
         
if(session_start())
         {
 
#          $_SESSION['user'] = $_POST['name'];
 #          $_SESSION['password'] = $_POST['password'];
           
$user $_POST['name'];
           
session_register("user");
           
// Осуществляем автоматический переход на
           // страницу index.php чтобы убедится, что
           // посетитель "вошёл"
    #       print $HTTP_SESSION_VARS["user"];
           
Header("Location: men.php");
            
         }
       }
       else
       {
         
#echo "Ошибка идентификации: неправильный пароль";
         
include ("index.php");
         exit();
       }
    }
    
// Если в результате запроса не получено ни одной
    // строки - посетитель с таким именем не зарегистрирован
    
else
    {
     
# echo "Ошибка идентификации: посетитель не зарегистрирован";
     
include ("index.php");
      exit();
    }
?> 

Данный скрипт должен передавать через сессию логин юзера в следующий скрипт :

<HTML>
<HEAD>
<META http-equiv="Content-Language" content="ru">
<META http-equiv="Content-Type" content="text/html; charset=windows-1251">
<Title>WEB сервер УС БоГЭС</title>
</HEAD>
<body bgcolor="black" alink="Lime" link="lime" vlink="lime" text="Yellow">
<?
include("style.inc");
?>
<table bgcolor='#003366' border="1" width="150">
  <tr>
    <td width="100%" bgcolor="#0000FF"><center>
    <font color="#FFFFFF">БоГЭС</font></center></td>
  </tr>
<?
session_start
();
print 
$HTTP_SESSION_VARS["user"];

#print $_SESSION['user'];

    
include "knp/connect.php";
    
$ath=mysql_query("select id from avtoriz where login='".$HTTP_SESSION_VARS["user"]."'");
    
$result=mysql_result($ath,'id');
    switch (
$result)
    {
#####################################################################        
        
case "1": include_once "admin.php"; break;
        case 
"2": include_once ""; break;
        
#default: include_once "index.php";
#####################################################################    
    
}

?>
<tr>
<td>
<?
$id 
$_GET['id'];
include_once 
"$id";
?>
</td>
</tr>
</table>

Но почемуто я не могу увидеть переменную
print $HTTP_SESSION_VARS["user"];
Одним словом данные не доходят. почему ??????

register_globals = Off

   
 
 автор: glsv (Дизайнер)   (14.01.2005 в 11:53)   письмо автору
 
   для: Felix   (14.01.2005 в 10:29)
 

>Но почемуто я не могу увидеть переменную
print $HTTP_SESSION_VARS["user"];

Хм.. А попробуйте обратиться к массиву $_SESSION
<?
  
print $_SESSION["user"];
?>

   
 
 автор: Felix   (14.01.2005 в 12:13)   письмо автору
 
   для: glsv (Дизайнер)   (14.01.2005 в 11:53)
 

Пробовал, эффект тот же самый а точнее нулевой.
Что еще может быть ?

   
 
 автор: cheops   (14.01.2005 в 13:09)   письмо автору
 
   для: Felix   (14.01.2005 в 12:13)
 

Опять тоже самое что и прошлый раз - вызов функции session_start() после вывода в окно браузера (HTML), сервер не может в результате отослать требование браузеру установить сессионный cookie с идентификатором сессиии, функцию session_start() следует вызывать первой в файле
<?php
  session_start
();
?>

Причём это следует делать в каждом файле, где используются сессии.

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1461

   
 
 автор: elenaki   (14.01.2005 в 21:06)   письмо автору
 
   для: cheops   (14.01.2005 в 13:09)
 

мы тут три дня с шефом бились над проблемой. у одной клиентки (из 40 купивших наш интернет-магазин) вдруг, ни с того ни с сего начали пропадать переменные сессии.

примерно 10 страниц от входа в магазин он проходит нормально, переменные передаются. на 11-й - бабах, открывается новая сессия, старые переменные пропадают.

прочитали, что в IE6 есть такой баг - когда используются одновременно и сессии и куки, они могут путаться между собой. заставили клиентку обновить IE, поставить сервис-пак. не помогло!

главное, у всех остальных работает, у нас на всех компах работает, даже у нее в Нетскейпе - работает!

потом мы начали передавать номер сессии в скрытом поле формы. опять - у нас работает, у нее не работает. потом я обнаружила, что шеф не прописал в форме enctype. поставили text/plain - переменные передаются. но потом с этим enctype перестала работать отсылка данных в банк на их платежную систему. а когда ставим multipart-form-data - в банк посылает, но между страницами просмотра заказа и оформления платежа не пересылает. бред!

вообщем, пришлось изощряться - посылаем в скрытом поле номер сессии, потом присваиваем его session_id() и открываем сессию с нужным нам номером.

вот такие чудеса случаются.

   
 
 автор: Felix   (17.01.2005 в 03:38)   письмо автору
 
   для: cheops   (14.01.2005 в 13:09)
 

У меня в php.ini стоит output_buffering = 4096, тоесть с таким параметром как я понимаю вызов функции session_start() возможен в любом месте скрипта. Этоо во первых.
А во вторых пробовал я ставить session_start() и в начале скрипта все равно эффект тот же самый то есть нулевой.


PS: Как оказалось, вход не произходит только в первого раза. Если я нажимаю в браузере кнопку "назад" а потом повторно ввожу имя и пароль то все работает нормально.
Почему не входит с первого раза ?

   
 
 автор: cheops   (17.01.2005 в 13:37)   письмо автору
 
   для: Felix   (17.01.2005 в 03:38)
 

Хм... посмотрите в конфигурационном файле php.ini значение директивы register_long_arrays - она включена?
register_long_arrays = On

или выключена
register_long_arrays = Off

   
 
 автор: Felix   (18.01.2005 в 04:46)   письмо автору
 
   для: cheops   (17.01.2005 в 13:37)
 

У меня в php.ini данная директива вообще отсутствует.
Ее нужно создать?? а с каким параметром??

   
 
 автор: cheops   (18.01.2005 в 14:16)   письмо автору
 
   для: Felix   (18.01.2005 в 04:46)
 

Хм... а PHP какой версии? Дело в том, что длинные суперглобальные массивы в формате $HTTP_***_VARS, считаются устаревшей конструкцией и директива register_long_arrays - позволяет включать их использование и отключить. Вам следует их включить:
register_long_arrays = On

   
 
 автор: Felix   (19.01.2005 в 06:20)   письмо автору
 
   для: cheops   (18.01.2005 в 14:16)
 

Я добавилв php.ini директиву register_long_arrays = On
только толку от этого никакого. Все равно регистрация происходит только со второго раза.

   
 
 автор: cheops   (19.01.2005 в 12:41)   письмо автору
 
   для: Felix   (19.01.2005 в 06:20)
 

Хм... именно с той формой и обработчиком, которые приведены выше?

   
 
 автор: Felix   (19.01.2005 в 12:58)   письмо автору
 
   для: cheops   (19.01.2005 в 12:41)
 

Да именно с той формой и обработчиком которые выше.

   
 
 автор: cheops   (19.01.2005 в 13:02)   письмо автору
 
   для: Felix   (19.01.2005 в 12:58)
 

Я сейчас уезжаю, но вечером потестирую тщательно потестирую вашу форму и обработчик на локальной машине... скорее всего это ничего не даст, но по крайней мере мы исключим код (ну или найдём ошибку).

   
 
 автор: Felix   (20.01.2005 в 06:05)   письмо автору
 
   для: cheops   (19.01.2005 в 13:02)
 

Вот еще раз выкладываю скрипты
немного измененные но на работу не изменения существенно не влияют


<?php
session_start
();
    
// Это файл handler.php
    // Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
    // сейчас выставлен сервер локальной машины
    
$dblocation "192.168.1.202";
    
// Имя базы данных
    
$dbname "knp";
    
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
    // у нас, например $dbuser = "softtime";
    
$dbuser "root";
    
// Пароль - в комментариях не нуждается ;-)
    
$dbpasswd "wrdz98x";
    
// Соединяемся с сервером базы данных
    
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
    if (!
$dbcnx) {
      echo( 
"<P>В настоящий момент сервер базы данных не
                          доступен, поэтому корректное отображение
                          страницы невозможно.</P>" 
);
      exit();
    }
    
// Выбираем базу данных
    
if (! @mysql_select_db($dbname,$dbcnx) ) {
      echo( 
"<P>В настоящий момент база данных не доступна,
                          поэтому корректное отображение страницы
                          невозможно.</P>" 
);
      exit();
    }
    
// Формируем и выполняем SQL-запрос для посетителя с
    // именем $_POST['name']
    
$query "SELECT password FROM avtoriz WHERE login='".$_POST['name']."'";
    
$nme mysql_query($query);
    if(!
$nme)
    {
      echo 
mysql_error();
      echo 
"Ошибка выполнения запроса";
      exit();
    }
    
// Если запрос вернул результат - производим дальнейшую обработку
    
if(mysql_num_rows($nme) > 0)
    {
       
// Получаем пароль
       
$password mysql_result($nme0);
       
// Сравниваем пароль из базы данных и введённый посетителем
       
if ($_POST['password'] == $password)
       {
         
// Идентификация прошла успешно - осуществляем
         // "вход" посетителя. Для того, чтобы в течении текущей
         // сесси посетитель не вводил своё имя пароль повторно -
         // передаём их через сессию
 #          $_SESSION['user'] = $_POST['name'];
 #          $_SESSION['password'] = $_POST['password'];
           
$user $_POST['name'];
           
session_register("user");
           
// Осуществляем автоматический переход на
           // страницу index.php чтобы убедится, что
           // посетитель "вошёл"
           
Header("Location: men.php");
 
#       echo "<HTML><HEAD><META HTTP-EQUIV='Refresh' CONTENT='0; URL=men.php'></HEAD><body>";
         
       
}
       else
       {
         
#echo "Ошибка идентификации: неправильный пароль";
         
Header("Location: index.php");
         exit();
       }
    }
    
// Если в результате запроса не получено ни одной
    // строки - посетитель с таким именем не зарегистрирован
    
else
    {
     
# echo "Ошибка идентификации: посетитель не зарегистрирован";
     
Header("Location: index.php");
      exit();
    }
?>  


и обработчик

<?
session_start
();
if(isset(
$_POST['exit']))
    {
session_unset();
session_destroy();
Header("Location: ../index.php");
    }
?>
<HTML>
<HEAD>
<META http-equiv="Content-Language" content="ru">
<META http-equiv="Content-Type" content="text/html; charset=windows-1251">
<Title>WEB сервер УС БоГЭС</title>
</HEAD>
<body bgcolor="black" alink="Lime" link="lime" vlink="lime" text="Yellow">
<?
include("style.inc");
?>
<table bgcolor='#003366' border="1" width="15%">
  <tr>
    <td width="100%" bgcolor="#0000FF"><center>
    <font color="#FFFFFF">БоГЭС</font></center></td>
  </tr>
<?
    
include "knp/connect.php";
    
$ath=mysql_query("select id from avtoriz where login='".$HTTP_SESSION_VARS["user"]."'");
    
// Если запрос вернул результат - производим дальнейшую обработку
    
if(mysql_num_rows($ath) > 0)
        {
     
// Получаем id
    
$id mysql_result($ath0);
    switch (
$id)
    {
#####################################################################        
        
case "1": include_once "knp/user/admin.php"; break;
        case 
"2": include_once "knp/user/vitp.php"; break;
        
#default: include_once "index.php";
#####################################################################    
    
}
        }
    if(!isset(
$_POST['exit']))
    {
print
"<tr><td>";
print
"<form action='' method='POST'>
<input type='submit' name='exit' value='закончить работу'></td></tr>"
;
    }
?>
</table></form>
<?
$id 
$_GET['id'];
include_once 
"$id";
?>

   
 
 автор: cheops   (20.01.2005 в 08:07)   письмо автору
 
   для: Felix   (20.01.2005 в 06:05)
 

Так и не добрался вчера до вашего скрипта :((( Сегодня будут делать...

   
 
 автор: cheops   (20.01.2005 в 20:06)   письмо автору
 
   для: cheops   (20.01.2005 в 08:07)
 

У меня приведённый выше вариант, после подстановки соответствущих параметоров баз данных и закомментаривание вызовов файлов, которых у меня нет - работает. Может дело действительно в сервере - попробуйте написать простейший отладочный скрипт - он работает?

   
 
 автор: Felix   (21.01.2005 в 04:57)   письмо автору
 
   для: cheops   (20.01.2005 в 20:06)
 

А какой отладочный скрипт надо написать ?

   
 
 автор: cheops   (21.01.2005 в 12:51)   письмо автору
 
   для: Felix   (21.01.2005 в 04:57)
 

Например, создать файл index.php следующего содержания
<?php
  
// Инициируем сессию
  
session_start();
  
// Помещаем переменную в сессию
  
$_SESSION['name'] = "value";
  
// Переходим на другую страницу
  
echo "<a href=index1.php>проверка</a>";
?>

а в index1.php вывести дамп суперглобального массива $_SESSION
<?php
  
// Инициируем сессию
  
session_start();
  
// Выводим содержимое массива
  
print_r($_SESSION);
?>

   
 
 автор: Андрюха.   (01.06.2005 в 16:27)   письмо автору
 
   для: cheops   (21.01.2005 в 12:51)
 


<?php
  
// Инициируем сессию
  
session_start();
echo 
session_id();
  
// Помещаем переменную в сессию
  
$_SESSION['name'] = "value";
  
// Переходим на другую страницу
  
echo "<a href=qq1.php>проверка</a>";
?>

и файл qq1.php

<?php
  
// Инициируем сессию
  
session_start();
echo 
session_id();
  
// Выводим содержимое массива
  
print_r($_SESSION);
echo 
$_SESSION['name'];
//echo session_id();
?>

и сесия qq отличается от qq1. кроме сессий ничего не выводится - хост

   
 
 автор: cheops   (01.06.2005 в 20:46)   письмо автору
 
   для: Андрюха.   (01.06.2005 в 16:27)
 

Давайте вопрос в какой-нибудь одной теме обсуждать :)))

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=4367

   
 
 автор: method   (05.06.2005 в 07:27)   письмо автору
 
   для: cheops   (01.06.2005 в 20:46)
 

Буквально на днях столкнулся с такой же праблой что и автор этой темы,
тут модифицировал малёху отладочный скрипт от cheops'а ,
может кому нить и понадобится ....ХЫ...

файл test.php :




<?php
Error_Reporting
(0);
$name=$_POST['name'];
if(isset(
$_POST['action']))
  {
if(
$name==""){
   
$submit false;
   }
if(
$name!==""){
 
session_start();
 
$_SESSION['name']=$name;
Header("Location: itog.php");
 }
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Проверка регистрации переменных при отключеной register_global</title><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head>
<body onload="document.form.name.focus();"><center><font color=blue size=10>Введите какое нибудь имя для теста</font>
<form action="test.php" method="post" name="form">
<input type="hidden" name="action" value="">
<input type="text" name="name" value=""> <br><br>
<input type="submit" name="submit" value="проверка">
</form></center>
</body></html>





файл itog.php :

<?php 
Error_Reporting
(0);
  print 
"<title>Итог Теста</title>";
  
// Инициируем сессию 
  
session_start(); 
  if(!
$_SESSION['name']){
  print 
"<center><font color=red size=16>Переменной login Нет в супер-глобальном массиве!<br> обратитесь к документации по настройке php на вашем сервере</font></center>";
  exit;
  }
  else{
  
// Выводим содержимое массива 
  
print "<center><font color=green size=18>Всё работает:</font></center><br><center><font color=darkblue size=14>Логин:  <b>".$_SESSION['name']."</b><br><br>id сессии:  <b>".session_id()."</b><br></font></center>";
  exit;
  }
?>



ЗЫ: Модераторам > Если Ошибся где то в терминологии поправте пожалуйста...
спасибо за внимание...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования