PHP : Регистрация и автентикация на потребители (без MySQL)
Вече в почти всеки сайт трябва да се регистрираш.
Да създадеш потребителски акаунт с който да ползваш определени екстри.
Преди да почнете да слагате такива ограничения помислете какво по различно ще предоставите
на потребителя, който ще се регистрира.
Ще има ли той по големи права от тези които не са регистрирани?
Ако няма нещо интересно, което да може да прави след своята регистрация то тогава
всичко си губи смисъла.
Ето пример:
1.Регистрирания потребиел ще вижда web страници от сайта ви,
които другите няма да може да виждат.
2.Ще може да качва файлове.
3.Ще може да пише мнения.
4.Ще може да тегли файлове.

и тн.

Скриптовете, които ще напиша са много елементарни но дават точна престава за това как
се съхраняват и проверяват потребителските имена и паролите.
Няма да използвам SQL база данни, а само един текстов файл в който ще съхранявам всичко.

Ето и файловете:

login.html - формуляр рез който ще се логват
register.html - формуляр чрез които ще се регистрират
pro.php -проверява данните изпратени от login.html
registerzapis.php - записва данните изпратени от register.html
secret.php - страница,която ще се вижда само от регистрирани потребители
secret2.php -страница,която ще се вижда само от регистрирани потребители


login.html
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
</head>
<body>

<FORM ACTION="pro.php" METHOD=POST>
<b> Потребител:
<INPUT TYPE="text" NAME="user" value="" size="12" maxlength="12">
Парола:
<INPUT TYPE="password" NAME="pas" value="" size="12" maxlength="12">
<INPUT TYPE=submit VALUE="ВХОД">
</FORM>

<a href=register.html><b> <font color="#ff0000">Регистрация</a>
</body>
</html>


register.html
<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

<FORM ACTION="registerzapis.php" METHOD=POST>
<b>
Потребител:
<INPUT TYPE="text" NAME="user" value="" size="12" maxlength="12"><br>
Парола:

<INPUT TYPE="password" NAME="pas" value="" size="12" maxlength="12"><br></td>
<INPUT TYPE=submit value=РЕГИСТРАЦИЯ >
</FORM>
</body>


Първите два файла са HTML.
Това са обикновенни формуляри чрез които потребителя се логва или се регистрира.
В единия случай (когато се логва) изпраща данни на файла pro.php който проверява
дали коректно е попълнил Потребителското име и парола.
А в другия случай (когато се регистрира) изпраща данните на файла registerzapis.php,
който записва новото потребителско име и парола в файла db.inc '



pro.php
<?php
session_start();


$user=$HTTP_POST_VARS['user'];

$pas=$HTTP_POST_VARS['pas'];
$pas=md5($pas);

function filled_out($form_vars)
{

foreach ($form_vars as $key => $value)
{
if (!isset($key) || ($value == ''))
return false;
}
return true;
}


if(!filled_out($HTTP_POST_VARS))
{
echo '
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">

</head>

<body>

<br>

<b><big> <font color=#ff0000> Не сте попълнили всички полета. </font>

<META HTTP-EQUIV="Refresh"
CONTENT="2; URL=login.html">

';
exit;
}


$file= file("db.inc");
$n=count($file);

for ($i=0; $i<$n;$i++)
{
$line = explode ("&",$file[$i] );
if (strtolower($line[0])==strtolower($user) && $line[1]==$pas)

{$HTTP_SESSION_VARS['user'] = $user;
echo'<META HTTP-EQUIV="Refresh"
CONTENT="0; URL=secret.php">';
exit;
}

}

echo 'Грешен "Потребител" или "Парола"';

?>


Във файла pro.php има няколко важни проверки.
Едната е дали потребителя е попълнил всички полета в формуляра login.html
и криптиране на изпратената парола.
В базата данни са записани само криптирани пароли и затова трябва и ние да криптираме
изпратената парола за да може да направим проверката.
Ето и важната част:
$file= file("db.inc");-отвеаря файла db.inc и всички редове стават елементи от масива $file
$n=count($file); -$n e броя на тези елементи
for ($i=0; $i<$n;$i++) - цикъл за обхождане на елементите(редовете)
{
$line = explode ("&",$file[$i] ); -всеки елемент от масива $file се раделя на части които пък
стават елементи от масива $line
if (strtolower($line[0])==strtolower($user) && $line[1]==$pas) - проверява дали потребителското име
и парола отговарят на някои от записаните в файла db.inc

{$HTTP_SESSION_VARS['user'] = $user; - ако има съвпадение се пуска сесиина променлива
echo'<META HTTP-EQUIV="Refresh"
CONTENT="0; URL=secret.php">'; - редиректва се към файла secret.php
exit;
}

}

echo 'Грешен "Потребител" или "Парола"'; - ако не съвпада му се показва това съобщение

?>



registerzapis.php
<head>
<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body >

<?php
function filled_out($form_vars)
{

foreach ($form_vars as $key => $value)
{
if (!isset($key) || ($value == ''))
return false;
}
return true;
}
if(!filled_out($HTTP_POST_VARS))
{
echo '


<b><center> <font color=#ff0000> Не сте попълнили всички полета. ';

echo'<META HTTP-EQUIV="Refresh"
CONTENT="1; URL=register.php">';

exit;
}
$user=$HTTP_POST_VARS['user'];
$user=str_replace(" ","",$user);
if(!eregi('^[a-zA-Z0-9_]+$',$user))
{echo'Потребителското име може да съдържа само латински букви и цифри от 0 до 9';
exit;}
$file= file("db.inc");
$n=count($file);

