Не регистрира данните в сесията

metal_head

Registered
Здравейте. Опитвам се да направя елементарна логин система, но все нещо ме спира. В случая вече нямам никакво обяснение защо не се получава.

Накратко в конфигурационния файл имам стартирана сесия и отдолу две променливи:

Код:
$username = $_SESSION['username'];
$password = $_SESSION['password'];


След това във файла на хедъра си (който се инклуудва след конфигурационния файл) имам една проверка:

Код:
if(!$username && !$password) login_form();
else echo "Здравей, ".$username;

Тоест ако нямам $username и $password да ми покаже формата за логин (която е с метод post).

До тук добре. Сега аз си записвам данните във формата за логин и цъкам бутончето за събмит. Кода ме препраща на страницата, където ще ми се провери дали потребителя ми и паролата са валидни. Там взимам данни от базата данни:

Код:
$logname = $_POST['username'];
$logpassword = md5($_POST['password']);
$result = mysql_query("SELECT * FROM users WHERE username='$logname'"); 
$row = mysql_fetch_array($result); 
$user = $row['username'];
$pass = md5($row['password']);

След това се правят проверки и ако всичко е наред, накрая идва регистрацията в сесията:

Код:
session_register("username", $user);
echo "<br> Username registered in session as ".$user; 
session_register("password", $pass); 
echo "<br> Password registered in session as ".$pass;

Тук съм сложил echo, за да ми покаже какви данни регистрирам.

Проблема е, че echo-то си показва името на потребителя (което е взето от базата данни), паролата също, но в сесията нищо не се променя и $username и $password съответно остават празни. Следователно и формата за логин в хедъра остава.
Какъв е проблема тук?

:roll:
 
Метода ти е много грешен.
Ти при вход трябва да създаваш сесия.
Също и проверката за вход е грешна.
Ето ти примерен код.

config фаил

PHP:
session_start(); // стартираш сесията
// mysql_connect(); // връзка с mysql сървъра
// mysql_select_db(); // избираш база данни

Таблицата в базата да речем се казва users с полета id, username, password.

При входа кода ще ти е така:

PHP:
// include "config фаил";
$user = htmlspecialchars($_POST['username']); // подаваш го от формата.
$pass = md5($_POST['password']); // отново го подаваш от формата.
$a = mysql_query("SELECT * FROM users WHERE username='$user' and password='$pass'") or die(mysql_error());
$b = mysql_num_rows($a);
if ($b > 0)
{
// ако резултата е повече от 0 (т.е. открит е потребител с тази парола) 
$_SESSION['username'] = $user; //създаваме сесия с име username
}
else
{
// ако резултата е 0 (т.е. не е открит потребител с тази парола)
echo "грешка"; // връщаме грешка.
}

При изход ще ти е така:

PHP:
include "config фаил";
session_destroy();
echo "излезнахте успешно";

А проверката за логин форма ще е така:

PHP:
include "config фаил";
if (!isset($_SESSION['username']))
{
// логин форма
}
else
{
// тук часта която ще се вижда само ако си се логнал.
}

И за регистрация съответно

PHP:
include "config фаил";
// форма за регистрация

// и тук вече самата регистрация:
$user = htmlspecialchars($_POST['username']);
$pass = md5($_POST['password']);
if (!empty($user) and !empty($_POST['password']))
{
// ако полетата за име и парола не са празни ще запишем в базата данни.
mysql_query("INSERT INTO users (username,password) VALUES ('$user','$pass')") or die(mysql_error());
echo "вие се регистрирахте успешно.";
}
else
{
echo "не сте попълнили всички полета";
}

За да изведеш потребителското име може да създадеш променлива.
Примерно

PHP:
$ime = $_SESSION['username'];
// като трябва най-отгоре да си стартирал сесията с session_start(); или просто да include-неш config файла ;)

При вход и регистрация имената на полетата за име и парола са username и password . ;)

Ако имаш въпроси/проблеми - питай ;)
 
Е..ама аз повечето неща от тези съм ги направил, просто спестих проверяването например. Имам си връзка към базата данни, имам си форма за регистрация, която успешно прави записи в базата данни, ако е попълнена коректно и така.

Сега, твоя пост ме накара да се замисля дали използвам правилно session_start(), защото аз го имам включен в конфигурационния файл, което значи, че имам session_start() дефакто на всяка страница в сайта ми, независимо каква е. Това предполагам не е добре.

Код:
include "config фаил";
session_destroy();
echo "излезнахте успешно";

А това за изхода не го разбрах много - много. Защо трябва да инклуудвам конфигурационния файл?


А изобщо със сесии ли трябва да е цялата тая работа с логина или е по-добре да се използват бисквитки?
 
