|
автор: грант (15.07.2004 в 17:22) |
|
| Я только начинаю. Подскажите, плиз, как можно сделать авторизацию на PHP? Т.е., чтоб не пользоваться стандартными средствами Апача, а написать собственный скрипт.
-----------------------
p.s. У вас очень хороший форум, много разных вопросов задавал на других форумах и как правило одно и тоже - либо читать man, либо рожей в грязь. У вас такого нет - спасибо большое за это. Кроме того, спасибо за ДЕЙСТВИТЕЛЬНО работающие скрипты - тоже редко где встретишь.
p.s.2 Вопросов у меня было много, но на многие свои вопросы я уже нашел подробные ответы в других топиках форума. | |
|
|
|
|
|
|
|
для: грант
(15.07.2004 в 17:22)
| | Хм давайте начнём с простого примера, а вы скажите достаточно этого или нужно что-то более мощное.
Для начала сделаем HTML-форму и поместим её в файл index.php:
<form action=handler.php method=post>
Имя посетителя : <input type=text name=name><br>
Пароль : <input type=password name=password><br>
<input type=submit value=Отправить>
</form>
|
HTML-форма имеет два поля: текстовое поле для имени посетителя, а так же поле типа password для ввода пароля. Кроме того, в форме присутствует кнопка, позволяющая отправить обработчику handler.php данные из формы.
В обработчике handler.php необходимо сверить полученные данные с именем посетителя и его паролем
<?php
// Здесь следует поместить код, например, извлекающий пароль
// и имя посетителя из базы данных, и помещающий их в переменные
// $password и $name, соответственно.
// ...
// если хеш-коды совпадают, авторизация прошла успешно
if ($_POST['password'] == $password && $_POST['name'] == $name) echo "Hello, $name";
else echo "Введен неправильный пароль";
?>
|
Следующим логическим шагом будет сохранение предварительно зашифрованного пароля в cookie, чтобы посетитель один раз авторизовавшись мог потом некоторое время не вводить пароль. Если хотите, можем рассмотреть и этот вариант.
PS Спасибо на добром слове :) мы как раз и хотели сделать форум, где люди могли бы получить ответ, а не наставления. Меня тоже раздражает стиль новолинуксоидов... ведь сетевое сообщество ещё несколько лет назад было очень дружелюбно к новичкам :((( | |
|
|
|
|
автор: грант (15.07.2004 в 18:23) |
|
|
для: cheops
(15.07.2004 в 17:58)
| | А как поместить это в базу данных? Если не сложно, подскажите, а то требуют :( | |
|
|
|
|
|
|
|
для: грант
(15.07.2004 в 18:23)
| | Это зависит от числа посетителей, для которых создаётся система авторизации. Если посетитель один или несколько штук, то можно вручную создать таблицу и поместить туда несколько записей. Для этого, например, в клиенте mysql необходимов выполнить ряд SQL-запросов. Для создания таблицы user в базе данных test необходимо выполнить SQL-оператор CREATE:
CREATE TABLE users (
id_user INT NOT NULL auto_increment,
name TINYTEXT,
password TINYTEXT,
PRIMARY KEY (id_user)
) TYPE=MyISAM;
|
Теперь таблицу можно заполнить
INSERT INTO users VALUES(NULL,'user1','pass1');
INSERT INTO users VALUES(NULL,'user2','pass2');
INSERT INTO users VALUES(NULL,'user3','pass3');
|
В результате в таблице users будет 3 записи для посетителей user1, user2, user3 с паролями pass1, pass2, pass3, соответственно. Теперь обработчик формы можно переписать:
<?php
// Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
// сейчас выставлен сервер локальной машины
$dblocation = "localhost";
// Имя базы данных
$dbname = "test";
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
// у нас, например $dbuser = "softtime";
$dbuser = "root";
// Пароль - в комментариях не нуждается ;-)
$dbpasswd = "";
// Соединяемся с сервером базы данных
$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 users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo "Ошибка выполнения запроса";
exit();
}
// Если запрос вернул результат - производим дальнейшую обработку
if(mysql_num_rows($nme) > 0)
{
// Получаем пароль
$password = mysql_result($nme,0);
// Сравниваем пароль из базы данных и введённый посетителем
if ($_POST['password'] == $password) echo "Hello, $name";
else
{
echo "Ошибка идентификации: неправильный пароль";
exit();
}
}
// Если в результате запроса не получено ни одной
// строки - посетитель с таким именем не зарегистрирован
else
{
echo "Ошибка идентификации: посетитель не зарегистрирован";
exit();
}
?>
|
Если посетителей много, то следует организовать систему регистрации, примерно, как у нас на форуме - тогда база данных будет заполнена самими посетителями... | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 19:20)
| | А как к этому скрипту сессии прикрутить? | |
|
|
|
|
|
|
|
для: Shady
(07.08.2004 в 13:21)
| | Можно... постараюсь сегодня ближе к вечеру выложить здесь такой скрипт... | |
|
|
|
|
|
|
|
для: Shady
(07.08.2004 в 13:21)
| | Вот форма для ввода имени посетителя и пароля (index.php):
<?php
// Это файл index.php
session_start();
?>
<form action=handler.php method=post>
Имя посетителя : <input type=text name=name value=<?php echo $_SESSION['user']; ?>><br>
Пароль : <input type=password name=password value=<?php echo $_SESSION['password']; ?>><br>
<input type=submit value=Отправить>
</form>
<?php
// Если посетитель "вошёл" - приветствуем его
if(isset($_SESSION['user'])) echo "Здравствуйте, ".$_SESSION['user']."!";
?>
|
Обработчик данной формы должен выглядеть следующим образом (handler.php):
<?php
// Это файл handler.php
// Имя сервера базы данных, например $dblocation = "mysql28.noweb.ru"
// сейчас выставлен сервер локальной машины
$dblocation = "localhost";
// Имя базы данных
$dbname = "test";
// Имя пользователя... Скорее всего будет совпадать с вашим доменным именем
// у нас, например $dbuser = "softtime";
$dbuser = "root";
// Пароль - в комментариях не нуждается ;-)
$dbpasswd = "";
// Соединяемся с сервером базы данных
$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 users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo mysql_error();
echo "Ошибка выполнения запроса";
exit();
}
// Если запрос вернул результат - производим дальнейшую обработку
if(mysql_num_rows($nme) > 0)
{
// Получаем пароль
$password = mysql_result($nme, 0);
// Сравниваем пароль из базы данных и введённый посетителем
if ($_POST['password'] == $password)
{
// Идентификация прошла успешно - осуществляем
// "вход" посетителя. Для того, чтобы в течении текущей
// сесси посетитель не вводил своё имя пароль повторно -
// передаём их через сессию
if(session_start())
{
$_SESSION['user'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
// Осуществляем автоматический переход на
// страницу index.php чтобы убедится, что
// посетитель "вошёл"
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD><body>";
}
}
else
{
echo "Ошибка идентификации: неправильный пароль";
exit();
}
}
// Если в результате запроса не получено ни одной
// строки - посетитель с таким именем не зарегистрирован
else
{
echo "Ошибка идентификации: посетитель не зарегистрирован";
exit();
}
?>
|
| |
|
|
|
|
автор: pavlik (24.09.2004 в 19:39) |
|
|
для: cheops
(07.08.2004 в 16:36)
| | не могли бы вы мне помочь.. я сделал авторизацию с сессией, и когда ввожу правильный пароль меня перекидывает снова на страницу авторизации...
и вот самое главное =)
есть база в sql, в ней 5 таблиц, таблица с предметами (предмет и id предмета) , таблица с информацией об учащемся (id учащегося, имя, фамилия и т.д.), таблица с id и pass, успеваемость текущая (код предмета, id ученика, оценка и дата оценки) и успеваемость итоговая ..
теперь мне надо сделать, чтобы пользователь вводил свой пароль и попадал на страничку, где отображалась успеваемость? а успеваемость выводилась из поля с таблицой успеваемости. выводилось определенное поле, сообтветствующее ID пользователя.
подскажите, как это сделать =)
заранее спасибо, павел. | |
|
|
|
|
|
|
|
для: pavlik
(24.09.2004 в 19:39)
| | вот,я когда-то писал авторизацию,прикрепил архив в аттаче... | |
|
|
|
|
автор: pavlik (24.09.2004 в 20:22) |
|
|
для: LimP
(24.09.2004 в 20:05)
| | ну это не совсем то, что мне надо =) пользователей никаких нет. у меня успеваемость класса. кол-во учащихся определено и надеюсь не изменится до конца года =) мне просто надо сделать, чтобы выводилась успеваемость учащегося из базы с успеваемостью.. =) | |
|
|
|
|
|
|
|
для: pavlik
(24.09.2004 в 19:39)
| | Если я вас правильно понял, то делается это примерно так:
Простенький запрос типа такого: "SELECT mark FROM tableName WHERE id=$id AND codPredmeta = $cod". Получаем оценку для определенного юзера и определенного предмета, если нужно для всех предметов, то "AND codPredmeta = $cod" не надо писать. | |
|
|
|
|
автор: pavlik (24.09.2004 в 23:38) |
|
|
для: Igorek
(24.09.2004 в 20:37)
| | не подскажете еще как сделать, чтобы после успешной авторизации человека перебрасывало на страницу с успеваемостью ? =) | |
|
|
|
|
|
|
|
для: pavlik
(24.09.2004 в 23:38)
| | После того как закончили обработку можете написать вот так
<?
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=newpage.php'>
</HEAD></HTML>";
?>
|
| |
|
|
|
|
|
|
|
для: pavlik
(24.09.2004 в 23:38)
| | В участке кода
<?php
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD><body>";
?>
|
Вместо index.php пропишите адрес страницы с успеваемостью... | |
|
|
|
|
|
|
|
для: cheops
(07.08.2004 в 16:36)
| | pri popitke vipolnit' etot script voznikaet nechto vrode etogo:
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /home2/p/ptk2001.h12.ru/WWW/login.php:21) in /home2/p/ptk2001.h12.ru/WWW/login.php on line 22
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home2/p/ptk2001.h12.ru/WWW/login.php:21) in /home2/p/ptk2001.h12.ru/WWW/login.php on line 22
s chem bi eto moglo bit' sviazano? | |
|
|
|
|
|
|
|
для: eladan
(07.11.2004 в 17:32)
| | Это значит, что до вызова session_start() имеется вывод в окно браузера, которое заставляет отослать заголовки до того, как интерпретатор доберётся до session_start(). Так как заголовки уже отосланы сессии не инициализируются. Функция session_start() должна быть расположена до любого вывода в окно браузера операторами echo, print и просто HTML-тэгов. | |
|
|
|
|
автор: Guest (05.04.2005 в 23:25) |
|
|
для: cheops
(07.08.2004 в 16:36)
| | Помогите please! Приведённый пример не работает! Уже устал бться с авторизацией, если не поможете разобью комп чесн. слово | |
|
|
|
|
|
|
|
для: Guest
(05.04.2005 в 23:25)
| | Давайте новую тему заведём, а то эта уже очень длинная - здесь просто не удобно разбираться что к чему.
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=3206 | |
|
|
|
|
|
|
|
для: грант
(15.07.2004 в 17:22)
| | Имеется Windows2000Professional SP4, установлен пакет Денвер-2 (Apache 1.3.27, PHP Version 4.3.6).
______________________________________________
Пытаюсь сделать авторизацию пользователей, используя механизм сессий, следующим образом (на базе найденного мной примера):
Есть, три файла:
1 -- reg1.php (выводит форму, для ввода пароля и логина и методом POST передаёт, введённый в поле формы пароль и логин для обработки, скрипту, находящемуся в файле authorize.php )
<html>
<link rel="stylesheet" href="c/f.css" type="text/css">
<title>Введите пароль</title>
</head>
<body>Введите логин и пароль. <br>
<form action="authorize.php" method="post">
Логин:<input type="text" name="user_name"><br>
Пароль:<input type="password" name="user_pass"><br>
<input type="Submit" name="Submit" value="Îê">
</form>
</body>
</html>
|
2 -- authorize.php (сравнивает переданный формой пароль и логин с "правильным" паролем и логином и, либо выраёт ошибку, либо переключает на приватную страничку)
<?php
session_start();
if($Submit){
if(($user_name=="1")&&($user_pass=="1")){
$logged_user=$user_name;
exit;
}
}
?>
<html><body>
Вы ввели неверный пароль!
</body></html>
|
3 -- secretplace.php (страничка, для избранных)
<?php
// открываем сессию
session_start();
if(!isset($logged_user)){
header("Location: reg1.php");
exit;
}
echo"<html>
<body>
какой-то текст
</body>
</html>"?>
|
register_globals -- on
__________________________________________
Теперь проблема.
При вводе неверного пароля, скрипт выводит надпись, что, введён неверный пароль.
А, при вводе правильного пароля, переключает на файл secretplace.php, и выдаёт, следующее (см. двумя постами выше):
--------------------------------------------------------------------------------
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at z:\home\test2.ru\www\secretplace.php:2) in z:\home\test2.ru\www\secretplace.php on line 4 Warning: session_start():
Cannot send session cache limiter - headers already sent (output started at z:\home\test2.ru\www\secretplace.php:2) in z:\home\test2.ru\www\secretplace.php on line 4 òèïà íàäïèñü êàêàÿ-òî.
-----------------------------------------------------------------------------------
В, чём, может быть пролема?
В, коде?
В настройках Apache, либо PHP?
Помогите разобраться. | |
|
|
|
|
|
|
|
для: Hemp
(08.12.2004 в 10:06)
| | Проблема в коде. Это стандартная ошибка у новичков типа меня. А вот найти ошибку очень сложно, потому что она не синтаксическая, по крайней мере у меня сложилось такое впечатление. Характер ошибки кроется где-то в структуре файла РНР. У меня получалось устранить эту ошибку только перписыванием файла по-новому. | |
|
|
|
|
|
|
|
для: coloboc66
(08.12.2004 в 10:36)
| | Извиняюсь, файл authorize.php, не верно, выложил. Он, должен выглядеть так:
<?php
session_start();
if($Submit){
if(($user_name=="1")&&($user_pass=="1")){
$logged_user=$user_name;
session_register("logged_user");
header("Location: secretplace.php");
exit;
}
}
?>
<html><body>
Вы ввели неверный пароль!
</body></html>
|
А, проблема осталась..... | |
|
|
|
|
|
|
|
для: Hemp
(08.12.2004 в 10:52)
| | Не знаю, в этом ли причина твоей ошибки, но у тебя в файле authorize.php сеессия запускается два раза: session_start(); и session_register("logged_user");
,а так делать нельзя. Попробуй убрать session_start();
И еще: если ты сессию запустил, то по окончании работы тебе необходимо разрегистрировать переменные session_unregister("logged_user"); а затем закрыть сессию session_destroy(); | |
|
|
|
|
|
|
|
для: coloboc66
(08.12.2004 в 12:06)
| | Не помогло, да, и не могло помочь, т.к.
session_start(); -- проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.
Сессия, у меня не была создана, до этого момента (authorize.php), поэтому, её нужно создавать, с помощью функции session_start();
Регистрация переменных сессии осуществляется при помощи функции session_register:
session_register("logged_user"); -- здесь, я регистрирую переменную сессии logged_user, которая имет в данном случае значение 1
Параметр register_globals включен. | |
|
|
|
|
|
|
|
для: Hemp
(08.12.2004 в 12:30)
| | Хм... судя по предупреждениям session_start() у вас в 4 строке, а во второй какой-то вывод в окно браузера - это тот же самый файл и нет ли перед тэгом <?php пробелов или пустых строк? | |
|
|
|
|
|
|
|
для: cheops
(08.12.2004 в 12:48)
| | cheops
Спасибо! Заработало!!!!
Удалил, пробел, перед тегом <?php, написал, его, как <?. И, во второй строке, удалил заремкованную запись. | |
|
|
|
|
|
|
|
для: Hemp
(08.12.2004 в 13:23)
| | А что, нельзя перед <php ставить пробелы или пустые строки ? А почему? | |
|
|
|
|
|
|
|
для: coloboc66
(08.12.2004 в 14:38)
| | Если происходит работа с cookies, session или отправляются какие-либо другие заголовки, то нельзя, так как пробел воспринимается как начала HTML-документа, после отправки которого заголовки послать уже невозможно. | |
|
|
|