Błędy w sesji?

Tutaj dyskutujemy o PHP oraz zgłaszamy i rozwiązujemy problemy dotyczące tego języka.
ellix2m

Błędy w sesji?

Post przez ellix2m »

Cześć. Tworzę sobie swój system blogowy, oto pliki:

Plik: login_form.php:

Code: Zaznacz cały

<html>
<head>
<title>Logowanie</title>
</head>
<body>
<form method="post" action="proces_login.php">
Login: <input type="text" name="login">
Hasło:<input type="password" name="password">
<input type="submit" value="Zaloguj">
</form>
</body>
</html>
Plik: proces_login.php

Code: Zaznacz cały

<?php
session_start();

if (!isset($_POST['login']) && !isset($_POST['password']) || ($_POST['login'] == '' && $_POST['password'] == ''))
{
	header('Location: login_form.php');
	session_destroy();
	exit;
}

include("database.php");
include("users.php");

$author = getAutor( $_POST['login'], $_POST['password']);

if($author === FALSE) {
	header('Location: login_form.php');
	session_destroy();
	exit;
}

foreach ($author as $klucz => $wartosc) {
	if(!is_numeric($klucz)){
		$_SESSION[$klucz] = $wartosc;
	}
}

header("Location: index.php");

?>
Plik index.php:

Code: Zaznacz cały

<?php
session_start();

$userLogged = false;

if ( isset ($_SESSION['id']))
{
	$userLogged = true;
}
?>

<html>
<head>
<title>Strona główna</title>
</head>
<body>

<?php 

if ($userLogged){
	echo("<a href='logout.php'>Wyloguj</a> <br><br>");
	echo("<a href='add_wpis.php'>Dodaj wpis</a><br><br>");
	echo("<a href='edit_wpis.php'>Edytuj wpis</a><br><br>");
}
else {
	include("login_form.php");
}

include("database.php");

$sql = "SELECT wpisy.tresc, wpisy.data, wpisy.id as wpisy_id FROM wpisy
";

$result = mysql_query($sql) or die(mysql_error());
//tutaj skończyłem
while ($row = mysql_fetch_array($result)){
	echo ("opublikowane: $row[data]");
	if ($row[id] == $_SESSION['id']){
		echo("<a href='edit_wpis.php?advert_id=" .$row['wpisy_id'] ."'> Edytuj</a>");
		echo ("<a href='delete_advertisment.php?advert_id=" .$row['wpis_id']. "'> Kasuj</a>");
		
	}
	
	echo ("<br> $row[tresc] <br><hr>");
	
}

?>

</body>
</html>
Plik edit_wpis.php

Code: Zaznacz cały

<?php
session_start();

$userLogged = false;
if( isset($_SESSION['id'])){
	$userLogged = true;
}
else{
	session_destroy();
	header("Location: index.php");
	exit;
}

if(!isset($_GET['wpisy_id'])){
	header("Location: index.php");
	exit;
	
}

include("database.php");
$sql = "SELECT * from wpisy where id= $_GET[wpisy_id]";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

$wpis_saved = false;
if(isset($_POST['advert'])){
	include ("database.php");
	
	$sql = "UPDATE wpisy SET tresc = '$_POST[advert]', data = NOW() where id = $_GET[wpisy_id]";
}
?>
<html>
<head>
<title>Edytuj wpis</title>
</head>
<body>

<?php 
if (wpis_saved){
	echo ( "Wpis zapisany <a href='index.php'>Strona Główna</a>");
}
?>
<form method="post" action="<?php echo ( $_SERVER['PHP_SELF']); ?>">
<input type="text" name="advert">
<input type="submit">
</form>

</body>

</html>
Plik add_wpis.php

Code: Zaznacz cały

<?php
session_start();

$userLogged = false;
if (isset($_SESSION['id'])){
	$userLogged = true;
}
else{
	session_destroy();
	header("Location: index.php");
	exit;
}

$wpis_saved = false;
if(isset($_POST['advert'])){
	include( "database.php");
	
	$sql = " INSERT INTO wpisy SET 
	tresc = '$_POST[advert]',
	data = NOW() 
	 ";
	if(mysql_query($sql) or die(mysql_error())){
		$wpis_saved = true;
	}
}