В logout файла се include config файла защото преди session_destroy(); трябва да има session_start(); и тъй като сесията се стартира в config файла за това го include него.
А относно сесията ти проверяваш за променлива $user = $_SESSION['username']; , но въпроса е че първо трябва да я създадеш.
При успешен login създай $_SESSION['username'] = $името_постнато_от_формата
И другото което е че при проверката за вход ти е грешен метода.
Ти извличаш паролата на потребителя и я сравняваш с тази от поста.
Това е грешен метод.
Трябва проверката директно да е where username='името' and password='паролата'
След което с mysql_num_rows или в заявката с COUNT(*) ще преброиш дали е открит такъв запис и ако е открит тогава да създадеш сесията.
А относно това за бисквитки или сесий , лично аз предпочитам работа със сесий.
Само , че ако е с бисквитки имаш възможност да създадеш бисквитка която да се помни дълго време. А при сесий щом затвориш браузъра и сесията изтича.

;)
 
Код:
Трябва проверката директно да е where username='името' and password='паролата'

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

Е, това с num_rows не се бях сетил за него и проверявах поотделно името и паролата, но ще го направя по твоя начин, харесва ми.

Иначе успях да го оправя това нещо с логването. session_register, като го замених просто със $_SESSION = ... всичко е ок. Проблема обаче е, че това се прави след проверката дали има потребителско име и парола и така като се логна формата за логин в хедъра ми остава и трябва да рефрешна страницата, за да се обнови. Има ли начин да зареди главната страница веднага след успешния опит за логин?

И друго да попитам: Точно това мислех за сесиите: че, когато изключиш браузъра, сесията заминава. Как са направени системите, които те запомнят при многократно влизане и излизане от сайта ? Трябва да преправя всичко с бисквитки предполагам. Проблема е, че така паролата може да се открадне...озадачен съм малко.
 
Е добре направих всичко както е описано... тоест аз вече го имах пощи така.
Ето как са ми кодовете.

конфиг фаил:
Код:
<?php  
session_start();

$hostname="localhost"; 
$mysql_login="root"; 
$mysql_password=""; 
$database="user"; 

if (!($db = mysql_connect($hostname, $mysql_login , $mysql_password))){ 
  die("impossível ligar ao MySQL.");     
}else{ 
  if (!(mysql_select_db("$database",$db)))  { 
    die("Impossível ligar a db."); 
  } 
} 
?>

check_login фаил :

Код:
<?php
 include('http://localhost/PAPPAP/connectDB.php');
$tbl_name="members"; 
$username=$_POST['username'];
$password=$_POST['password'];

$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count==1){
$_SESSION['username']=$username; 
header("location:login_success.php");
}
else {
header("location:login_fail.html");
}
?>

логин успешен:
Код:
 <?
 require('http://localhost/PAPPAP/connectDB.php');
if(!session_is_registered(username)){
header("location:main_login.php");
}
?>

<html>
<head>
 <meta http-equiv="refresh" content="4; http://localhost/PAPPAP/main/page1.php"/>
</head>
<body>
Login Successful
<br>
<?php
echo $_SESSION['username'];
?>
</body>
</html>

код на главна страница:
Код:
<?php
 require('http://localhost/PAPPAP/connectDB.php');
                if(isset($_SESSION['username'])) {
				$username=$_SESSION['username'];
		echo "<div id='top' align='right' style='border: 2px solid rgb(255, 255, 255); position: absolute; left: 0px; top: 0px; width:100%; 
				height: 41px; background-color:#000000; layer-background-color:#FFFFFF'>
				<form name='formout' action='http://localhost/PAPPAP/logout.php' method='post'>
				<img align='left' src='http://localhost/PAPPAP/cooltext521689037.gif'/>
				Greetings $username, Welcome to our humble site :) <br>
				<input type='submit' name='logout' value='LogOut'>
				</form>
				</div>;";
		
}else {
			echo"<div id='top' align='right' style='border: 2px solid rgb(255, 255, 255); position: absolute; left: 0px; top: 0px; width:100%; 
				height: 41px; background-color:#000000; layer-background-color:#FFFFFF'>
				<img align='left' src='http://localhost/PAPPAP/cooltext521689037.gif'/>

				<form name='form1' method='post' action='http://localhost/PAPPAP/checklogin.php'>
					<font color='red'>
					<strong>Member Login: </strong>
					Username:
					<input name='username' type='text' id='username'>
					Password:
					<input name='password' type='password' id='password'>
					<input type='submit' value='Login'>
					</font>
					<br>
					<a href='http://localhost/PAPPAP/register.html'> Register here! </a>
				</form>
			</div>;";
	}
?>

Дава ми грешен логин а узера го има в базата данни! И сам сигурен че му вкарвам добре данните.
Каде е грешката? ....
 

Back
Горе