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

Форум PHP

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

 

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

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

тема: Сессии
 
 автор: SnooPI   (20.02.2007 в 23:52)   письмо автору
 
 

Опять проблемы с сессиями :(
header.php

if(session_is_registered('name')){
        echo "<a href=/my title='Личный кабинет'><font color=white><b>Профиль</b></font></a>";
        } else {
        echo "<a href=/register title='Регистрация'><font color=white><b>Регистрация</b></font></a>";
        }


my.php

if($_GET['do'] == logout){
    session_destroy();


ну ладно...вообщем дело в том, что если ты залогинился и идешь на страницу вывода (users.php)пользователей зарегистрированных и нажав на какого-нибудь юзера, то ты становишся тем юзером кто последний в списке......
например

nick1    | mail1
nick2    | mail2
nick3    |mail3

Нажал например на nick2 , и тебе слева там под меню(не важно где) пишет "привет nick3

Тот кто последний в списке за того "как-будто залогиниваюсь" ))
Странно...
Думаю вы поняли :)
Объясните что да как и где сессии может надо закырть или еще чего-нибудь[

   
 
 автор: cheops   (21.02.2007 в 00:16)   письмо автору
 
   для: SnooPI   (20.02.2007 в 23:52)
 

В чём вопрос?

   
 
 автор: SnooPI   (21.02.2007 в 01:30)   письмо автору
 
   для: cheops   (21.02.2007 в 00:16)
 

Вопрос: как это пофиксить.....

Ну вот зайдите пожалуйста по этой ссылке, введите данные(login= test, pass= test )в форму для авториации, после этого нажмите на меню "Пользователи" и нажмите там на любого.....
И вот.....вы увидели баг

   
 
 автор: cheops   (21.02.2007 в 01:43)   письмо автору
 
   для: SnooPI   (21.02.2007 в 01:30)
 

Хм... что-то ничего не заметил, однако так бывает, если где-то в блоке if() вместо знака равенства == по ошибке поставлен знак присваивания =.

   
 
 автор: SnooPI   (21.02.2007 в 01:46)   письмо автору
 
   для: cheops   (21.02.2007 в 01:43)
 

Вы ничего не заметили т.к. ваш ник в списке пользователей последний !!!!
Зайдите под логином и паролем тест !!
:)

   
 
 автор: retsoul   (21.02.2007 в 01:50)   письмо автору
 
   для: SnooPI   (21.02.2007 в 01:46)
 

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

   
 
 автор: SnooPI   (21.02.2007 в 01:54)   письмо автору
 
   для: retsoul   (21.02.2007 в 01:50)
 

header.php

<?php
session_start
();
require_once(
"config.php");
        if(
session_is_registered('name')){
        echo 
"<a href=/my title='Личный кабинет'><font color=white><b>Профиль</b></font></a>";
        } else {
        echo 
"<a href=/register title='Регистрация'><font color=white><b>Регистрация</b></font></a>";
        }
//Здесь меню
if(session_is_registered('name')){
    echo 
"<center><b>$_SESSION[name]</b><small>&nbsp;&nbsp;&nbsp;<a href=/logout title=Выйти>(logout)</a></small></center>";
    } else {
    echo 
"<form action=auth.php method=post>
    Login : <input type=text name=name value=
$_SESSION[name]><br><br>
    Pass :  &nbsp;<input type=password name=password value=
$_SESSION[password]><br><br>
    <input type=submit value=Войти title=Войти>
    </form>"
;
    }
?>


auth.php


<?php
    
