Авторизация на сессиях PHP и MySQL
Итак, как я и обещал, сегодня я расскажу как сделать свою авторизацию используя 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> </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> </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>"); ?> |
Тоже все просто, подключаем конфиг, проверяем авторизован ли и выводи данные пользователя.
Ну вот собственно и все, хотя все довольно просто — пожалуй это самая длинная моя статья в блоге на данный момент. Если что то не понятно — спрашивайте! И если вы нашли ошибки или есть замечания, не молчите 🙂
Спасибо, замечательная статья! Но есть один вопрос: разве хорошо хранить пароль в базе в открытом виде? Не правильнее будет хранить хэш?
[Ответить]
ZekMan Reply:
Август 29th, 2011 at 03:20
ну это просто пример а не рекомендация к использованию 😉
Естественно для серьезных проектов нужно писать что то посложнее с хешем и солью ( ну а вдруг базу все таки украдут )…
[Ответить]
Да, хэш и соль — обязательные атрибуты любой системы регистрации, но у Вас есть ещё один большой недочёт — возможность MySQL-инъекции (все данные, пришедшие от пользователя беспаливно вставляются в запросы к БД). Да, пол дела сделано — данные взяты в кавычки, но без обработки этих данных функцией mysql_real_escape_string() скрипт подвержен инъекции, что очень и очень плохо.
[Ответить]
ZekMan Reply:
Январь 27th, 2012 at 10:39
Да, и еще мне не нравится как происходит сам процесс авторизации а так же глобальный массив ошибок. К сожалению у меня сейчас не хватает времени на блог, а в рабочих проектах я не использую эту авторизацию. Так что как только дойдут руки — перепишу эту авторизацию, допишу таки посты которые в черновиках висят и т.д.
[Ответить]
Кстати, я так понял, что можно маленько переделать и использовать как авторизацию «вконтакте»
Кстати, а как использовать API авторизацию??
[Ответить]
ZekMan Reply:
Июнь 3rd, 2012 at 18:36
Насчет использования API пока ничего не скажу, пока что не требовалось реализовывать такой функционал. Но раз интересует — к концу недели сделаю статейку как использовать авторизацию через API популярных сервисов.
[Ответить]
>> к концу недели сделаю статейку как использовать авторизацию через API популярных сервисов.
Буду очень благодарен.^..^
[Ответить]
Алсо, прошло много времени, а авторизации «Вконтакте» через API вообще нет? Это же что за дело-такое?!
[Ответить]
ZekMan Reply:
Июнь 22nd, 2012 at 08:16
Только через vk меня не интересует. Сейчас дорабатываю авторизацию через loginza. Если хочешь вот http://forum.loginza.ru/download/file.php?id=1 это их пример на php. Там все просто.
Сложности в том что в зависимости от заполненности профиля в соц сети и самой соц сети она возвращает разные данные. Все их нужно как то систематизировать и проверять что бы не плодить новых пользователей в БД. К тому же нужно добавить и авторизацию/регистрацию средствами сайта. Моя будет готова на следующей недели ( как раз сдам рабочий проект и смогу уделить ей время ). Если не терпится — дерзай 😉
[Ответить]
Хм, я лучше это буду использовать (Быдлокод)
$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:
Июнь 23rd, 2012 at 18:05
Смотрите сами =)
По мне так если делать авторизацию через соц сети — то полностью
[Ответить]
Хорошая статья! Спасибо! Если есть возможность и желание помочь мне с моим проектом за благодарность материальную, напишите мне пожалуйста на Veetik@mail.ru
[Ответить]
ZekMan Reply:
Июль 6th, 2012 at 15:19
Отписал на почту
[Ответить]
Очень хорошая статья. Все замечательно работает. Не хватает только возможности смены пароля пользователя. Не могли бы вы это добавить?
[Ответить]
ZekMan Reply:
Октябрь 11th, 2012 at 16:33
Да, это вполне можно, Вы говорили о смене со стороны пользователя или со стороны администратора? Если второе то нужно наращивать, добавлять разграничение прав доступа и т.д. В любом случае чуть позже будет новая статья с улучшенной авторизацией
[Ответить]
Я имел ввиду со стороны пользователя. То есть когда пользователь авторизовался, у него есть возможность выхода, хотелось что бы у него еще была возможность смены пароля. Не могли бы вы добавить такую возможность в этой статье, очень ее не хватает?
(И пожалуйста после выпуска новой статьи оставьте здесь ссылку на нее, очень хочется ее увидеть)
[Ответить]
спасибо за статью, возникло три вопроса
1) сессии-когда происходит нажатие на выход, скрипт отсылает на страницу авторизаци, но если в браузере нажать возврат, он возращается на страницу мемберс.. как решить эту проблему? чтоб постоянно требовал авторизацию при выходе с сайта?
2) ошибки выводятся в непонятной кодировке
3)на странице мемберс выводится это»».$_SESSION[«login»].»! Добро пожаловать
\n»); print(«Ваш пароль: «.$_SESSION[«password»].»
\n»); ?>
» без имен и паролей
заранее спасибо)
[Ответить]
ZekMan Reply:
Октябрь 21st, 2012 at 01:16
1. При возврате возможно страница берется из кэша браузера — это никак не исправить. НО При первом же действии на странице, если проверка авторизации стоит до всех действий — будет выполнено перенаправление на страницу авторизации.
2. Возникает встречный вопрос, Вы работаете под windows? Если да — то файлы создаются в такой кодировки, перекодируйте все ваши файлы в UTF8 без DOM (например так умеет notepad++)
3. Немного не понял вопроса, не выводятся логин и пароль?
[Ответить]
Извените, а как сделать так что-бы на скрипт зайти можно было только после авторизации.
[Ответить]
ZekMan Reply:
Октябрь 21st, 2012 at 15:10
[Ответить]
спасибо большое) насчет третьего- да, не выводится пароль и логин…
возник еще один вопрос, подскажите пожалуйста, как модифицировать функции, которые работают с паролями, чтоб они хешировались(на пример в мд5 с солью)?
еще раз заранее спасибо)
[Ответить]
ZekMan Reply:
Октябрь 21st, 2012 at 15:05
По поводу того что не выводится — попробуй сделать var_dump($_SESSION); и еще посмотрите — может что то проскакивает в логах.
[Ответить]
ZekMan Reply:
Октябрь 21st, 2012 at 15:08
Правильнее всего было бы $pass=md5($passwd.’soil’);
[Ответить]
СПС) Вопрос:
У меня php5.3 и «ereg is depricated»
нужно поменять на
[Ответить]
Ой, сорри нашел что менять: нужно просто в файле «functions.php» Во всем массиве (строки [96-101]) добавить слеши после кавычек и в строке 113 поменять ereg на preg_match
[Ответить]
а вот еще вопрос- поменял все поля логин на email в том числе и в базе и именя переменных, скрипт join перестал работать, и не выдает ошибок, подскажите пожалуйста в чем может быть пробелма? и еще вопрос — объясните суть функции function field_validator($field_descr, $field_data, $field_type, $min_length=»», $max_length=»», $field_required=1), там присутствует проверка на емайл, но в вашем скрипте она вродекак не нужна?
[Ответить]
ZekMan Reply:
Октябрь 24th, 2012 at 09:00
Функция взята готовая вот и все. Посмотрите логи, на экран может не выводить в некоторых случаях. В файле Join тоже логин на email заменили? А запросы?
[Ответить]
проблема решена) спасибо большое))
простите, что надоедаю глупыми вопросами, но снова нужна ваша помощь
1-хочу добавить в ваш скрипт функцию md5 шифрования пароля, например $pass=md5($passwd.’soil’);
но мне остается непонятным вопрос, где менять в коде переменную password на pass
2-добавил пару полей используя ваш скрипт (имя и фамилия), все параметры установил, но в базу данных не хочет добавлять кириллицу,если я правильно понял эту ошибку «Error returned if any: Incorrect integer value: ‘Артем’ for column ‘name’ at row 1» не могли бы вы помочь? еще раз спасибо)))
[Ответить]
упс) проблема с кириллицей решена, не тот тип данных в скуле был выставлен) вопрос насчет мд5 остается открытым)
[Ответить]
ZekMan Reply:
Октябрь 25th, 2012 at 01:51
Везде где данные вводятся в бд или проверяются, по списку:
functions.php
1. функция checkPass(), добавить в начало строку вида $password=md5($password.’soil’);
2. функция cleanMemberSession(), изменить строку с паролем на $_SESSION[«password»]=md5($password.’soil’);
3. функция newUser(), добавить в начало строку вида $password=md5($password.’soil’);
Вроде все
[Ответить]
Спасибо большое, все отлично работает, хэшируется, кодировки все отличные.. в общем все соу гуд)
самый последний вопрос, уж простите пожалуйста, как вывести на странице имя человека, который зашел, а не его emaill, к примеру? т е, я попробовал добавить к сессиям функцию, как и пассом и мылом, только на имя (и фамилию), но print(««.$_SESSION[«name»].»\n»); не срабатывает… с email срабатывает, с именем нет.. имя в базе хранится на русском языке, может в этом проблема?
[Ответить]
Добавь в скайп djniktih 🙂
[Ответить]
А какое условие нужно ставить, что бы узнать, залогинелся ли пользователь или нет?
[Ответить]
ZekMan Reply:
Ноябрь 12th, 2012 at 12:29
checkLoggedIn(«yes»);
Но не условием, а просто. Если посетитель не авторизован — его сразу перекинет на страницу авторизации. Если же авторизован — скрипт продолжит выполнение
[Ответить]
Чтобы работал MD5, нуно увеличить длину пароля в бд
[Ответить]
ZekMan Reply:
Январь 10th, 2013 at 21:50
Да, это верно, до 32 символов
[Ответить]
Вы обещали новую улучшенный вариант авторизаций когд она будет реализованно
[Ответить]
ZekMan Reply:
Январь 20th, 2013 at 06:50
Я могу уже сейчас выложить обновленную авторизацию облаченную в класс. Но у меня большое желание сделать это через недельку когда я перенесу блог на свой движок.
[Ответить]
когда пытаюсь зайти или регаца
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:
Январь 20th, 2013 at 06:55
Ну начать надо с того что убрать ereg — он устарел.
С версии PHP 5.3.0, расширение regex помечено устаревшим и заменено расширением PCRE. Вызов этой функции приведет к ошибке уровня E_DEPRECATED. Смотрите список отличий для помощи при конвертировании в PCRE.
Замените на preg_match(), которая использует Perl-совместимый синтаксис регулярного выражения, часто является более быстрой альтернативой функции ereg().
[Ответить]
все здорово работает, но не получается привязать к этому свою страницу, которая бы то же проверяла наличие на вход пользователя
[Ответить]
ZekMan Reply:
Февраль 24th, 2013 at 21:12
Посмотрите на файл members.php
[Ответить]
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:
Март 16th, 2013 at 19:06
Старт сессии на третьей строчке? Нужно выполнять старт сессии до вывода чего либо, а значит как то так:
2
3
session_start();
....
[Ответить]
Сообщение появляется сразу после авторизации
[Ответить]
Там все нормально…
Полный копи-паст из статьи Вашей статьи…
Там комментарии на второй строчки.
[Ответить]
ZekMan Reply:
Март 17th, 2013 at 01:54
Файл точно бе DOM?
Посмотрите, в какие файлы включаете файл конфига, включение файла (include) должно так же производиться до вывода.
[Ответить]
У меня еще вопрос к Вам.
Как мне реализовать следующее:
Проверка какой пользователь авторизовался на сайте.
Пример:
Если зашел пользователь с типом 1, то ему показываем страничку А.
Если зашел пользователь с типом 2, то ему показываем страничку Б.
Типу А, не доступна страничка Б, а типу 2 недоступна страничка А
Хотя бы, укажите в какую сторону копать.
Спасибо большое.
Очень здорово, что вы не игнорируете сообщение на вашем блоге и помогаете учиться.
[Ответить]
ZekMan Reply:
Март 17th, 2013 at 01:56
Ну для начала нам нужно разделить пользователям привилегии, например добавим в базу еще одно поле access, далее идет простая проверка авторизации и прав пользователя, т.е. если авторизован но права не подходят — ошибка, если права доступа совпадают — то показываем страницу
[Ответить]
Скажите, а не проще было сделать, чтобы функция checkLoggedIn возвращала true в случае наличия сессии и false в случае отсутствия, поскольку этот switch с засылкой кейса в параметре функции выглядит странновато. Мне интересно, есть ли за такой реализацией какая-то особая логика.
[Ответить]