Лекция. PHP. Авторизация

php_accessВ данной лекции рассмотрим последовательно процесс авторизации на сайте с использованием PHP и MySQL.

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

1. Создаем форму (полужирным и подчеркнутым написано название файла)

form_vhod.php

<form method="post" action="enter.php">
<table width="100%">
<tr><td colspan="4" height="50%">&nbsp;</td></tr>
<tr><td width="30%"></td><td width="20%">
Имя</td><td > <input  name="login" size="12" type="text"/></td></tr>
<tr><td></td><td>
Пароль</td><td><input name="pass"  size="12" type="password"/></td></tr>
<tr><td colspan="2"></td><td><input type="submit"  value="Войти"/>  </td><td></td></tr>
</table>
</form>

2. В качестве обработчика указан файл enter.php. Сначала рассмотрим как передаются данные в этот файл

Для этого достаточно обратиться так:

$_POST[‘имя поля’]

Здесь указано POST, потому что в обработчике формы именно POST.

Если будет GET, то соответственно $_GET[‘имя поля’]

Наберите код в файле enter.php

<?php
echo$_POST['login'].$_POST['pass'];
?>

В результате будет выведено значение формы.

3. Обработаем теперь проверку пароля из базы данных.

Для этого создадим в MySQL базу данных mainbd, в которой создадим таблицу pers с текстовыми полями name и password

Внесем данные в таблицу pers

name password
aaa 111
bbb 222
ccc 333

4. Изменим файл enter.php

<?php

                session_start();
                $_db='mainbd';
                $_user='root';
                $_pass='';
                $db=mysql_connect('localhost',$_user, $_pass)OR DIE("Не могу создать соединение ");
                mysql_select_db($_db, $db)  or die(mysql_error());
                echo $_POST['login']."   ".$_POST['pass']."<br>";
                $login= addslashes($_POST['login']);
                $pass=addslashes($_POST['pass']);
                echo $login."   ".$pass."<br>";
                $query="SELECT * FROM pers WHERE name='$login' AND password='$pass'";
                echo$query;
                $res=mysql_query($query, $db);
                if(mysql_num_rows($res)!=1){    //такого пользователя нет
                               echo"No";
                                               }
                else{
                               $res=mysql_query($query,$db);
                               $row = mysql_fetch_array($res);
                               $_SESSION['name'] = $login;
                               echo"<br>".$_SESSION['name'];
                               //             header("Location: ".$_SERVER['HTTP_REFERER']); //Переход на предыдущую страницу
                               header("Location:main.php");
}
?>

Комментарии

  • Есть полезная рекомендация – писать все переменные, имена файлов, полей, таблиц, баз маленькими буквами, чтобы не мучаться с регистрами. Есть еще и понятие венгерской записи, но каждый волен выбирать сам, но и ошибки пусть потом ищет сам 🙂 Я выбираю первый способ.
  • Можно закомментировать последние переходы, чтобы понять, что мы видим при исполнении файла enter.php
  • Переход в конце на новый файл main.php

4. Файл main.php

<?
                session_start();
                echo$_SESSION['name'];
?>

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

Теперь такой вопрос. Что будет если пользователь каким-то образом перейдет на файл main.php? Ответ прост – он получит ошибку:

Notice: Undefined index: name in T:\home\localhost\auto\main.php on line 3

Чтобы убедиться в этом, достаточно открыть в новом браузере. Ошибка связана с тем, что в этой сессии php не знает ничего про переменную name.

Исправим main.php так, чтобы если перешли со стороны enter.php, то показывал имя и какой-то текст, если же не продолжение сессии, то перейдем на файл ввода пароля

<?
                session_start();
                if(isset($_SESSION['name'])) echo$_SESSION['name'];
                               else
                                               {header("Location:form_vhod.php");          ;
                                               session_destroy();
                                               }
?>

Вот и все!

5. Недостаток предложенной выше схемы в том, необходимо минимум 3 файла. Рассмотрим теперь возможность объединения всех этих трех файлов в виде одного, т.е. форма и обработчик будут в одной форме.

<?
                session_start();
                if(!isset($_POST['flag'])) $flag=0; else $flag=$_POST['flag'];
                if($flag==0)
                {
?>

<form method="post" action="form_new.php">
<table width="100%">
<tr><td colspan="4" height="50%">&nbsp;</td></tr>
<tr><td width="30%"></td><td width="20%">
Имя</td><td > <input  name="login" size="12" type="text"/></td></tr>
<tr><td></td><td>
Пароль</td><td><input name="pass"  size="12" type="password"/></td></tr>
<tr><td colspan="2"></td><td><input type="submit"  value="Войти"/>  </td><td></td></tr>
</table>
<input type="hidden" name="flag" value="123">
</form>
<?
               }