include ("header.php");
  if(!empty(
$_POST['name']) && !empty($_POST['password']))
  {
    
// Устанавливаем соединение с базой данных
    
require_once("config.php");
    
// Защищаясь от SQL-инъекции, пропускаем
    // полученные пароль и логин через функцию
    // mysql_escape_string
    
if (!get_magic_quotes_gpc())
    {
      
$_POST['name'] = mysql_escape_string($_POST['name']);
      
$_POST['password'] = mysql_escape_string($_POST['password']);
    }
    
// Осуществляем запрос, который возвращает
    // число записей, удовлетворяющих паролю
    // и логину
    
$_POST['password'] = md5($_POST['password']);
    
$query "SELECT COUNT(*) FROM users
              WHERE name = '
$_POST[name]' AND pass = '$_POST[password]'";
    
$usr mysql_query($query);
    if(!
$usr)
    exit(
"Ошибка");
    
// Получаем число записей
    
if(mysql_result($usr,0) > 0)
    
define("TOTAL"1);
    }
  
// Если число записей больше 0,
  // заносим данные о пользователе в сессию
  
if(defined("TOTAL"))
  {
    
$_SESSION['name'] = $_POST['name'];
    
$_SESSION['password'] = $_POST['password'];
  }

  
// Если посетитель "вошел" - перенаправляем его
  
if(isset($_SESSION['name']))
  {
      
//echo "Привет $_SESSION['name']";
      
echo "<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=my.php'>
          </HEAD><body>"
;
  } else {
      exit(
"Неверный пароль");
      }

      include (
"footer.php");
?>


my.php


<?php
    
include ("header.php");
    if(
$_GET['do'] == logout){
    
session_destroy();
    echo 
"<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
          </HEAD></HTML>"
;
    }
    
// Устанавливаем соединение с базой данных
    // Выводим приветствие
    // Выводим данные пользователя
    
$query "SELECT * FROM users WHERE name = '$_SESSION[name]'";
    
$usr mysql_query($query);
    if(!
$usr)
    exit(
mysql_error());
    
$user mysql_fetch_array($usr);
    echo 
"<b>Привет ".$_SESSION['name']."</b><br>";
    echo 
"E-mail: ".$user['email']."<br>";
    echo 
"Ваш URL: ".$user['url']."<br>";
    if(
$user[icq] != 0)
    echo 
"<a href=http://www.icq.com/$user[icq] target=_blank title='Мой номер ICQ  $user[icq]'><font color=green><b>$user[icq]</b></font></a>";
    include (
"footer.php");
?>

   
 
 автор: retsoul   (21.02.2007 в 02:19)   письмо автору
 
   для: SnooPI   (21.02.2007 в 01:54)
 

В приведённом коде явных ошибок не заметил.
Но заметил интересную особенность на сайте. Она заключается в том, что при запросе урл http://.../users переменная сессии впорядке, но при обновлении этой страницы имя в переменной сесии меняется, значит, что переименование переменной $_SESSION['name'] происходит при выводе таблицы пользователей и получает значение последней записи.

   
 
 автор: SnooPI   (21.02.2007 в 02:21)   письмо автору
 
   для: retsoul   (21.02.2007 в 02:19)
 

Не понял тебя :)
Так чтоже надо сделать....

   
 
 автор: retsoul   (21.02.2007 в 02:24)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:21)
 

дело у тебя там в том, что каким-то образом происходит замена переменной, хранимой в сессии, не знаю, какой скрипт работает по этому запросу -> http://www.snoopi.org/users но изменение имени залогиненого пользователя происходит именно там, достаточно не нажимать имен пользователей, а просто обновить страницу браузера, чтобы увидеть как меняется переменная

   
 
 автор: cheops   (21.02.2007 в 01:52)   письмо автору
 
   для: SnooPI   (21.02.2007 в 01:46)
 

Нужно код смотреть... если надумаете его выкладывать, лучше прикреплять его в виде архива.

   
 
 автор: SnooPI   (21.02.2007 в 02:17)   письмо автору
 
   для: cheops   (21.02.2007 в 01:52)
 

Этого достаточно? :)

   
 
 автор: cheops   (21.02.2007 в 02:22)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:17)
 

Я тоже ошибок не вижу - везде чисто. retsoul двумя постами выше нашёл закономерность, приведите кусок кода, который выводит таблицу пользователей.

   
 
 автор: SnooPI   (21.02.2007 в 02:24)   письмо автору
 
   для: cheops   (21.02.2007 в 02:22)
 

