download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Логин форма с админ панел

Автор
Съобщение
nik2009
Съб, 17.11.12, 22:20
Здравейте, ето каква логин форма намерих, много е функционална и хубава - loginform.rar. Моля някой да ми помогне за нея защото виждам, че работи, но нещо не й достига. Ето каква грешка дава отначало още - /на картинката/

Как да се оправи, моля ви да я оправите ако имате време. И друго - пише още, че не съществува файл config.php. Какъв е този файл няма го в системата и как да се направи? Какво съдържа?

редактиран от nik2009 на 17.11.12 22:21
редактиран от nik2009 на 17.11.12 22:22
редактиран от nik2009 на 17.11.12 22:22
krum
Нед, 18.11.12, 23:24
Причината за това съобщение е, че най-вероятно не сте попълнили име на база данни, потребител и парола във файла connect.php
nik2009
Вто, 20.11.12, 21:50

RE: Логин форма с админ панел

” Причината за това съобщение е, че най-вероятно не сте попълнили име на база данни, потребител и парола във файла connect.php „
Благодаря ви! Много ми помогнахте, всичко работи сега. В няколко от файловете трябваше да напиша името на БД, името на потребител, паролата и локалхоста.
 А сега да попитам най-най-важното за мен - как да свържа логинформата със системите за коментари, които имам в сайта? Целта е да могат да пишат съобщения само регистрираните. Как примерно една страница, в която има система за коментар може да се свърже с логин формата? Дайте ми някакви насоки.
редактиран от nik2009 на 20.11.12 21:51
редактиран от nik2009 на 20.11.12 21:56
nik2009
Сря, 21.11.12, 22:31

RE: RE: Логин форма с админ панел

Как да свържа логинформата със системите за коментари, които имам в сайта? Целта е да могат да пишат съобщения само регистрираните.
anonymous
Пет, 23.11.12, 03:20
Мда, това ще е дълъг пост...
Едно от решенията на въпроса може да изглежда така:

В твоята Login форма (login.php), ако потребителя е влезнал успешно имаш:
session_register("user"); 
session_register("pass");

което не е лошо, но не прави кой знае какво. По- добрия вариант, освен да регистрираш елемент в масива да му зададеш и стойност. Но за целта малко трябва да си промениш и кода при влизането (login).
От:
$sql="SELECT * FROM $tbl_name WHERE user='$user' and pass='$pass'";

на:
$sql="SELECT * FROM $tbl_name WHERE user='$user' and pass='$pass' LIMIT 1";

Не е много вероятно, но все пак може да има повече от един потребители с едно и също име, че и с еднаква парола.
Тука е момента да ти обърна внимание, че не филтрираш подаваните данни от потребителя. Тоест, лесно може да се извлече информацията от базата данни, да се подмени и... и не само. Но, да се върна на въпроса. Така подменен кода следва и да променим от:
session_register("user"); 
session_register("pass");

на:
$_SESSION['userID'] = $result['id'];

Тука не ни трябва паролата му. Тя си е негова и нас не ни интересува. Трябва ни ID то от базата, а след това по него може да извлечем всичката информация, която е записана там за него.

Така, какво направихме до тука. Потребителя отваря сайта. Трябва да влезне в системата. Ако е въвел правилните име и парола влиза, а ние му прихващаме ID то от базата с данни. Това ID до регистрираме в глобалния масив $_SESSION с елемент userID и стойност самото ID. Тези данни ги размятаме постоянно през страниците, които посещава. Накратко: Разполагаме с ID то от таблицата, където се съдържат всички данни за даден потребител. Тоест, по всяко време може да извлечем името му, телефона, или каквато там информация имаме за него. Забележка: За да няма повече от един потребител с едно и също име(потребителско) и недай си и с една и съща парола при регистрацията трябва да обърнеш внимание на това.

До тука нищо по въпроса ти, нали? :) Но сега! Понеже не намерих в кода, който си дал файл със самата система за коментари ще трябва да си напаснеш следващите неща:
<?php session_start();
//код код код твой код код код
if ($_SESSION['userID'])
    echo '<a href="comments.php?do=Comment">Оставете Вашият коментар</a>'; // или кото там
