| |
|
|
| | Опять проблемы с сессиями :(
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
Тот кто последний в списке за того "как-будто залогиниваюсь" ))
Странно...
Думаю вы поняли :)
Объясните что да как и где сессии может надо закырть или еще чего-нибудь[ | |
| |
|
|
| |
|
|
| |
для: SnooPI
(20.02.2007 в 23:52)
| | | В чём вопрос? | |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 00:16)
| | | Вопрос: как это пофиксить.....
Ну вот зайдите пожалуйста по этой ссылке, введите данные(login= test, pass= test )в форму для авториации, после этого нажмите на меню "Пользователи" и нажмите там на любого.....
И вот.....вы увидели баг | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 01:30)
| | | Хм... что-то ничего не заметил, однако так бывает, если где-то в блоке if() вместо знака равенства == по ошибке поставлен знак присваивания =. | |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 01:43)
| | | Вы ничего не заметили т.к. ваш ник в списке пользователей последний !!!!
Зайдите под логином и паролем тест !!
:) | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 01:46)
| | | странно это
как происходит определение юзера при залогинивание и перемещению по ссылкам сайта?
такое ощущение, что данные запрашиваются каждый раз и выбирается именно последняя учётная запись... | |
| |
|
|
| |
|
|
| |
для: 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> <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 : <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");
?>
|
| |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 01:54)
| | | В приведённом коде явных ошибок не заметил.
Но заметил интересную особенность на сайте. Она заключается в том, что при запросе урл http://.../users переменная сессии впорядке, но при обновлении этой страницы имя в переменной сесии меняется, значит, что переименование переменной $_SESSION['name'] происходит при выводе таблицы пользователей и получает значение последней записи. | |
| |
|
|
| |
|
|
| |
для: retsoul
(21.02.2007 в 02:19)
| | | Не понял тебя :)
Так чтоже надо сделать.... | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 02:21)
| | | дело у тебя там в том, что каким-то образом происходит замена переменной, хранимой в сессии, не знаю, какой скрипт работает по этому запросу -> http://www.snoopi.org/users но изменение имени залогиненого пользователя происходит именно там, достаточно не нажимать имен пользователей, а просто обновить страницу браузера, чтобы увидеть как меняется переменная | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 01:46)
| | | Нужно код смотреть... если надумаете его выкладывать, лучше прикреплять его в виде архива. | |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 01:52)
| | | Этого достаточно? :) | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 02:17)
| | | Я тоже ошибок не вижу - везде чисто. retsoul двумя постами выше нашёл закономерность, приведите кусок кода, который выводит таблицу пользователей. | |
| |
|
|
| |
|
|
| |
для: 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> <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($url, 0, 15);
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();
?>
|
| |
| |
|
|
| |
|
|
| |
для: 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
|
| |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 02:22)
| | | вопрос:
Переменная $_SESSION['name'] может заменяться локальной переменной $name, которая используется в цикле? | |
| |
|
|
| |
|
|
| |
для: retsoul
(21.02.2007 в 02:27)
| | | Если директива register_globals включена - запросто. | |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 02:30)
| | | значит причина (почти) найдена :) | |
| |
|
|
| |
|
|
| |
для: retsoul
(21.02.2007 в 02:27)
| | | оО спасибо вам большое !!!!!!!
Биг респект ))
А вот проблемка))
куки....как сделать куки при авторизации | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 02:32)
| | | Под новые вопросы лучше заводить новые темы. | |
| |
|
|
| |
|
|
| |
для: 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> </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_array( strtolower($_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']) < 5 || 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($usr, 0);
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($usr, 0);
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($usr, 0);
if($total > 0 && $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" ??
Пробовал куда только можно вставить...все равно нету !!!!
Хотя был вариант, но тогда сообщения о ошибках пишутся под копирайтами и их не видно ) | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 02:41)
| | | > Почему нет инклюды последней, а именно include "copyright.php" ?
не совсем понятно в чём вопрос :) | |
| |
|
|
| |
|
|
| |
для: retsoul
(21.02.2007 в 02:45)
| | | Зайди на мой сайт и на сраницу регистрации....видишь , снизу нет копирайтов которые я на самом деле инклюду в файле | |
| |
|
|
| |
|
|
| |
для: 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 Такие здоровые листинги лучше прикреплять в виде файла, иначе тема быстро разрастается и в неё заглядывает мало народу, следовательно и шанс получить ответ резко уменьшается. | |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 02:53)
| | | Ок, в след.раз большие коды буду прикреплять....
Мне надо чтобы сразу при открытии страцины были копирайты...а так они появляются либо после того как нажал "регистрация" на пару сек, и лио после ошибки :) | |
| |
|
|
| |
|
|
| |
для: 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>";
?>
|
| |
| |
|
|
| |
|
|
| |
для: cheops
(21.02.2007 в 03:01)
| | | А мне надо не на пару сек, а сразу, как загрузилась страница регистрации :) | |
| |
|
|
| |
|
|
| |
для: SnooPI
(21.02.2007 в 03:07)
| | | а какой результат получиться, если вместо exit(), использовать "эху"? | |
| |
|
|