Весь файл users.php

<?php
if(empty($_GET['id']))
  {
  
$query "SELECT * FROM `users` ORDER BY `id` ASC";
  
$result mysql_query($query);
  
$numrows mysql_numrows($result);
  echo 
"<table width=400 class=nobord><tr>
  <td width=50% align='center' class=td>Имя</td>
  <td align='center' width='50%' class=td>ICQ</td>
  <td align='center' width='50%' class=td>Сайт</td>
  <td align='center' width='50%' class=td>E-mail</td></tr>"
;
       for (
$i=0$i<$numrows$i++){
         
$id = @mysql_result($result$i'id');
         
$name = @mysql_result($result$i'name');
         
$icq = @mysql_result($result$i'icq');
         
$url = @mysql_result($result$i'url');
         
$email = @mysql_result($result$i'email');
         
$admin = @mysql_result($result$i'admin');
       
//  $showemail=@mysql_result($result, $i, 'showemail');
         
if($admin) {
         echo 
"<tr><td class=td><a href=/$id title='Администратор  $name'><font color=red><b>$name</b></font></a></td>";
          } else {
         print 
"<tr><td class=td>&nbsp;<a href=/$id title='Пользователь  $name'><b>$name</b></a></td>";
         }
         if(
$icq != '0'){
             echo 
"<td align='center' class=td><a href='http://www.icq.com/$icq' target=_blank title='Icq $name  $icq'><font color=green><b>$icq</b></font></a></td>";
         } else {
         echo 
"<td align='center' class=td><font color=red><b>---</b></font></td>";
         }
         if((!empty(
$url)) & (preg_match("|^[-0-9a-z_]+\.[a-z]{2,6}$|i"$url)) || (preg_match("|^[-0-9a-z_]+\.[-0-9a-z_]+\.[a-z]{2,6}$|i"$url))) {
             echo 
"<td align='left' class=td align=><a target=_blank href=http://$url title='Перейти на сайт $name  http://$url'><font color=black><b>";
              if( 
strlen($url) > 20 ){
              
$url substr($url015);
              echo 
"http://$url ..</b></font></a></td>";
              } else {
              echo 
"http://$url</b></font></a></td>"; }
             } else {
                 echo 
"<td align='center' class=td><font color=red><b>---</b></font></td>"; }
      
//   if($showemail == 'yes'){
          
$email2 str_replace'@''[at]'$email );
          
$email2 str_replace'.''[dot]'$email2 );
                  echo 
"<td align='left' class=td><a href=mailto:$email title='Отправить e-mail  $name'><b>$email2</b></a></td>";
       
//  } else {
       //  echo "<td align='left'><font color=blue>Hide</font></td>";
       //  }
       
}
       print 
"</tr></table><BR>";
  }
  else
  {
    
// Проверяем, является ли параметр целым числом
    
if(!preg_match("|^[\d]+$|"$_GET['id']))
    {
      exit(
"hacked attemp :)");
    }
    
// Запрашиваем информацию по текущему пользователю
    
$query "SELECT * FROM users WHERE id = $_GET[id]";
    
$usr mysql_query($query);
    if(!
$usr) exit("Ошибка - ".mysql_error());
    
$user mysql_fetch_array($usr);
    echo 
"<center>";
    echo 
"<b><font color=glue>$user[name]</font></b><br>";
    if(!empty(
$user['email']))
    
$email2 str_replace'@''[at]'$user[email] );
    
$email2 str_replace'.''[dot]'$email2 );
    echo 
"<a href=mailto:$user[email] title='Отправить e-mail  $user[name]'><b>$email2</b></a><br>";
    if(!empty(
$user['url']) & (preg_match("|^[-0-9a-z_]+\.[a-z]{2,6}$|i"$user['url'])) || (preg_match("|^[-0-9a-z_]+\.[-0-9a-z_]+\.[a-z]{2,6}$|i"$user['url'])))
    echo 