else
    echo 'За да оставите коментар трябва да сте влезли в системата! <a href="login.php">Влез</a> или <a href="register.php">Регистрирай се!</a>';
// код код код твой код код код
?>

Тоест, ако в глобалния масив $_SESSION имаме елемент userID и той има някаква стойност, значи, че потребителя вече е влезнал(се е "логнал") и може да остави коментар. Но, ако това не е така(else) го подканване или да влезне в системата за да може да остава коментар, или да се регистрира, за да може да влезне и остави коментар.

П.С.: Ако, ни трябват някакви данни за потребителя(понеже знаем ID на записа в таблицата с потребители) винаги може да ги извлечем с
$row = mysql_query("SELECT FROM $tbl_name WHERE id='$_SESSION[userID]'");
// и последващи
$userName = $row['user_name'];
//според зависи наименованията на полетата в таблицата 
 

Надявам се да съм ти бил полезен. Ако, не си имал предвид това във въпроса си приеми извиненията ми.

Поздрави!

nik2009
Пон, 26.11.12, 22:24

RE: Логин форма с админ панел

Точно това ми трябваше, много съм ти благодарен. Сега се мъча да напасвам кода към системата за коментари. промених както ми показахте кода за проверката на съвпадащи имена. Ако има нещо ще пиша.
nik2009
Нед, 02.12.12, 10:41

RE: RE: Логин форма с админ панел

Искам да попитам как мога да направя всички файлове от логин формата, например файла с регистрацията, файла със линка за logout да се показват в една и съща страница? В страницата искам да има малко място /кутийка/, където да се показват нещата, свързани с потребителя - ако иска да се регистрира да му се открие формичката за регистриране, ако иска да си прочете съобщенията да му излязат отново в същата кутиика. Не искам така да са на отделни файлове. Успях само индекса на логинформата да поставя в началната страница на сайта с include (). Но само формата за влизане изкарвам, а когато цъкна на "регистрация" - полетата за регистриране излизат на отделна страница. Искам да излезат в същата страница.
nik2009
Пон, 03.12.12, 13:42

RE: RE: RE: Логин форма с админ панел

Моля някой да помогне.
anonymous
Чет, 06.12.12, 14:38
Хайде пак едно "кратко" постче :)
Това, което искаш е лесно постижимо. Но първо да се извиня: Не разполагам с много време за да прегледам отново файловете ти с кода. Затова ще ти създам примерна структура на сайт, а ти ще трябва да си напасваш нещата според твоя сайт.

И така ще създадем един сайт, който визуално ще е от 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 с включването на:
session_start();

след което ще си подсигурим избягването на показването показването на разни предупреждения, които не са от значение в случая. Ще си дефинираме променлива, която ще ни служи другите файлове да работят само, ако са извикани(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.

Поздрави.

anonymous
Чет, 06.12.12, 22:59
lotsofsex ако това е кратко постче, представям си как би изглеждало дългото
insecteater
Пет, 07.12.12, 08:20
Браво на lotsofsex за труда и че се е наканил да даде такова подробно описание
nik2009
Нед, 09.12.12, 08:36

RE: Логин форма с админ панел

” Вече си се досетил, че трябва да попреработиш кода във всеки файл, който мислиш да викаш от index.php. Мисля, че няма да е проблем от сега нататъка да се справиш с това. Разбира се във файловите, в които ще даваш стойност на $out може да извършваш всякакви проверки, стига да са php легитимни.
Единствено трябва да внимаваш за секция N:4 foother.php. Там зададеш ли стойност на $out, то тя няма да се реализира по простата причина, че викането на foother.php се извършва след като вече е изведено съдържанието на $out.

Поздрави. „

Много ти благодаря, задължен съм, че толкова време си отделил и си описал всичко. Почвам да го преправям както си обяснил. Много изчерпателно и добре си ми го показал.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.