|
|
|
| Здравствуйте еще раз. =)
Я к вам с новым вопросом (предидущую проблему пришлось отложить до лучших времен, т.к. для нее сначала хорошо бы сделать авторизацию).
Вобщем, я предполагала сделать на сайте возможность авторизации для юзеров с разными правами. Допустим, я, как админ, и мои соадмины, при заходе под своими логином и паролем, имели возможность прямо с сайта добавлять новости, выгружать статьи, файлы и т.п.; те, кому я поручала работу над какой-то определенной областью сайта имели меньшие права, и только в отведенной им области; зарегистрированные участники, которым я дала привилегии, могли бы скачивать какие-то бонусы, а просто зарегистрированные так же имели возможности, отличные от возможностей гостей. (ну, возможно это уже в перспективе, для начала просто админского и юзерского доступа хватило бы)).
Имеется база данных, в одной таблице которых есть поля: id (автоматически прибавляющееся на единицу), name, pass и rights (в котором проставлялись бы права одной буквой, скажем "a" для админа и т.п.)
Доступ планирую сделать на сессиях и куках, т.е. чтобы как на форумах допустим - при заходе и наличии куки сразу идентифицировался юзер, если куки нет - она бы ставилась, если юзер ввел верные лог и пароль, а если куки запрещены и вообще в пределах одного посещения сайта работали бы сессии.
Вобщем, полазив по вашему форуму (кстати, форум у вас действительно супер! Ни в одном учебнике столько не находила, сколько у вас)), я кое-как смогла настроить следующий код:
Ну конечно же форма авторизации:
<html><body>
<form action=handler.php method=post>
Имя посетителя : <input type=text name=name><br>
Пароль : <input type=password name=password><br>
<input type=checkbox name=auth>
входить автоматически<br>
<input type=submit value=Отправить>
</form>
</html></body>
|
<?
session_start();
$name_a = $_POST['name'];
$pass_a = $_POST['password'];
$auth_a = $_POST['auth'];
$server="localhost";
$user="";
$password="";
$database="";
if(!mysql_connect($server, $user, $password))
{echo "<p>Ошибка!</p>"; exit;}
mysql_select_db($database);
$query = mysql_query("select pass, name, id, rights from users");
$fetch_auth = mysql_fetch_array($query);
$pass = $fetch_auth[pass];
$name = $fetch_auth[name];
if ($name_a == $name && $pass_a == $pass) {
echo "Приветствуем вас, $name";}
else {echo "Неправильный пароль.";}
?>
|
Вопрос в следующем: как к этому прицепить куки и сессии? о_О
Сразу предупреждаю: я еще полный чайник и о пхп узнала только 10 дней назад, но стараюсь учиться максимально быстро, и была бы благодарна любой помощи в постижении этого таинственного и манящего мира программирования... ^_^ | |
|
|
|
|
|
|
|
для: Zew
(04.09.2005 в 22:19)
| | Попадалась ли вам вот эта тема http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=80, если попадалась, то какие трудности возникают? | |
|
|
|
|
|
|
|
для: cheops
(05.09.2005 в 01:31)
| | Хм.. у вас уже даже session_start(); имеется, т.е. для того, чтобы зарегистрировать имя в сессии достаточно испрвить блок
<?php
if ($name_a == $name && $pass_a == $pass) {
echo "Приветствуем вас, $name";}
else {echo "Неправильный пароль.";}
?>
|
следующим образом
<?php
if ($name_a == $name && $pass_a == $pass)
{
$_SESSION['name'] = $name;
echo "Приветствуем вас, $name";
}
else
{
echo "Неправильный пароль.";
}
?>
|
А затем на каждой странице просто проверять определена ли переменная $_SESSION['name']
<?php
if(isset($_SESSION['name']))
{
echo "Доступ";
}
else
{
echo "Пройдите авторизацию";
}
?>
|
Так как сессия хранится на сервере, подделка их практически исключена, но идентификатор сессии может быть украден http://www.softtime.ru/info/articlephp.php?id_article=36 | |
|
|
|
|
|
|
|
для: Zew
(04.09.2005 в 22:19)
| | >>Ни в одном учебнике столько не находила, сколько у вас
Всё в учебник сложно включить, так как над ним работает меньше человек чем над форумом и объём его ограничен - в настоящий момент OffLine-версия данного форума скомпилированная в chm-формат занимает 12 Мб. | |
|
|
|
|
|
|
|
для: cheops
(05.09.2005 в 01:41)
| | Спасибо большое всем, уже кое-что получилось. =) Но с куками что-то я не совсем поняла...
Во-первых, должно ли session_start располагаться вообще в самом верху страницы, или только в самом начале пхп-кода? Т.е. может ли выше находиться ХТМЛ?
И вот сейчас у меня такой код:
<?
session_start();
$s = $_GET[s];
$server="localhost";
$user="";
$password="";
$database="";
if(!mysql_connect($server, $user, $password))
{echo "<p>Ошибка базы данных</p>"; exit;}
mysql_select_db($database);
$query = mysql_query("select pass, name, id, rights from users");
$fetch_auth = mysql_fetch_array($query);
$pass = $fetch_auth[pass];
$name = $fetch_auth[name];
if(isset($_COOKIE['cookie'])){
$name_c = $cookie[name];
$pass_c = $cookie[pass];
if ($name_c == $name && $pass_c == $pass){
$_SESSION['name'] = $name;}
else{
echo "<br><form action='index.php?s=1' method=post>
Имя посетителя : <input type=text name=name><br>
Пароль : <input type=password name=password><br>
<input type=submit value=Отправить>
</form>";}
}
if ($s == 1){
$name_a = $_POST["name"];
$pass_a = $_POST["password"];
if ($name_a == $name && $pass_a == $pass){
$_SESSION["name"] = $name;
SetCookie("cookie","$name $pass",time()+604800);
echo "Приветствуем вас, $name";}
else {echo "Неверный пароль";}
}
?>
|
И он конечно же не работает в таком виде. )) *до этого пробывала так же на одинх сессиях без кукисов, и вроде как все работало без ошибок, но тот вариант кода я не догадалась сохранить и сразу начала переделывать*
Ошибка кажется вот в этой части:
if(isset($_COOKIE['cookie'])){
$name_c = $cookie[name];
$pass_c = $cookie[pass];
if ($name_c == $name && $pass_c == $pass){
$_SESSION['name'] = $name;}
else{
echo "<br><form action='index.php?s=1' method=post>
Имя посетителя : <input type=text name=name><br>
Пароль : <input type=password name=password><br>
<input type=submit value=Отправить>
</form>";}
}
|
А конкретно, я не совсем понимаю, как получить из куки значения переменных обратно? )) | |
|
|
|
|
|
|
|
для: Zew
(05.09.2005 в 13:58)
| | session_start() можно помещать в любом месте программы, но до вывода любой информации в окно браузера (включая пробелы и переводы строк). Не очень понятно почему используется сессия и куки одновременно - обычно прибегают только к одному из способов. Для того, чтобы получить значение из cookie следует просто обратится к соотвествующему элементу массива $_COOKIE - если cookie установлена - значение в массиве будет доступно на любой странице сайта. | |
|
|
|
|
|
|
|
для: cheops
(05.09.2005 в 19:09)
| | >Не очень понятно почему используется сессия и куки одновременно
Ну, возможно я просто чего-то не понимаю, но вот допустим если у пользователя отключены куки, а у меня авторизация на них - как он будет перемещаться по сайту авторизованным? Не ставить же на каждой странице авторизацию.
А если только на сессиях, то когда человек следующий раз (допустим, завтра) зайдет на сайт - ему опять придется авторизовываться? Или я что-то недопонимаю просто?.. Мне бы так, чтобы раз авторизоваться, и можно было бы оставаться авторизованным везде, и не вводить пароль при каждом заходе. Ну как допустим на любом полноценном форуме. )) | |
|
|
|
|
|
|
|
для: Zew
(05.09.2005 в 19:31)
| | Если уникальный идентификатр сессии SID не передаётся методом GET, то он всё-равно передаётся через cookie - и сессия тоже может отказать. | |
|
|
|
|
|
|
|
для: cheops
(05.09.2005 в 19:51)
| | Хм, ну и как же лучше сделать тогда? Оставить только сессии, или приладить куки без сессий?.. | |
|
|
|
|
|
|
|
для: Zew
(05.09.2005 в 23:38)
| | Лучше остановится на сессиях, так как некоторые пользователи разрешают сессионные куки, но запрещают постоянные. | |
|
|
|
|
|
|
|
для: cheops
(05.09.2005 в 23:52)
| | А как в таком случае сделать, чтобы не приходилось авторизовываться при каждом заходе на сайт?.. Вот допустим кое-где я видела рядом с авторизацией чекбокс "запомнить". Как он устроен? | |
|
|
|
|
|
|
|
для: Zew
(06.09.2005 в 11:52)
| | В этом случае, помимо логина в сессию также помещают пароль, затем логин и пароль подставляют в форму авторизации при помощи атрибута value
<br><form action='index.php?s=1' method=post>
Имя посетителя : <input type=text name=name value='<?php echo $_SESSION['name']; ?>'><br>
Пароль : <input type=password name=password value='<?php echo $_SESSION['password']; ?>'><br>
<input type=submit value=Отправить>
</form>
|
| |
|
|
|
|
|
|
|
для: cheops
(06.09.2005 в 13:21)
| | хм, т.е. в этом случае пароль и логин просто будут печататься как значения по умолчанию? Но ведь это будет не автоматическая авторизация, если допустим человек зайдет на сайт через неделю? Как я поняла, тогда и эти переменные-то не получат значения, т.к. сессия будет уже сто раз как завершена, и там будет просто пусто, и человеку придется заново вводить свой лог и пароль (который мои форумцы то и дело забывают)... *_* | |
|
|
|
|
|
|
|
для: Zew
(07.09.2005 в 00:12)
| | Если важно запоминать логин и пароль на длительное время, следует прибегать к cookies. Как построен механизм авторизации? Мы же не знаем, что вы разрабатываете, например, на форуме этот механизм очень даже подходит и не вызывает неудобств у посетителя. Если необходимо получать доступ закрытой системе сайта - это другой вопрос - здесь следует редактировать не форму, а механизм авторизации. | |
|
|
|
|
|
|
|
для: cheops
(07.09.2005 в 00:49)
| | Ну, вообще-то это должен быть просто сайт, но т.к. на сайте у меня выложен довольно большой объем "народного творчества", то мне было бы очень удобно, если бы сами они могли выкладывать свои работы на сайте через вебинтерфейс, ну и естественно чтобы каждый имел доступ только к своей области сайта, которую я им позволю. Плюс я и мои соадмины могли бы публиковать новости скажем с той же главной страницы, но возможность такая появлялась бы только при авторизации под админским логом и паролем.
Вот для этого мне и нужна авторизация - из базы берется лог, пароль и права доступа, а собственно авторизация - только первый шаг разработки этого всего вышеперечисленного. В принципе, не так сложно ввести заново лог и пароль, но все же хотелось бы нормальные условия, а не авторизироваться каждый раз, когда нужно заглянуть на сайт... | |
|
|
|
|
|
|
|
для: Zew
(07.09.2005 в 08:48)
| | Тогда можно в cookie прописать пароль и логин, а от сессий вообще отказаться - $_COOKIE тоже является суперглобальным массивом и будет доступен на любой странице
<?php
if(isset($_COOKIE['cookie']))
{
$name_c = $_COOKIE[name];
$pass_c = $_COOKIE[pass];
if ($name_c != $name || $pass_c != $pass)
{
echo "<br><form action='index.php?s=1' method=post>
Имя посетителя : <input type=text name=name><br>
Пароль : <input type=password name=password><br>
<input type=submit value=Отправить>
</form>";
}
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.09.2005 в 13:17)
| | Спасибочки. =) А как в куку запихнуть два значения? Т.е. нужно так:
SetCookie("login","$name",time()+604800);
SetCookie("password","$pass",time()+604800);
|
или так:
SetCookie("login","$name $pass",time()+604800);
|
?
Апдейт:
Вот сейчас для теста попробывала вот такой скрипт, чтобы вывести значение из куки:
<?
if ($name_a == $name && $pass_a == $pass){
SetCookie("login","$name $pass",time()+604800);
echo "Приветствуем вас, $name <br>";
$rfds = $_COOKIE[name];
echo $rfds;
}
else {echo "Неверный пароль. }
?>
|
Авторизуется нормально, выводится "приветствуем вас", но значение куки не выводится ни в каком виде, т.е. как я не пробывала - $_COOKIE[name], $_COOKIE[login], $_COOKIE["name"] - бесполезно. Видимо, эта кука просто не устанавливается.
Скажите, в чем может быть ошибка в этом коде?
<?
$server="localhost";
$user="";
$password="";
$database="";
if(!mysql_connect($server, $user, $password))
{echo "<p>Ошибка базы данных</p>"; exit;}
mysql_select_db($database);
$query = mysql_query("select pass, name, id, rights from users");
$fetch_auth = mysql_fetch_array($query);
$pass = $fetch_auth[pass];
$name = $fetch_auth[name];
$name_a = $_POST["name"];
$pass_a = $_POST["password"];
if ($name_a == $name && $pass_a == $pass){
SetCookie("login","$name $pass",time()+604800);
// Аналогично: SetCookie("login","$name",time()+604800);
// SetCookie("password","$pass",time()+604800);
echo "Приветствуем вас, $name <br>";
}
else {echo "Неверный пароль.";}
?>
|
| |
|
|
|
|
|
|
|
для: Zew
(07.09.2005 в 17:25)
| | Нужно так
SetCookie("login","$name",time()+604800);
SetCookie("password","$pass",time()+604800);
|
| |
|
|
|
|
|
|
|
для: cheops
(07.09.2005 в 20:29)
| | Эх, не работает... *_* в чем ошибка не пойму... =( | |
|
|
|
|
|
|
|
для: Zew
(07.09.2005 в 22:53)
| | А что-нибудь пишет? Какие-нибудь предупреждения? | |
|
|
|
|
|
|
|
для: cheops
(07.09.2005 в 20:29)
| |
<?
SetCookie("login","$name",time()+604800);
SetCookie("password","$pass",time()+604800);
?>
|
так устанавливается кука, а выводится так
<?
echo $_COOKIE['login'];
echo $_COOKIE['password'];
?>
|
соответственно. (была у меня похожая проблемка как-то раз, с индифекаторами путоница) | |
|
|
|
|
|
|
|
для: Niemand
(08.09.2005 в 04:31)
| | Все равно почему-то не работает. Никаких ошибок не выдается, но и значения куки тоже не выводится. Т.е. она видимо просто не устанавливается.. *_*
Может кроме setcookie должно быть еще что-то, чтобы установить куку?..
А может просто у меня они не работают... попробуйте кто-нибудь авторизоваться здесь: http://ect.hellsinguniverse.ru/index3.php
лог - test
пароль - test
Сразу после авторизации, там, где три единицы пропечатываются, должно появиться то, что записалось в куки. Незнаю, может это у меня куки не принимаются просто, хотя вроде полностью разрешены все и везде принимались... | |
|
|
|
|
|
|
|
для: Zew
(08.09.2005 в 12:05)
| | Что-то я вообще этих cookie у себя на машине найти не могу - прикрепите пожалуйста этот файл к своему сообщению, чтобы мы могли потестировать на локальной машине. | |
|
|
|
|
 1.4 Кб |
|
|
для: cheops
(08.09.2005 в 12:36)
| | Хех, я их тоже пыталась найти, и аналогично не нашла. Ок, прикрепляю. | |
|
|
|
|
|
|
|
для: Zew
(08.09.2005 в 12:50)
| | cookie не могут быть установлены в таком скрипте, хотя бы из-за того, что в начале идёт блок
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
|
Так как cookie ставятся через HTTP-заголовки отослать их не представляется возможным, так как HTTP-заголовки отправляются в обязательном порядке до тела документа. | |
|
|
|
|
|
|
|
для: cheops
(08.09.2005 в 17:16)
| | Ааа, тогда понятно. Но как же в таком случае быть, если мне не нужно устанавливать куку в самом начале, а только после авторизации?.. | |
|
|
|
|
|
|
|
для: Zew
(08.09.2005 в 21:24)
| | Можно поместить весь вывод в буфер, при помощи функций управления выводом. В конце страницы - вывести всю информацию оптом. О том как это сделать можно почитать в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=148. | |
|
|
|
|
|
|
|
для: cheops
(09.09.2005 в 00:14)
| | Хм, а не может быть так, что на сервере просто эти куки не разрешены? Что я только не пробывала, но не работают даже простейшие скрипты из вашего учебника. Вот этот например:
<?
$counter++;
setcookie("counter",$counter,mktime(0,0,0,01,25,2090));
echo("Вы посетили эту страницу $counter раз");
?>
|
Точнее, он работает, но если закрыть браузер, отсчет начинается с единицы, а куки в папке как небыло, так и нет... *_*
ЗЫ: сайт мой лежит на www.sweb.ru и вроде как там все должно поддеживаться (уж за 80 баксов в год должно бы, во всяком случае). | |
|
|
|
|
|
|
|
для: Zew
(10.09.2005 в 17:28)
| | Уменьшите год хотя бы до 2010 - вы просто переходите за границу типа - максимальный год 2038 - при этом кука устанавливается как сессионая, т.е. её время жизни ограничено временем сеанса. Подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=149 | |
|
|
|
|
|
|
|
для: cheops
(10.09.2005 в 20:28)
| | Результат тот же - куки на месте нет... *_* | |
|
|
|
|
|
|
|
для: Zew
(10.09.2005 в 21:43)
| | Странно у меня этот код работатет на ура - после закрытия браузера - число стартует с последнего значения - у вас разрешено в браузере установка несессионных кук? | |
|
|
|
|
|
|
|
для: cheops
(10.09.2005 в 21:53)
| | Ну число-то у меня тоже стартует правильно. Но это если просто обновлять страницу. А если закрыть ее вместе с браузером - все, отсчет начинается с начала.
Куки разрешены все, и в папке с куками их несколько десятков... А собственный не устанавливается... *_* | |
|
|
|
|
|
|
|
для: Zew
(10.09.2005 в 21:56)
| | Тьфу, звиняйте, видимо это был глюк или браузера или моего изношенного винда - вышла, перезагрузилась, попробывала еще раз, и теперь кука на месте. =)
Спасибо еще раз. ^_~ | |
|
|
|