"<a href=http://$user[url] target=_blank title='Перейти на сайт $user[name]  http://$user[url]'>http://$user[url]</a><br>";
    if((!empty(
$user['icq'])) & ($user['icq'] != 0)) echo "<b><font color=green>Icq</font> - $user[icq]</b><br>";
    echo 
"</center>";
  }

  
mysql_close();
?>

   
 
 автор: cheops   (21.02.2007 в 02:29)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:24)
 

Скорее всего у вас включена директива register_globals в конфигурационном файле php.ini и вот эта строка
<?php
  $name 
= @mysql_result($result$i'name');
?>

переписывает сессионную переменную $_SESSION['name'], используйте вместо $name что-то другое или выключите register_globals, поместив в директорию файл .htaccess следующего содержания
php_flag register_globals off

   
 
 автор: retsoul   (21.02.2007 в 02:27)   письмо автору
 
   для: cheops   (21.02.2007 в 02:22)
 

вопрос:
Переменная $_SESSION['name'] может заменяться локальной переменной $name, которая используется в цикле?

   
 
 автор: cheops   (21.02.2007 в 02:30)   письмо автору
 
   для: retsoul   (21.02.2007 в 02:27)
 

Если директива register_globals включена - запросто.

   
 
 автор: retsoul   (21.02.2007 в 02:32)   письмо автору
 
   для: cheops   (21.02.2007 в 02:30)
 

значит причина (почти) найдена :)

   
 
 автор: SnooPI   (21.02.2007 в 02:32)   письмо автору
 
   для: retsoul   (21.02.2007 в 02:27)
 

оО спасибо вам большое !!!!!!!
Биг респект ))

А вот проблемка))
куки....как сделать куки при авторизации

   
 
 автор: cheops   (21.02.2007 в 02:35)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:32)
 

Под новые вопросы лучше заводить новые темы.

   
 
 автор: SnooPI   (21.02.2007 в 02:41)   письмо автору
 
   для: cheops   (21.02.2007 в 02:35)
 

Чтобы не мусорить новыми темами, не могли бы вы мне тут ответить на вопрос? :)

Вот мой файл регистр.пхп

<?php include "header.php";?>
<script type="text/javascript" src="check.js"></script>
<table class=body width=250>
<form method=post>
<tr><td>Имя:<small>  (Латинскими)</small></td></tr><tr><td><input type=text name=name maxlength="15"></td></tr>
<tr><td>Пароль:<br><input type=password name=pass id=pass onkeyup="javascript:pass_check();"></td><td width=20>&nbsp;</td>
<td>Повторите пароль:<br><input type=password name=repass id=repass onkeyup="javascript:pass_check();"></td>
<td id=image></td></tr>
<tr><td>E-mail:</td></tr><tr><td><input type=text id=email onkeyup="javascript:email_check();" name=email></td></tr>
<tr><td>Icq:</td></tr><tr><td><input type=text name=icq id=icq onkeyup="javascript:icq_check();" maxlength="9"></td></tr>
<tr><td >Сайт: <small>(без "http://")</small></td></tr><tr><td><input type=text name=url></td></tr>
<tr><td align=right><input class=button type=submit title="Регистрация" id="but" value='Регистрация'></td></tr>
</form>
</table>
<?php
  
// Обработчик HTML-формы

  /////////////////////////////////////////////////
  // 1. Блок проверки правильности ввода данных
  /////////////////////////////////////////////////
  // Удаляем лишние пробелы
  
$_POST['name'] = trim($_POST['name']);
    
$_POST['pass'] = trim($_POST['pass']);
  
$_POST['repass'] = trim($_POST['repass']);
  
//Ставим слешы перед кавычками
  
$_POST['name'] = addslashes($_POST['name']);
  
$_POST['pass'] = addslashes($_POST['pass']);
  