?>

<html>
<head>
<title>Dodawanie wpisu</title>
</head>
<body>

<?
if($wpis_saved){
	echo ("Wpis został dodany <a href='index.php'> Strona główna</a>");
	}
	
	?>
<form method="post" action="<?php echo ( $_SERVER['PHP_SELF']); ?>">
<input type="text" name="advert">
<input type="submit">
</form>
</body>
</html>
Plik users.php:

Code: Zaznacz cały

<?php
function getAutor ($login, $password)
{
$sql = "SELECT * FROM autor where name= '$login' and password = '$password'";	
$result = mysql_query($sql);

if ($result === FALSE) {
	return FALSE;
}

while ($row = mysql_fetch_array ($result)) 
{
return $row;	
	
}
return false;
}
?>
Plik logout.php

Code: Zaznacz cały

<?php
session_start();
session_destroy();
header("Location: index.php");
exit;
?>
Gdy nie jestem zalogowany mam przy wpisach "edytuj", "kasuj" gdy się zaloguje już mi to znika. Edycja nie dział ponieważ wtedy nie jestem zalogowany. Przypuszczam że jest jakiś błąd w pliku index.php lub ogólnie z sesjami

Moja baza danych to:
Tabela autor (id, name, password, email)
Tabela wpisy(id, tresc, data)
Proszę o pomoc
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Błędy w sesji?

Post przez Morfidon »

Hej,

Hmm...

W index.php od komentarza: "tutaj skończyłem", jest stworzone porównanie:

Code: Zaznacz cały

 if ($row[id] == $_SESSION['id'])
Pod $_SESSION['id'] nie znajduje się nic, jeżeli jest się wylogowanym.
Pod $_row[id] nie znajduje się nic, bo w zapytaniu sql powyżej wpisy.id as wpisy_id sprawia, że do niby $row[id] można odwołać się tylko $row[wpisy_id]

także:

Code: Zaznacz cały

if ($row[id]==$_SESSION['id']);
zwraca 1, czyli prawdę przez co wyświetla się Kasuj oraz Edytuj.

Powinno być:

Code: Zaznacz cały

if ($row[wpisy_id]==$_SESSION['id']);
Pozdrawiam serdecznie,

Arkadiusz Włodarczyk
ellix2m

Re: Błędy w sesji?

Post przez ellix2m »

Bardzo dziękuję. Jakoś nie mogę zrozumieć tych sesji..
ellix2m

Re: Błędy w sesji?

Post przez ellix2m »

Code: Zaznacz cały

if ($row[wpisy_id]==$_SESSION['id']
niestety nadal mam coś nie tak z sesjami ponieważ nawet gdy jestem zalogowany nie widzę tego
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Błędy w sesji?

Post przez Morfidon »

ID to identyfikator, czyli coś co jest unikalne dla każdego rekordu w tabeli. ID wpisu nie musi być równe ID użytkownika.

Można we wpisach stworzyć dodatkowe pole: "id_uzyt" i w nim przetrzymywać do kogo należy dany wpis.

Tak jak jest teraz można by się zalogować na np. użytkownika z ID 1, a wpis z ID 1 powiedzmy został usunięty więc nigdzie nie będzie "edytuj...".

$_SESSION to tablica, która istnieje od rozpoczęcia sesji DO zamknięcia przeglądarki lub zniszczenia sesji. Do każdej tablicy w PHP można tworzyć nowe przyporządkowania, czyli pisząc

Code: Zaznacz cały

foreach ($author as $klucz => $wartosc) {
   if(!is_numeric($klucz)){
      $_SESSION[$klucz] = $wartosc;
   }
}
Zostało sprawione, że dopóki nie zniszczy się sesji lub użytkownik nie zamknie przeglądarki cały czas pod $_SESSION['id'] = ... (id zalogowanego użytkownika)

Pozdrawiam,

Arkadiusz
ellix2m

Re: Błędy w sesji?

Post przez ellix2m »

O dziękuje bardzo:) Teraz rozumiem:)
Post Reply