else
       {
                $_db='mainbd';
                $_user='root';
                $_pass='';
                $db=mysql_connect('localhost',$_user, $_pass)OR DIE("Не могу создать соединение ");
                mysql_select_db($_db, $db)  or die(mysql_error());
                $login= addslashes($_POST['login']);
                $pass=addslashes($_POST['pass']);
                $query="SELECT * FROM pers WHERE name='$login' AND password='$pass'";
                $res=mysql_query($query, $db);
                if(mysql_num_rows($res)!=1){    //такого пользователя нет
                               echo"No";
                               header("Location: ".$_SERVER['HTTP_REFERER']);
                                               }
                else{
                               $res=mysql_query($query,$db);
                               $row = mysql_fetch_array($res);
                               $_SESSION['name'] = $login;
                               $_SESSION['flag'] = $_POST['flag'];
                    }
?>
                Поздравляем, Вы зашли!
<?
       }
?>

Комментарий. Обратите внимание как соотносятся код html и php

6. Выведем теперь список всех пользователей

Для этого, во-первых, добавим после поздравления о входе строчку

            <a href=»spisok.php»>Список пользователей</a>

А во-вторых, добавим файл spisok.php

spisok.php

<?php
                session_start();
                $_db='mainbd';
                $_user='root';
                $_pass='';
                $db=mysql_connect('localhost',$_user, $_pass)OR DIE("Не могу создать соединение ");
                mysql_select_db($_db, $db)  or die(mysql_error());
                $query="SELECT * FROM pers";
                $res=mysql_query($query, $db);
                while ($row=mysql_fetch_array($res))
                {
                               echo$row['name']." ".$row['password']."<br>";
                }
?>
<a href="form_new.php">Начало</a>
<a href="reg.php">Регистрация</a>

7. Добавим теперь возможность ввода данных. Для этого создадим файл

reg.php

<?
                session_start()
?>

<form method="post" action="new.php">
<table width="100%">
<tr><td colspan="4" height="50%">&nbsp;</td></tr>
<tr><td width="30%"></td><td width="20%">
Имя</td><td > <input  name="login_new" size="12" type="text"/></td></tr>
<tr><td></td><td>
Пароль</td><td><input name="pass_new"  size="12" type="password"/></td></tr>
<tr><td colspan="2"></td><td><input type="submit"  value="Добавить"/>  </td><td></td></tr>
</table>
</form>

Для обработки создадим файл new.php, но предварительно добавим к предыдущему файлу строчки для того, чтобы отслеживать процесс регистрации

 

<?
                if(!isset($_SESSION['RESULT'])) $_SESSION['RESULT']="";
                echo$_SESSION['RESULT'];
?>

new.php

<?
                session_start();
                $_db='mainbd';
                $_user='root';
                $_pass='';
                $nnn=1;
                $db=mysql_connect('localhost',$_user, $_pass)OR DIE("Не могу создать соединение ");
                mysql_select_db($_db, $db)  or die(mysql_error());
                if(isset($_POST['login_new'])) $login_new=$_POST['login_new']; else $login_new="";
                if(isset($_POST['pass_new']))  $pass_new= $_POST['pass_new'];  else $pass_new="";
                if($login_new==""||$pass_new=="") {$_SESSION['RESULT']="Пустой логин";$nnn=0;}
                $query="SELECT name FROM pers";
                $res=mysql_query($query, $db);
                while ($row=mysql_fetch_array($res))
                {
                               if($row['name']==$login_new) {$_SESSION['RESULT']="Такое имя в базе есть";$nnn=0;};
                }
                $query = "INSERT INTO pers VALUES (\"".$login_new."\",\"".$pass_new."\")";
                echo$query;
        if ($nnn!=0){mysql_query($query);
                $_SESSION['RESULT']="Добавлено";}
                header("Location: ".$_SERVER['HTTP_REFERER']);
?>

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

7 комментариев к “Лекция. PHP. Авторизация”

  1. С кавычками конечно же беда. Трудно копировать. Может переделаете?

  2. Теперь стал плагин использовать. Будет чуть аккуратнее. Пока не хочу исправлять. Целая история…

  3. Тут написано как не надо делать. Из того что бросилось в глаза:
    1. вместо <? нужно всегда использовать не нужен.
    4. в БД нужно хранить хеши от паролей а не сами пароли.

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

  4. 1. Вместо короткого открывающего тега <? нужно использовать полный <?рнр. В последних версиях пхп кроткие теги работать не будут.
    2. Вы используете устаревший модуль для работы с базой. В последних версиях тоже работать не будет. Лучше студентов учить актуальным инструментам, например МуSQLi h t t ps : / / secure.php.net/manual/ru/book.mysqli.php или ПДО.

Комментарии закрыты.