$_POST['repass'] = addslashes($_POST['repass']);
  
$_POST['url'] = addslashes($_POST['url']);
  
$_POST['icq'] = addslashes($_POST['icq']);
  
// Проверяем, правильно ли заполнены обязательные поля
  
$error = array("Поле 'Имя' не заполнено",
                  
"Поле 'Пароль' не заполнено",
                  
"Пожалуйста, повторите пароль",
                  
"Пароли не совпадают",
                  
"Недопустимый логин.<br>",
                  
"Имя должно содержать только латинские буквы!!!",
                  
"Поле 'ICQ' должно содержать от 5 до 9 цифр",
                  
"Длина ICQ номера должна быть от 5 до 9 цифр",
                  
"Длина ICQ номера должна быть не больше 9 цифр",
                  
"Поле 'E-mail' должно соответствовать формату billy@microsoft.com",
                  
"Такое имя уже зарегистрировано!!!",
                  
"Такой e-mail уже имеется в базе данных!!!",
                  
"С вашего IP-адреса уже производилась регистрация");
  if(empty(
$_POST['name']))
  exit();
  if(empty(
$_POST['name']))
  exit (
$error[0]);
  if(empty(
$_POST['pass']))
  exit(
$error[1]);
  if(empty(
$_POST['repass']))
  exit(
$error[2]);
  if(
$_POST['pass'] != $_POST['repass'])
  exit(
$error[3]);
  
// Проверяем на кол-во символов
  
if( in_arraystrtolower($_POST['name']), array("mysql","apache","guest","root","admin","nobody","ftp","Isis","SnooPI","ftp")))
  exit (
$error[4]);
 if(!
preg_match("|^[-0-9a-z_]+$|i",
                   
$_POST['name']))
           exit(
$error[5]);
  if(!empty(
$_POST['icq'])){
  if(!
preg_match("|^[\d]+$|"$_POST['icq']))
    {
      exit(
$error[6]);
    }
  if( 
strlen($_POST['icq']) < || strlen($_POST['icq']) > 9)
   exit(
$error[7]);
   }
  
// Если введен e-mail, проверяем его на соответствие
  
if(!empty($_POST['email']))
  {
    if(!
preg_match("|^[-0-9a-z_]+@[-0-9a-z_]+\.[a-z]{2,6}$|i",
                   
$_POST['email']))
    {
      exit(
$error[9]);
    }
  }

  if (!
get_magic_quotes_gpc())
  {
    
$_POST['name']  = mysql_escape_string($_POST['name']);
    
$_POST['pass']  = mysql_escape_string($_POST['pass']);
    
$_POST['email'] = mysql_escape_string($_POST['email']);
    
$_POST['url']  = mysql_escape_string($_POST['url']);
    
$_POST['icq']  = mysql_escape_string($_POST['icq']);
  }

  
/////////////////////////////////////////////////
  // 2. Блок проверки имени на уникальность
  /////////////////////////////////////////////////
  // Устанавливаем соединение с базой данных
  
require_once("config.php");
  
// Проверяем, не было ли переданное имя зарегистрировано ранее
  
$query "SELECT COUNT(*) FROM users WHERE name = '$_POST[name]'";
  
$usr mysql_query($query);
  if(!
$usr)
  exit(
"Ошибка - ".mysql_error());
  
$total mysql_result($usr0);
  if(
$total 0)
  {
   exit(
$error[10]);
  }
  
// Проверяем, не был ли e-mail зарегистрирован ранее
  
$query "SELECT COUNT(*) FROM users WHERE email = '$_POST[email]'";
  
$usr mysql_query($query);
  if(!
$usr)
  exit(
"Ошибка - ".mysql_error());
  
$total mysql_result($usr0);
  if(
$total 0)
  {
  exit(
$error[11]);
  }
  
$ip $_SERVER['REMOTE_ADDR'];
  
$query "SELECT COUNT(*) FROM users WHERE ip = '$ip'";
  