for ($i=0; $i<$n;$i++)
{
$line = explode ("&",$file[$i] );
if (strtolower($line[0])==strtolower($user))

{echo "Има такъв USER.<br>
Изберете друго потребителско име.";
echo'<META HTTP-EQUIV="Refresh"
CONTENT="2; URL=register.html">';
exit;
}

}


$pas=$HTTP_POST_VARS['pas'];
$pas=md5($pas);
$ip = getenv("REMOTE_ADDR");
$zapis=$user.'&'.$pas.'&'.$ip." \n" ;
$fp = fopen ( "db.inc" ,"a");
fwrite($fp, $zapis );
fclose($fp);
?>

<b>
<font color=#ff0000>
РЕГИСТРАЦИЯТА Е УСПЕШНА!<br>
<font color="#ff0000">
МОЛЯ, ИЗЧАКАЙТЕ......
<META HTTP-EQUIV="Refresh"
CONTENT="3; URL=login.html">'



Файла registerzapis.php започва пак с проверки дали са попълнени всички полета.
След това:
$user=$HTTP_POST_VARS['user']; - $user става равно на изпратеното от формуляра
$user=str_replace(" ","",$user); - махат му се всички бели полета
if(!eregi('^[a-zA-Z0-9_]+$',$user))- проверява се дали съдържа само латински букви и цифри
{echo'Потребителското име може да съдържа само латински букви и цифри от 0 до 9';
exit;}
$file= file("db.inc");
$n=count($file);

for ($i=0; $i<$n;$i++)- с този цикъл се обхождат всички регистрирани потребители
и се търси дали няма съвпадение.Не трябва да има двама потребителя с едно и също
потребителско име.
{
$line = explode ("&",$file[$i] );
if (strtolower($line[0])==strtolower($user))

{echo "Има такъв USER.<br> - в случай че има вече такъв user се изкарва това съобщение
Изберете друго потребителско име.";
echo'<META HTTP-EQUIV="Refresh"
CONTENT="2; URL=register.html">';
exit;
}

}


$pas=$HTTP_POST_VARS['pas'];
$pas=md5($pas);-паролата се криптира преди да се запише в файла db.inc
$ip = getenv("REMOTE_ADDR");- IP адреса на потребителя също се записва
$zapis=$user.'&'.$pas.'&'.$ip." \n" ;
$fp = fopen ( "db.inc" ,"a"); -добавя новия потребител,паролата му(криптирана) и Ip адреса.
fwrite($fp, $zapis );
fclose($fp);
?>

<b>
<font color=#ff0000>
РЕГИСТРАЦИЯТА Е УСПЕШНА!<br>
<font color="#ff0000">
МОЛЯ, ИЗЧАКАЙТЕ......
<META HTTP-EQUIV="Refresh"
CONTENT="3; URL=login.html">- Изкарва му съобщение че е регистриран и го редиректва към login.html



secret.php

<?
session_start();

?>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
</head>
<body>

<?

if (isset($HTTP_SESSION_VARS['user']))
{
$user=$HTTP_SESSION_VARS['user'];

}
else
{
echo "Нямате достъп до тази страница";
exit;
}

echo "Здравей ".$user.".<br>Това е първата защитена страница.<br>Вие имате свободен достъп до нея .<br><a href=secret2.php>Към втората защитена страница</a>";
?>
</body>


secret.php е просто една страница която може да се разглежда само от регистрирани потребители.
Всички такива страници трябва да започват с следния код:
<?
session_start();

if (isset($HTTP_SESSION_VARS['user']))
{
$user=$HTTP_SESSION_VARS['user'];

}
else
{
echo "Нямате достъп до тази страница";
exit;
}
?>
Останалото надолу може да е HTML,javascript,PHP но е го виждат само логнати потребители.


secret2.php
<?
session_start();

?>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
</head>
<body>

<?

if (isset($HTTP_SESSION_VARS['user']))
{
$user=$HTTP_SESSION_VARS['user'];

}
else
{
echo "Нямате достъп до тази страница";
exit;
}

echo "Здравей ".$user.".<br>Това е втората защитена страница.<br>Вие имате свободен достъп .";
?>
</body>


Ако има нещо неясно питайте тук
Урока е подготвен специално за http://web-tourist.net



/ Трябва да сте регистриран за да напишете коментар /
От: moonwalker_girl
16:31 11-10-2009
Първо да се извиня за глупавия въпрос, но съм много нова...
Когато се регистрирам ми излиза ето това -> http://i38.tinypic.com/nlc55h.jpg
и след като ме превъхри към login естествено ми казва, че потребителя ими името не са валидни. Какво не правя, както трябва?
От: despper
21:10 11-10-2009
и при мен е същото ! help !?
От: vencisf
12:14 28-11-2009
Системата работи но няма никаде да се активира
От: chepa
20:26 21-08-2010
s
От: chepa
20:26 21-08-2010
s
От: thezero
4:02 30-08-2010
Оср**си са брат :)
1