Хайде пак едно "кратко" постче :)
Това, което искаш е лесно постижимо. Но първо да се извиня: Не разполагам с много време за да прегледам отново файловете ти с кода. Затова ще ти създам примерна структура на сайт, а ти ще трябва да си напасваш нещата според твоя сайт.
И така ще създадем един сайт, който визуално ще е от 4 части:
|------------------------------------------------------------|
| N:1 |
|------------------------------------------------------------|
| | |
| N:2 | N:3 |
| | |
| | |
| | |
| | |
| | |
|------------------------------------------------------------|
| N:4 |
|------------------------------------------------------------| |
Това ще се случва в index.php, където дефакто ще конструираме скелето на сайта, ще вмъкваме други файлове, както и ще правим разни проверки. Горната визуализация ще постигнем лесно с:
<table cellpadding="0" cellspacing="0" border="0" width="1024">
<tr>
<td>
// N:1
</td>
</tr>
<tr>
<td>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="30%">
// N:2
</td>
<td width="70%">
// N:3
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
// N:4
</td>
</tr>
</table> |
N:1 ще поставим лого, текст и разни директни линкове от менюто по сайта като начало, контакти...;
N:2 - освен всичко останало (меню) и "кутийката", която искаш;
N:3 - тука ще се случват нещата, когато потребителя натисне нещо някъде;
N:4 - copyright простотии, кой е създал страницата и други щуротии.
Понеже сайта предполага само регистрирани потребители да може да имат възможност да се възползват от разни екстри ще започнем index.php с включването на:
след което ще си подсигурим избягването на показването показването на разни предупреждения, които не са от значение в случая. Ще си дефинираме променлива, която ще ни служи другите файлове да работят само, ако са извикани(include) от index.php, т.е., ако някой набере директно даден файл, различен от индекса, примерно:
http://site.com/login.php
|
той няма да се изпълни. Разбира се ще извикаме и файла, в който ще са инструкциите за връзка с базата данни. И най- накрая ще затворим връзката към mysql сървъра.
И така нашия index.php вече има следния вид:
<?php // index.php
session_start();
error_reporting(E_ALL ^E_NOTICE);
define ("_ACCESS_DENIED", 1);
include 'mysql.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
// разни други <meta ... /> тагове тука по твое усмотрение
<title>Твоя title тука</title>
</head>
<body>
<table cellpadding="0" cellspacing="0" border="0" width="1024">
<tr>
<td>
// N:1
</td>
</tr>
<tr>
<td>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="30%">
// N:2
</td>
<td width="70%">
// N:3
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
// N:4
</td>
</tr>
</table>
<?php
mysql_close($conn);
?>
</body>
</html> |
Какво има във mysql.php
<?php // mysql.php
defined ('_ACCESS_DENIED') or die ('Permission DENIED!!!');
$conn = mysql_connect('localhost', 'имеЗаMySQL_потребителя', 'паролаЗаMySQL_потребителя') or die ("Can not connect to MySQL server!<br />");
mysql_query('set names utf8', $conn);
mysql_select_db('База_данни_с_която_ще_ работим', $conn) or die ("Can not select date base!<br />");
?> |
Да проследим нещата до момента.
Потребителя зарежда сайта ти. Сайта е готов да работи със сесии session_start();. Стопира се показването на предупреждения. дефинираме си променлива и извикваме mysql.php. Веднъж извикам той проверява дали тази променлива е дефинирана вече. Ако не е предизвикваме спирането на всякакво по нататъшно зареждане на сайта и показваме на потребителя съобщение, че няма права. Тоест mysql.php е извикан директно, а не от index.php. Но ако всичко е наред правим връзка с базата данни и си избираме с коя точно база ще работим. Ако има някаква грешка спираме по нататъшното изпълнение на кода.
До тука ще обърнем внимание, че всеки файл, който се вика (include) от index.php ще започва с
<?php
defined('_ACCESS_DENIED') or die('Permission DENIED!!!''); |
вече обяснихме защо.
Да предположим, че всичко е наред до момента. Потребителя е заредил сайта, връзката с базата данни е успешна. Следващото, което ще направим е да проверим, дали вече потребителя е влезнал в системата или не, и ако не е ще слушаме дали случайно не се опитва да влезне. А ако е вече няма да му се предлага да се регистрира или влезне в системата, а ще му се показват разни информации, които искаш ти.
За да слушаме дали иска да влезне в системата ще използваме:
if (!$_SESSION['userID'] && $_POST['login']) { //...
|
Тоест, ако все още в елемента userID от глобалния масив $_SESSION нямаме записана стойност и бутона с име login и стойност Вход е натиснат(формата за влизане/логване/) е изпратена ще проверим подаваните променливи(име и парола). Ако са верни(имаме записани в базата данни потребител с това име и парола) задаваме стойност на userID от глобалния масив $_SESSION самото id на записа в базата данни. Ако няма съвпадения записваме в променлива($err) съобщение за грешка, което потребителя ще види. За да стане по ясно формата за влизане в системата и линк с предложение за регистрация или забравена парола се намират в login.php:
<?php //login.php
defined('_ACCESS_DENIED') or die('Permission_DENIED!!!');
?>
<FORM method="post" action="">
<table cellpadding="3" cellspacing="3" border="0">
<tr>
<td colspan="2"><?php echo $err; ?></td>
</tr>
<tr>
<td>Име:</td>
<td><input type="text" name="user" style="width:70px" /></td>
</tr>
<tr>
<td>Парола:</td>
<td><input type="password" name="pass" style="width:70px" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="login" value="Вход" />
</tr>
<tr>
<td><a href="?do=register">Регистрация</a></td>
<td><a href="?do=lostPass">Забравена парола</a></td>
</tr>
</table>
</FORM> |
Какво прави този файл(След малко ще видим и къде и кога ще го викаме)? Проверяваме дали е извикан от нашия код. Ако е създаваме една форма, която ще подава данните посредством метода POST. Тази форма ще предаде данните на файла, от който е извикана(action=""), в нашия случай index.php. Във формата има съответните полета с имена и стойности, каквито ни трябват. Бутон за изпълнение на формата и два линка. Обърни внимание на начина на подаване на линковете:
<td><a href="?do=register">Регистрация</a></td>
<td><a href="?do=lostPass">Забравена парола</a></td> |
Вече не съдържат конкретен файл, а просто елемент от глобален масив $_GET. Иначе казано, ако натиснем дадения линк то ще извикаме index.php с параметър:
http://sait.com/index.php?do=register
|
В самия ни индекс ще проверяваме съдържанието на този параметър и според какво е то ще викаме различни страници.
$do = htmlspecialchars($_GET['do']);
if ($do == 'register') include 'register.php'; |
Време е да направим тези неща в нашия index.php
<?php // index.php
session_start();
error_reporting(E_ALL ^E_NOTICE);
define ("_ACCESS_DENIED", 1);
include 'mysql.php';
if ($_POST['letMeOut']) { // потребителя е натиснал Изход
$_SESSION['userID'] = NULL;
session_destroy();
}
if (!$_SESSION['userID'] && $_POST['login']) { // потребителя е натиснал Вход
$user = htmlspecialchars($_POST['user']);
$pass = md5($_POST['pass']);
$test_login = mysql_fetch_array(mysql_query("SELECT FROM users WHERE user_name='$user' AND pass='$pass' LIMIT 1"));
if (mysql_affected_rows() > 0)
$_SESSION['userID'] = $test_login['id'];
else
$err = 'Грешно име и/или парола!';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
// разни други <meta ... /> тагове тука по твое усмотрение
<title>Твоя title тука</title>
</head>
<body>
<table cellpadding="0" cellspacing="0" border="0" width="1024">
<tr>
<td>
// N:1
<?php include 'heder.php'; ?>
</td>
</tr>
<tr>
<td>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="30%">
// N:2
<?php
include 'menu.php';
echo '<br />';
if ($_SESSION['userID'])
include 'userArea.php';
else
include 'login.php';
?>
</td>
<td width="70%">
// N:3
<?php echo $output; ?>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
// N:4
<?php include 'foother.php'; ?>
</td>
</tr>
</table>
<?php
mysql_close($conn);
?>
</body>
</html> |
Ще променим малко и login.php:
<?php //login.php
defined('_ACCESS_DENIED') or die('Permission_DENIED!!!');
$do = htmlspecialchars($_GET['do']);
if ($do == 'register')
include 'register.php';
elseif ($do == 'lostPass')
include 'lostPass.php';
?>
<FORM method="post" action="">
<table cellpadding="3" cellspacing="3" border="0">
<tr>
<td colspan="2"><?php echo $err; ?></td>
</tr>
<tr>
<td>Име:</td>
<td><input type="text" name="user" style="width:70px" /></td>
</tr>
<tr>
<td>Парола:</td>
<td><input type="password" name="pass" style="width:70px" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="login" value="Вход" />
</tr>
<tr>
<td><a href="?do=register">Регистрация</a></td>
<td><a href="?do=lostPass">Забравена парола</a></td>
</tr>
</table>
</FORM> |
Сега, това че прихващаме do параметъра в login.php да не те притеснява. Нека да видим какво се получава. По време на изпълнението на кода от index.php проверяваме дали потребителя вече има назначена сесия(влезнал е вече в системата) и ако има му зареждаме файла, който ще му изкарва разна информация там. Но ако няма викаме файла login.php:
if ($_SESSION['userID'])
include 'userArea.php';
else
include 'login.php'; |
Да предположим, че потребителя не е влезнал в системата и няма регистрация. Формата за влизане си стои (извикали сме login.php), а под бутона Вход си стоят линковете за регистрация и забравена парола. Потребителя натиска на регистрация. Сайта се презарежда. Изпълнението на кода стига отново до момента, където проверява дали потребителя има сесия или не. Няма. Вика се login.php и там се прихваща do. Проверява се дали стойността му отговаря на някакви изисквания. В случая отговаря на register. Вика се файла register.php и отново му се зарежда формата за влизане в системата и линковете за регистрация и забравена парола. Защо? Защото файла register.php няма да прави нищо повече от това да зареди със стойност променливата $out, която се извежда на друго място(N:3). Това е наложено поради факта, че "кутийката" с полетата за вход и линковете за регистрация и забравена парола е много малка като място.
Файла register.php:
<?php //register.php
defined('_ACCESS_DENIED') or die('Permission_DENIED!!!');
$out = <<<END_OF_FILE
<FORM method="post" action="">
<!--
таблица с твоята форма, която
да съсъджа каквито данни искаш за регистрация
-->
</FORM>
END_OF_FILE;
?> |
Проверката за дали е въведено и достоверността на въведеното от тази форма може да направиш или в index.php, или в login.php, или в register.php. Горе долу където си пожелаеш.
Нека да минем стъпките още един път. Потребителя зарежда сайта. Проверява се дали има сесия. Няма. Зареждаме login.php. Потребителя натиска регистрация. Сайта се презарежда. Проверява се дали има сесия. Няма. Зареждаме login.php. Но вече имаме стойност в променливата $do и тя отговаря на проверката в login.php. Зареждаме register.php, който просто задава стойност на $out променливата. Кода ни в index.php продължава да се изпълнява и стига до реда където извеждаме стойността на $out. Кода подължава да се изпълнява.
Разбирта се, още в началото (index.php) проверяваме дали потребителя е натиснал бутона Изход, и ако го е направил унищожаваме сесиата за него.
if ($_POST['letMeOut']) { // потребителя е натиснал Изход
$_SESSION['userID'] = NULL;
session_destroy();
} |
Вече си се досетил, че трябва да попреработиш кода във всеки файл, който мислиш да викаш от index.php. Мисля, че няма да е проблем от сега нататъка да се справиш с това. Разбира се във файловите, в които ще даваш стойност на $out може да извършваш всякакви проверки, стига да са php легитимни.
Единствено трябва да внимаваш за секция N:4 foother.php. Там зададеш ли стойност на $out, то тя няма да се реализира по простата причина, че викането на foother.php се извършва след като вече е изведено съдържанието на $out.
Поздрави.