Авторизация на сессиях PHP и MySQL

Август 3rd, 2011 Рубрики: MySQL, PHP coubertin.cz www.colvillewoodworking.com


Итак, как я и обещал, сегодня я расскажу как сделать свою авторизацию используя session, php и mysql. Для начала определимся что такое сессия и чем она отличается от cookie.
Session – это механизм, позволяющий однозначно идентифицировать браузер и создающий для этого браузера файл на сервере, в котором хранятся переменные сеанса.
Cookies — это механизм хранения данных броузером удаленного компьютера для идентификации возвращающихся посетителей и хранения параметров веб-страниц.
Т.е. главное различие это место хранения данных, у сессий на стороне сервера, у куков на стороне клиента, это различие критично. Если украсть у пользователя cookie довольно просто то с сессиями не все так просто. Ну а теперь перейдем к практической части а именно к написанию своей авторизации.
Для начала определим имена файлов:

  • config.php — хранит данные для подключения к Базе Данных ( далее БД )
  • functions.php — содержит в себе все функции для работы авторизации
  • join.php — простейший пример регистрации пользователя в системе
  • login.php — служит для входа в систему
  • logout.php — служит для выхода из системы
  • members.php — служит для проверки авторизации ( простейший пример «закрытой» части сайта

Для начала создадим БД и таблицу где будут храниться данные пользователей.

SQL дамп таблицы пользователей

1
2
3
4
5
6
CREATE TABLE users (
  id INT(5) NOT NULL AUTO_INCREMENT,
  login VARCHAR(15) DEFAULT '0' ,
  password VARCHAR(15) DEFAULT '0' ,
  PRIMARY KEY (id)
);

config.php

Что содержит данный файл я уже говорил, поэтому просто приведу его код.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
# Запуск сессии
session_start();
# Служит для отладки, показывает все ошибки, предупреждения и т.д.
error_reporting(E_ALL);
# Подключение файлов с функциями
include_once("functions.php");
# В этом массиве далее мы будем хранить сообщения системы, т.е. ошибки.
$messages=array();
# Данные для подключения к БД
$dbhost="localhost";
$dbuser="database_user";
$dbpass="user_password";
$dbname="datebase";
# Вызываем функцию подключения к БД
connectToDB();
?>

functions.php

Самый большой файл из всех в данной статье, содержит все функции. Приведу исходный код а потом прокомментирую каждую функцию.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php

function connectToDB() {
  global $link, $dbhost, $dbuser, $dbpass, $dbname;
  ($link = mysql_pconnect("$dbhost", "$dbuser", "$dbpass")) || die("Couldn't connect to MySQL");
  mysql_select_db("$dbname", $link) || die("Couldn't open db: $dbname. Error if any was: ".mysql_error() );
}



function newUser($login, $password) {
  global $link;

  $query="INSERT INTO users (login, password) VALUES('$login', '$password')";
  $result=mysql_query($query, $link) or die("Died inserting login info into db.  Error returned if any: ".mysql_error());

  return true;
}



function displayErrors($messages) {
  print("<b>Возникли следующие ошибки:</b>\n<ul>\n");

  foreach($messages as $msg){
    print("<li>$msg</li>\n");
  }
  print("</ul>\n");
}




function checkLoggedIn($status){
  switch($status){
    case "yes":
      if(!isset($_SESSION["loggedIn"])){
        header("Location: login.php");
        exit;
      }
      break;
    case "no":
      if(isset($_SESSION["loggedIn"]) && $_SESSION["loggedIn"] === true ){
        header("Location: members.php");
      }
      break;
  }
  return true;
}



function checkPass($login, $password) {
  global $link;

  $query="SELECT login, password FROM users WHERE login='$login' and password='$password'";
  $result=mysql_query($query, $link)
    or die("checkPass fatal error: ".mysql_error());

  if(mysql_num_rows($result)==1) {
    $row=mysql_fetch_array($result);
    return $row;
  }
  return false;
}


function cleanMemberSession($login, $password) {
  $_SESSION["login"]=$login;
  $_SESSION["password"]=$password;
  $_SESSION["loggedIn"]=true;
}


function flushMemberSession() {
  unset($_SESSION["login"]);
  unset($_SESSION["password"]);
  unset($_SESSION["loggedIn"]);
  session_destroy();
  return true;
}

function field_validator($field_descr, $field_data, $field_type, $min_length="", $max_length="", $field_required=1) {

  global $messages;

  if(!$field_data && !$field_required){ return; }

  $field_ok=false;

  $email_regexp="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|";
  $email_regexp.="(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";

  $data_types=array(
    "email"=>$email_regexp,
    "digit"=>"^[0-9]$",
    "number"=>"^[0-9]+$",
    "alpha"=>"^[a-zA-Z]+$",
    "alpha_space"=>"^[a-zA-Z ]+$",
    "alphanumeric"=>"^[a-zA-Z0-9]+$",
    "alphanumeric_space"=>"^[a-zA-Z0-9 ]+$",
    "string"=>""
  );

  if ($field_required && empty($field_data)) {
    $messages[] = "Поле $field_descr является обезательным";
    return;
  }

  if ($field_type == "string") {
    $field_ok = true;
  } else {
    $field_ok = ereg($data_types[$field_type], $field_data);
  }

  if (!$field_ok) {
    $messages[] = "Пожалуйста введите нормальный $field_descr.";
    return;
  }

  if ($field_ok && ($min_length > 0)) {
    if (strlen($field_data) < $min_length) {
      $messages[] = "$field_descr должен быть не короче $min_length символов.";
      return;
    }
  }

  if ($field_ok && ($max_length > 0)) {
    if (strlen($field_data) > $max_length) {
      $messages[] = "$field_descr не должен быть длиннее $max_length символов.";
      return;
    }
  }
}
?>

А теперь по порядку

  • function connectToDB() — служит для подключения к базе данных
  • function newUser($login, $password) — служит для создания нового пользователя в системе
  • function displayErrors($messages) — выводит массив ошибок
  • function checkLoggedIn($status) — проверяет авторизацию пользователя.
  • function checkPass($login, $password) — проверяет пользователя по БД во время авторизации
  • function cleanMemberSession($login, $password) — авторизует пользователя
  • function flushMemberSession() — выход, или если вам будет удобнее logout
  • function field_validator($field_descr, $field_data, $field_type, $min_length=»», $max_length=»», $field_required=1) — Валидатор данных, проверяет соответствие полей требованиям системы

Работу каждой функции я описывать не буду, т.к. они довольно простые, в данный момент нас интересует только логика. Если будут вопросы — спрашивайте.

join.php

Итак исходник:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
include_once("config.php");

checkLoggedIn("no");

$title="страница регистрации";

if(isset($_POST["submit"])){
  field_validator("login name", $_POST["login"], "alphanumeric", 4, 15);
  field_validator("password", $_POST["password"], "string", 4, 15);
  field_validator("confirmation password", $_POST["password2"], "string", 4, 15);

  if(strcmp($_POST["password"], $_POST["password2"])) {

    $messages[]="Ваши пароли не совпадают";
  }
 
  $query="SELECT login FROM users WHERE login='".$_POST["login"]."'";

  $result=mysql_query($query, $link) or die("MySQL query $query failed.  Error if any: ".mysql_error());

  if( ($row=mysql_fetch_array($result)) ){
    $messages[]="Логин \"".$_POST["login"]."\" уже занят, попробуйте другой.";
  }

  if(empty($messages)) {
    newUser($_POST["login"], $_POST["password"]);

    cleanMemberSession($_POST["login"], $_POST["password"]);

    header("Location: members.php");

  }
}
?>
<html>
<head>
<title><?php print $title; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=uft-8">
</head>
<body>
<h1><?php print $title; ?></h1>
<?php
if(!empty($messages)){
  displayErrors($messages);
}
?>
<form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="POST">
<table>
<tr><td>Логин:</td><td><input type="text" name="login"
value="<?php print isset($_POST["login"]) ? $_POST["login"] : "" ; ?>"
maxlength="15"></td></tr>
<tr><td>Пароль:</td><td><input type="password" name="password" value="" maxlength="15"></td></tr>
<tr><td>Повторить пароль:</td><td><input type="password" name="password2" value="" maxlength="15"></td></tr>
<tr><td>&nbsp;</td><td><input name="submit" type="submit" value="Submit"></td></tr>
</table>
</form>
</body>
</html>

Если кратко описать работу скрипта получится что то вроде:
1. Если уже авторизованы пересылаем на members.php ( строка 4 )
2. Если существует $_POST[‘submit’] ( если отправили данные с формы ) проверяем поля валидатором, проверяем наличие такого пользователя, если никаких ошибок нет, добавляем нового пользователя, ставим сессию и пускаем на members.php
3. Если есть ошибки — выводим
4. Выводим форму

login.php

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
include_once("config.php");

checkLoggedIn("no");

$title="Страница авторизации";

if(isset($_POST["submit"])) {
  field_validator("login name", $_POST["login"], "alphanumeric", 4, 15);
  field_validator("password", $_POST["password"], "string", 4, 15);
  if($messages){
    doIndex();
    exit;
  }

    if( !($row = checkPass($_POST["login"], $_POST["password"])) ) {
        $messages[]="Incorrect login/password, try again";
    }

  if($messages){
    doIndex();
    exit;
  }

  cleanMemberSession($row["login"], $row["password"]);

  header("Location: members.php");
} else {
  doIndex();
}

function doIndex() {
  global $messages;
  global $title;
?>
<html>
<head>
<title><?php print $title; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<h1><?php print $title; ?></h1>
<?php
if($messages) { displayErrors($messages); }
?>
<form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="POST">
<table>
<tr><td>Логин:</td><td><input type="text" name="login"
value="<?php print isset($_POST["login"]) ? $_POST["login"] : "" ; ?>"
maxlength="15"></td></tr>
<tr><td>Пароль:</td><td><input type="password" name="password" value="" maxlength="15"></td></tr>
<tr><td>&nbsp;</td><td><input name="submit" type="submit" value="Submit"></td></tr>
</table>
</form>
</body>
</html>
<?php
}
?>

Во первых тут стоит указать что вывод html и ошибок происходит в функции doIndex() которая вызывается в некоторых случаях, это не очень удобно поэтому кто хочет переписать — милости прошу, лично я сделал это для примера, к каждому проекту я пишу собственную авторизацию и стараюсь не повторяться. Поэтому здесь только пример.
А теперь по порядку.
1. подключаем конфиг
2. если уже авторизованы пересылаем на страницу members.php ( функция checkLoggedIn с параметром no )
3. Если отправлена форма, проверяем поля валидатором, если есть ошибки вызываем функцию doIndex(), если пароли не совпадают ставим ошибку, если есть ошибки вызываем функцию doIndex(), если все в порядке ставим сессию и отправляем на members.php, иначе опять вызываем функцию doIndex()
4. Функция doIndex() выводит html код, ошибки и форму для авторизации.

logout.php

1
2
3
4
5
6
<?php
include_once("config.php");
checkLoggedIn("yes");
flushMemberSession();
header("Location: login.php");
?>

Тут все просто:
1. Подключаем конфиг
2. Проверяем авторизован ли пользователь
3. Уничтожаем сессию
4. Отправляем пользователя на страницу авторизации

members.php

1
2
3
4
5
6
7
<?php
include_once("config.php");
checkLoggedIn("yes");
print("<b>".$_SESSION["login"]."</b>! Добро пожаловать<br>\n");
print("Ваш пароль: <b>".$_SESSION["password"]."</b><br>\n");
print("<a href=\"logout.php"."\">Выход</a>");
?>

Тоже все просто, подключаем конфиг, проверяем авторизован ли и выводи данные пользователя.

Ну вот собственно и все, хотя все довольно просто — пожалуй это самая длинная моя статья в блоге на данный момент. Если что то не понятно — спрашивайте! И если вы нашли ошибки или есть замечания, не молчите 🙂

Теги: , , ,

90 комментариев к “Авторизация на сессиях PHP и MySQL”

  1. Konstantin
    Август 29th, 2011 at 00:36
    1

    Спасибо, замечательная статья! Но есть один вопрос: разве хорошо хранить пароль в базе в открытом виде? Не правильнее будет хранить хэш?

    [Ответить]

    ZekMan Reply:

    ну это просто пример а не рекомендация к использованию 😉
    Естественно для серьезных проектов нужно писать что то посложнее с хешем и солью ( ну а вдруг базу все таки украдут )…

    [Ответить]

  2. Январь 27th, 2012 at 01:56
    2

    Да, хэш и соль — обязательные атрибуты любой системы регистрации, но у Вас есть ещё один большой недочёт — возможность MySQL-инъекции (все данные, пришедшие от пользователя беспаливно вставляются в запросы к БД). Да, пол дела сделано — данные взяты в кавычки, но без обработки этих данных функцией mysql_real_escape_string() скрипт подвержен инъекции, что очень и очень плохо.

    [Ответить]

    ZekMan Reply:

    Да, и еще мне не нравится как происходит сам процесс авторизации а так же глобальный массив ошибок. К сожалению у меня сейчас не хватает времени на блог, а в рабочих проектах я не использую эту авторизацию. Так что как только дойдут руки — перепишу эту авторизацию, допишу таки посты которые в черновиках висят и т.д.

    [Ответить]

  3. qweez
    Июнь 2nd, 2012 at 23:35
    3

    Кстати, я так понял, что можно маленько переделать и использовать как авторизацию «вконтакте»
    Кстати, а как использовать API авторизацию??

    [Ответить]

    ZekMan Reply:

    Насчет использования API пока ничего не скажу, пока что не требовалось реализовывать такой функционал. Но раз интересует — к концу недели сделаю статейку как использовать авторизацию через API популярных сервисов.

    [Ответить]

  4. qweez
    Июнь 4th, 2012 at 03:05
    4

    >> к концу недели сделаю статейку как использовать авторизацию через API популярных сервисов.
    Буду очень благодарен.^..^

    [Ответить]

  5. qweez
    Июнь 21st, 2012 at 23:28
    5

    Алсо, прошло много времени, а авторизации «Вконтакте» через API вообще нет? Это же что за дело-такое?!

    [Ответить]

    ZekMan Reply:

    Только через vk меня не интересует. Сейчас дорабатываю авторизацию через loginza. Если хочешь вот http://forum.loginza.ru/download/file.php?id=1 это их пример на php. Там все просто.

    Сложности в том что в зависимости от заполненности профиля в соц сети и самой соц сети она возвращает разные данные. Все их нужно как то систематизировать и проверять что бы не плодить новых пользователей в БД. К тому же нужно добавить и авторизацию/регистрацию средствами сайта. Моя будет готова на следующей недели ( как раз сдам рабочий проект и смогу уделить ей время ). Если не терпится — дерзай 😉

    [Ответить]

  6. qweez
    Июнь 23rd, 2012 at 00:30
    6

    Хм, я лучше это буду использовать (Быдлокод)

    $mail = »; // Ваш Логин
    $pass = »; // Ваш Пароль

    ### Авторизация + Получение cookie ###
    $otvet = connect («http://login.vk.com/?act=login&email=$mail&pass=$pass»);
    if (!preg_match («/hash=(.*?)&/», $otvet, $hash)) {
    die(«Введены неверные данные :(«); }

    $otvet = connect («http://vk.com/login.php?act=slogin&fast=1&hash=».$hash[1].»&s=1″);
    preg_match («/remixsid=(.*?);/», $otvet, $sid);
    $cookie = «remixchk=5;remixsid=$sid[1]»;

    while (true) {

    $text_ok = ‘no’;

    ### Функция connect (curl, cookie, post) ###
    function connect($link,$cookie=null,$post=null) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$link);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 0);
    curl_setopt ($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    if($cookie !== null)
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    if($post !== null) {
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); }
    $otvet = curl_exec($ch);
    curl_close($ch);
    return $otvet; }

    ?>

    [Ответить]

    ZekMan Reply:

    Смотрите сами =)
    По мне так если делать авторизацию через соц сети — то полностью

    [Ответить]

  7. Виктор
    Июль 6th, 2012 at 14:17
    7

    Хорошая статья! Спасибо! Если есть возможность и желание помочь мне с моим проектом за благодарность материальную, напишите мне пожалуйста на Veetik@mail.ru

    [Ответить]

    ZekMan Reply:

    Отписал на почту

    [Ответить]

  8. Андрей
    Октябрь 11th, 2012 at 12:50
    8

    Очень хорошая статья. Все замечательно работает. Не хватает только возможности смены пароля пользователя. Не могли бы вы это добавить?

    [Ответить]

    ZekMan Reply:

    Да, это вполне можно, Вы говорили о смене со стороны пользователя или со стороны администратора? Если второе то нужно наращивать, добавлять разграничение прав доступа и т.д. В любом случае чуть позже будет новая статья с улучшенной авторизацией

    [Ответить]

  9. Андрей
    Октябрь 12th, 2012 at 12:18
    9

    Я имел ввиду со стороны пользователя. То есть когда пользователь авторизовался, у него есть возможность выхода, хотелось что бы у него еще была возможность смены пароля. Не могли бы вы добавить такую возможность в этой статье, очень ее не хватает?

    (И пожалуйста после выпуска новой статьи оставьте здесь ссылку на нее, очень хочется ее увидеть)

    [Ответить]

  10. Артем
    Октябрь 20th, 2012 at 19:56
    10

    спасибо за статью, возникло три вопроса
    1) сессии-когда происходит нажатие на выход, скрипт отсылает на страницу авторизаци, но если в браузере нажать возврат, он возращается на страницу мемберс.. как решить эту проблему? чтоб постоянно требовал авторизацию при выходе с сайта?
    2) ошибки выводятся в непонятной кодировке
    3)на странице мемберс выводится это»».$_SESSION[«login»].»! Добро пожаловать
    \n»); print(«Ваш пароль: «.$_SESSION[«password»].»
    \n»); ?>
    » без имен и паролей
    заранее спасибо)

    [Ответить]

    ZekMan Reply:

    1. При возврате возможно страница берется из кэша браузера — это никак не исправить. НО При первом же действии на странице, если проверка авторизации стоит до всех действий — будет выполнено перенаправление на страницу авторизации.
    2. Возникает встречный вопрос, Вы работаете под windows? Если да — то файлы создаются в такой кодировки, перекодируйте все ваши файлы в UTF8 без DOM (например так умеет notepad++)
    3. Немного не понял вопроса, не выводятся логин и пароль?

    [Ответить]

  11. ssh
    Октябрь 21st, 2012 at 09:32
    11

    Извените, а как сделать так что-бы на скрипт зайти можно было только после авторизации.

    [Ответить]

    ZekMan Reply:

    [Ответить]

  12. Артем
    Октябрь 21st, 2012 at 14:16
    12

    спасибо большое) насчет третьего- да, не выводится пароль и логин…
    возник еще один вопрос, подскажите пожалуйста, как модифицировать функции, которые работают с паролями, чтоб они хешировались(на пример в мд5 с солью)?
    еще раз заранее спасибо)

    [Ответить]

    ZekMan Reply:

    По поводу того что не выводится — попробуй сделать var_dump($_SESSION); и еще посмотрите — может что то проскакивает в логах.

    [Ответить]

    ZekMan Reply:

    Правильнее всего было бы $pass=md5($passwd.’soil’);

    [Ответить]

  13. Me_Shock
    Октябрь 21st, 2012 at 17:58
    13

    СПС) Вопрос:
    У меня php5.3 и «ereg is depricated»

    1
    $field_ok = ereg($data_types[$field_type], $field_data);

    нужно поменять на

    1
    $field_ok = preg_match(тут не смог);

    [Ответить]

  14. Me_Shock
    Октябрь 21st, 2012 at 19:57
    14

    Ой, сорри нашел что менять: нужно просто в файле «functions.php» Во всем массиве (строки [96-101]) добавить слеши после кавычек и в строке 113 поменять ereg на preg_match

    [Ответить]

  15. Артем
    Октябрь 24th, 2012 at 01:04
    15

    а вот еще вопрос- поменял все поля логин на email в том числе и в базе и именя переменных, скрипт join перестал работать, и не выдает ошибок, подскажите пожалуйста в чем может быть пробелма? и еще вопрос — объясните суть функции function field_validator($field_descr, $field_data, $field_type, $min_length=»», $max_length=»», $field_required=1), там присутствует проверка на емайл, но в вашем скрипте она вродекак не нужна?

    [Ответить]

    ZekMan Reply:

    Функция взята готовая вот и все. Посмотрите логи, на экран может не выводить в некоторых случаях. В файле Join тоже логин на email заменили? А запросы?

    [Ответить]

  16. Артем
    Октябрь 24th, 2012 at 22:47
    16

    проблема решена) спасибо большое))
    простите, что надоедаю глупыми вопросами, но снова нужна ваша помощь
    1-хочу добавить в ваш скрипт функцию md5 шифрования пароля, например $pass=md5($passwd.’soil’);
    но мне остается непонятным вопрос, где менять в коде переменную password на pass
    2-добавил пару полей используя ваш скрипт (имя и фамилия), все параметры установил, но в базу данных не хочет добавлять кириллицу,если я правильно понял эту ошибку «Error returned if any: Incorrect integer value: ‘Артем’ for column ‘name’ at row 1» не могли бы вы помочь? еще раз спасибо)))

    [Ответить]

  17. Артем
    Октябрь 24th, 2012 at 23:17
    17

    упс) проблема с кириллицей решена, не тот тип данных в скуле был выставлен) вопрос насчет мд5 остается открытым)

    [Ответить]

    ZekMan Reply:

    Везде где данные вводятся в бд или проверяются, по списку:
    functions.php
    1. функция checkPass(), добавить в начало строку вида $password=md5($password.’soil’);
    2. функция cleanMemberSession(), изменить строку с паролем на $_SESSION[«password»]=md5($password.’soil’);
    3. функция newUser(), добавить в начало строку вида $password=md5($password.’soil’);
    Вроде все

    [Ответить]

  18. Артем
    Октябрь 25th, 2012 at 03:31
    18

    Спасибо большое, все отлично работает, хэшируется, кодировки все отличные.. в общем все соу гуд)
    самый последний вопрос, уж простите пожалуйста, как вывести на странице имя человека, который зашел, а не его emaill, к примеру? т е, я попробовал добавить к сессиям функцию, как и пассом и мылом, только на имя (и фамилию), но print(««.$_SESSION[«name»].»\n»); не срабатывает… с email срабатывает, с именем нет.. имя в базе хранится на русском языке, может в этом проблема?

    [Ответить]

  19. Ноябрь 10th, 2012 at 11:57
    19

    Добавь в скайп djniktih 🙂

    [Ответить]

  20. Владислав
    Ноябрь 11th, 2012 at 15:31
    20

    А какое условие нужно ставить, что бы узнать, залогинелся ли пользователь или нет?

    [Ответить]

    ZekMan Reply:

    checkLoggedIn(«yes»);
    Но не условием, а просто. Если посетитель не авторизован — его сразу перекинет на страницу авторизации. Если же авторизован — скрипт продолжит выполнение

    [Ответить]

  21. Николай
    Январь 8th, 2013 at 19:03
    21

    Чтобы работал MD5, нуно увеличить длину пароля в бд

    [Ответить]

    ZekMan Reply:

    Да, это верно, до 32 символов

    [Ответить]

  22. chel
    Январь 19th, 2013 at 15:40
    22

    Вы обещали новую улучшенный вариант авторизаций когд она будет реализованно

    [Ответить]

    ZekMan Reply:

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

    [Ответить]

  23. chel
    Январь 19th, 2013 at 16:07
    23

    когда пытаюсь зайти или регаца
    Deprecated: Function ereg() is deprecated in M:\home\localhost\www\teste\NEWreg\functions.php on line 113

    Warning: Cannot modify header information — headers already sent by (output started at M:\home\localhost\www\teste\NEWreg\functions.php:113) in M:\home\localhost\www\teste\NEWreg\login.php on line 27
    чо делать

    [Ответить]

    ZekMan Reply:

    Ну начать надо с того что убрать ereg — он устарел.
    С версии PHP 5.3.0, расширение regex помечено устаревшим и заменено расширением PCRE. Вызов этой функции приведет к ошибке уровня E_DEPRECATED. Смотрите список отличий для помощи при конвертировании в PCRE.

    Замените на preg_match(), которая использует Perl-совместимый синтаксис регулярного выражения, часто является более быстрой альтернативой функции ereg().

    [Ответить]

  24. Андрей
    Февраль 14th, 2013 at 13:23
    24

    все здорово работает, но не получается привязать к этому свою страницу, которая бы то же проверяла наличие на вход пользователя

    [Ответить]

    ZekMan Reply:

    Посмотрите на файл members.php

    [Ответить]

  25. stas
    Март 16th, 2013 at 14:53
    25

    Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at C:\Program Files\xampp\htdocs\tester\members.php:7) in C:\Program Files\xampp\htdocs\tester\config.php on line 3

    Кто подскажет в чем проблема?

    В Notepad++ ставил кодировку utf8 без dom

    [Ответить]

    ZekMan Reply:

    Старт сессии на третьей строчке? Нужно выполнять старт сессии до вывода чего либо, а значит как то так:

    1
    2
    3
    <?php
    session_start();
    ....

    [Ответить]

  26. stas
    Март 16th, 2013 at 14:54
    26

    Сообщение появляется сразу после авторизации

    [Ответить]

  27. stas
    Март 16th, 2013 at 23:42
    27

    Там все нормально…
    Полный копи-паст из статьи Вашей статьи…
    Там комментарии на второй строчки.

    [Ответить]

    ZekMan Reply:

    Файл точно бе DOM?
    Посмотрите, в какие файлы включаете файл конфига, включение файла (include) должно так же производиться до вывода.

    [Ответить]

  28. stas
    Март 17th, 2013 at 00:42
    28

    У меня еще вопрос к Вам.

    Как мне реализовать следующее:

    Проверка какой пользователь авторизовался на сайте.
    Пример:
    Если зашел пользователь с типом 1, то ему показываем страничку А.
    Если зашел пользователь с типом 2, то ему показываем страничку Б.
    Типу А, не доступна страничка Б, а типу 2 недоступна страничка А
    Хотя бы, укажите в какую сторону копать.
    Спасибо большое.
    Очень здорово, что вы не игнорируете сообщение на вашем блоге и помогаете учиться.

    [Ответить]

    ZekMan Reply:

    Ну для начала нам нужно разделить пользователям привилегии, например добавим в базу еще одно поле access, далее идет простая проверка авторизации и прав пользователя, т.е. если авторизован но права не подходят — ошибка, если права доступа совпадают — то показываем страницу

    [Ответить]

  29. Андрей
    Март 20th, 2013 at 19:37
    29

    Скажите, а не проще было сделать, чтобы функция checkLoggedIn возвращала true в случае наличия сессии и false в случае отсутствия, поскольку этот switch с засылкой кейса в параметре функции выглядит странновато. Мне интересно, есть ли за такой реализацией какая-то особая логика.

    [Ответить]

Страницы комментариев

Написать комментарий