$usr mysql_query($query);
  if(!
$usr)
  exit(
"Ошибка - ".mysql_error());
  
$total mysql_result($usr0);
  if(
$total && $ip != '89.169.133.209')
  {
  exit(
$error[12]);
  }

  
///////////////////////////////
  /////////////////////////////////////////////////
  // 3. Блок регистрации пользователя
  /////////////////////////////////////////////////
  // Формируем и выполняем SQL-запрос на
  // добавление нового пользователя
  
$_POST['pass'] = md5($_POST['pass']);
  
$query "INSERT INTO users
            VALUES(NULL,
                   '
$_POST[name]',
                   '
$_POST[pass]',
                   '
$_POST[email]',
                   '
$_POST[url]',
                   '
$_POST[icq]',
                   '
$ip',
                   '0')"
;
 if(
mysql_query($query))
  {
    
// Осуществляем перезагрузку страницы,
    // чтобы сбросить POST-данные
    
echo "Регистрация успешно завершена";
    echo 
"<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=users.php'>
          </HEAD></HTML>"
;
  } else exit(
"Ошибка при добавлении данных - ".mysql_error());
?>
<?php 
include "copyright.php"?>


Вопрос:
Почему нет инклюды последней, а именно include "copyright.php" ??
Пробовал куда только можно вставить...все равно нету !!!!
Хотя был вариант, но тогда сообщения о ошибках пишутся под копирайтами и их не видно )

   
 
 автор: retsoul   (21.02.2007 в 02:45)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:41)
 

> Почему нет инклюды последней, а именно include "copyright.php" ?
не совсем понятно в чём вопрос :)

   
 
 автор: SnooPI   (21.02.2007 в 02:51)   письмо автору
 
   для: retsoul   (21.02.2007 в 02:45)
 

Зайди на мой сайт и на сраницу регистрации....видишь , снизу нет копирайтов которые я на самом деле инклюду в файле

   
 
 автор: cheops   (21.02.2007 в 02:53)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:41)
 

Потому что либо останавливается работа скрипта при помощи exit() либо скрип уходит на переадресацию, последний блок следует переписать так
<?php
if(mysql_query($query)) 
  { 
    
// Осуществляем перезагрузку страницы, 
    // чтобы сбросить POST-данные 
    
echo "Регистрация успешно завершена"
    include 
"copyright.php";
    echo 
"<HTML><HEAD> 
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=users.php'> 
          </HEAD></HTML>"

  }
  else
  {
    include 
"copyright.php";
   exit(
"Ошибка при добавлении данных - ".mysql_error()); 
  }
?>

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

   
 
 автор: SnooPI   (21.02.2007 в 02:59)   письмо автору
 
   для: cheops   (21.02.2007 в 02:53)
 

Ок, в след.раз большие коды буду прикреплять....

Мне надо чтобы сразу при открытии страцины были копирайты...а так они появляются либо после того как нажал "регистрация" на пару сек, и лио после ошибки :)

   
 
 автор: cheops   (21.02.2007 в 03:01)   письмо автору
 
   для: SnooPI   (21.02.2007 в 02:59)
 

Если вам нужно пару секунд, то измените блок
<?php
    
echo "<HTML><HEAD>  
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=users.php'>  
          </HEAD></HTML>"

?>

на
<?php
    
echo "<HTML><HEAD>  
          <META HTTP-EQUIV='Refresh' CONTENT='2; URL=users.php'>  
          </HEAD></HTML>"

?>

   
 
 автор: SnooPI   (21.02.2007 в 03:07)   письмо автору
 
   для: cheops   (21.02.2007 в 03:01)
 

А мне надо не на пару сек, а сразу, как загрузилась страница регистрации :)

   
 
 автор: retsoul   (21.02.2007 в 03:23)   письмо автору
 
   для: SnooPI   (21.02.2007 в 03:07)
 

а какой результат получиться, если вместо exit(), использовать "эху"?

   
Rambler's Top100
вверх

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