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

Форум PHP

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

 

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

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

тема: Авторизация на PHP
 
 автор: грант   (15.07.2004 в 17:22)
 
 

Я только начинаю. Подскажите, плиз, как можно сделать авторизацию на PHP? Т.е., чтоб не пользоваться стандартными средствами Апача, а написать собственный скрипт.
-----------------------
p.s. У вас очень хороший форум, много разных вопросов задавал на других форумах и как правило одно и тоже - либо читать man, либо рожей в грязь. У вас такого нет - спасибо большое за это. Кроме того, спасибо за ДЕЙСТВИТЕЛЬНО работающие скрипты - тоже редко где встретишь.
p.s.2 Вопросов у меня было много, но на многие свои вопросы я уже нашел подробные ответы в других топиках форума.

   
 
 автор: cheops   (15.07.2004 в 17:58)   письмо автору
 
   для: грант   (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)
 

А как поместить это в базу данных? Если не сложно, подскажите, а то требуют :(

   
 
 автор: cheops   (15.07.2004 в 19:20)   письмо автору
 
   для: грант   (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();
    }
?>

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

   
 
 автор: Shady   (07.08.2004 в 13:21)   письмо автору
 
   для: cheops   (15.07.2004 в 19:20)
 

А как к этому скрипту сессии прикрутить?

   
 
 автор: cheops   (07.08.2004 в 13:34)   письмо автору
 
   для: Shady   (07.08.2004 в 13:21)
 

Можно... постараюсь сегодня ближе к вечеру выложить здесь такой скрипт...

   
 
 автор: cheops   (07.08.2004 в 16:36)   письмо автору
 
   для: 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($nme0); 
       
// Сравниваем пароль из базы данных и введённый посетителем 
       
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 пользователя.
подскажите, как это сделать =)
заранее спасибо, павел.

   
 
 автор: LimP   (24.09.2004 в 20:05)   письмо автору
 
   для: pavlik   (24.09.2004 в 19:39)
 

вот,я когда-то писал авторизацию,прикрепил архив в аттаче...

   
 
 автор: pavlik   (24.09.2004 в 20:22)
 
   для: LimP   (24.09.2004 в 20:05)
 

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

   
 
 автор: Igorek   (24.09.2004 в 20:37)   письмо автору
 
   для: 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)
 

не подскажете еще как сделать, чтобы после успешной авторизации человека перебрасывало на страницу с успеваемостью ? =)

   
 
 автор: glsv (Дизайнер)   (24.09.2004 в 23:56)   письмо автору
 
   для: pavlik   (24.09.2004 в 23:38)
 

После того как закончили обработку можете написать вот так

<?
echo "<HTML><HEAD>
            <META HTTP-EQUIV='Refresh' CONTENT='0; URL=newpage.php'>
            </HEAD></HTML>"
;

?>

   
 
 автор: cheops   (24.09.2004 в 23:58)   письмо автору
 
   для: pavlik   (24.09.2004 в 23:38)
 

В участке кода
<?php
  
echo "<HTML><HEAD> 
             <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'> 
             </HEAD><body>"

?>

Вместо index.php пропишите адрес страницы с успеваемостью...

   
 
 автор: eladan   (07.11.2004 в 17:32)   письмо автору
 
   для: 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?

   
 
 автор: cheops   (07.11.2004 в 18:18)   письмо автору
 
   для: 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! Приведённый пример не работает! Уже устал бться с авторизацией, если не поможете разобью комп чесн. слово

   
 
 автор: cheops   (06.04.2005 в 10:47)   письмо автору
 
   для: Guest   (05.04.2005 в 23:25)
 

Давайте новую тему заведём, а то эта уже очень длинная - здесь просто не удобно разбираться что к чему.

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

   
 
 автор: Hemp   (08.12.2004 в 10:06)   письмо автору
 
   для: грант   (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="&#206;&#234;">
  </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 &#242;&#232;&#239;&#224; &#237;&#224;&#228;&#239;&#232;&#241;&#252; &#234;&#224;&#234;&#224;&#255;-&#242;&#238;.
-----------------------------------------------------------------------------------
В, чём, может быть пролема?
В, коде?
В настройках Apache, либо PHP?
Помогите разобраться.

   
 
 автор: coloboc66   (08.12.2004 в 10:36)   письмо автору
 
   для: Hemp   (08.12.2004 в 10:06)
 

Проблема в коде. Это стандартная ошибка у новичков типа меня. А вот найти ошибку очень сложно, потому что она не синтаксическая, по крайней мере у меня сложилось такое впечатление. Характер ошибки кроется где-то в структуре файла РНР. У меня получалось устранить эту ошибку только перписыванием файла по-новому.

   
 
 автор: Hemp   (08.12.2004 в 10:52)   письмо автору
 
   для: 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>


А, проблема осталась.....

   
 
 автор: coloboc66   (08.12.2004 в 12:06)   письмо автору
 
   для: Hemp   (08.12.2004 в 10:52)
 

Не знаю, в этом ли причина твоей ошибки, но у тебя в файле authorize.php сеессия запускается два раза: session_start(); и session_register("logged_user");
,а так делать нельзя. Попробуй убрать session_start();
И еще: если ты сессию запустил, то по окончании работы тебе необходимо разрегистрировать переменные session_unregister("logged_user"); а затем закрыть сессию session_destroy();

   
 
 автор: Hemp   (08.12.2004 в 12:30)   письмо автору
 
   для: coloboc66   (08.12.2004 в 12:06)
 

Не помогло, да, и не могло помочь, т.к.

session_start(); -- проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.

Сессия, у меня не была создана, до этого момента (authorize.php), поэтому, её нужно создавать, с помощью функции session_start();

Регистрация переменных сессии осуществляется при помощи функции session_register:

session_register("logged_user"); -- здесь, я регистрирую переменную сессии logged_user, которая имет в данном случае значение 1

Параметр register_globals включен.

   
 
 автор: cheops   (08.12.2004 в 12:48)   письмо автору
 
   для: Hemp   (08.12.2004 в 12:30)
 

Хм... судя по предупреждениям session_start() у вас в 4 строке, а во второй какой-то вывод в окно браузера - это тот же самый файл и нет ли перед тэгом <?php пробелов или пустых строк?

   
 
 автор: Hemp   (08.12.2004 в 13:23)   письмо автору
 
   для: cheops   (08.12.2004 в 12:48)
 

cheops
Спасибо! Заработало!!!!
Удалил, пробел, перед тегом <?php, написал, его, как <?. И, во второй строке, удалил заремкованную запись.

   
 
 автор: coloboc66   (08.12.2004 в 14:38)   письмо автору
 
   для: Hemp   (08.12.2004 в 13:23)
 

А что, нельзя перед <php ставить пробелы или пустые строки ? А почему?

   
 
 автор: cheops   (08.12.2004 в 14:58)   письмо автору
 
   для: coloboc66   (08.12.2004 в 14:38)
 

Если происходит работа с cookies, session или отправляются какие-либо другие заголовки, то нельзя, так как пробел воспринимается как начала HTML-документа, после отправки которого заголовки послать уже невозможно.

   
Rambler's Top100
вверх

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