[php][mysql]Cookies i id z bazy

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

[php][mysql]Cookies i id z bazy

Post autor: Strachu »

Witajcie, to znowu ja i moje problemy :lol:
Dobra, przejdźmy do rzeczy. Mam następujący problem:
Chciałem zrobić formularz logowania, który potem w cookies będzie trzymał id zalogowanego usera z bazy, ale napotkałem się na taki problem:
W pliku login.php wstawiony mam taki fragment kodu:
[php]<?php
$give_id = mysql_query("SELECT id FROM " .$prefix. "users WHERE (username = '$username') AND (pass = '$haslo')");
$user_id = mysql_num_rows($give_id);
setcookie("logged", 2, time()+3600);
setcookie("login", $user_id, time()+3600);
echo "Logowanie zakończone powodzeniem<BR>Kliknij <a href=index.php>Tutaj</a>, aby wejść na stronę główną.";
mysql_close();
?>[/php]
A w pliku index.php:
[php]<?php
IF ($_COOKIE[logged]!=2) {
echo "<CENTER><a href=login.php>Zaloguj</a><BR>";
echo "<a href=register.php>Rejestracja</a><BR></CENTER>";
require "includes/page_footer.php";
}
IF ($_COOKIE[logged]==2) {
$userdata[id] = $_COOKIE[login];
$sql[username] = "SELECT username FROM " .$prefix. "users WHERE (id = '$userdata[id]')";
$userdata[username] = mysql_num_rows(mysql_query($sql[username]) );
echo "<CENTER><a href=login.php?logout=1&login=2>Wyloguj</a><BR>";
echo "Witaj, " .$userdata[username]. " na forum.<BR> Miłego testu.</CENTER>";
require "includes/page_footer.php";
}
?>[/php]
To były fragmenty kodów tych plików, a teraz opis problemu:
W pliku login.php ciasteczko 'login' powinno mieć wartość zmiennej $user_id, która pobiera id aktualnie logującego się usera z bazy.
I tu jest problem, bezwzględu na to jaki user się zaloguje, wartość ciasteczka 'login' będzie wynosiła ID pierwszego usera!!!

Jak poprawić ten kod, aby wartość ciasteczka 'login' wynosiła ID obecnie logującego się usera, a nie admina??

Bardzo proszę o pomoc.
FanFataL
Nowy
Nowy
Posty: 113
Rejestracja: pn lut 28, 2005 1:33 am
Lokalizacja: Kraków / Katowice / Bydgoszcz
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: FanFataL »

Logowania nie robi się na cookiesach tylko na sesjach !!

Pozdrawiam :wink:
...
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: viraptor »

Uuu.. a czemu pobierasz ilość wyników? :)
$user_id = mysql_num_rows($give_id);
Może lepiej $user_id=mysql_fetch_array($give_id)['id']; ? :)


PS1. A pozatym popieram - logowanie robi się na sesjach. (inna sprawa, że sesje zwykle używają cookies ;) )
PS2. Jak ktoś ma cookie, że jest zalogowany, to i tak sprawdzaj jeszcze raz hasło i usera. Jak tego nie zrobisz, to wystarczy sobie ustawić 2 ciasteczka i bez hasła jesteś zautoryzowany.
FanFataL
Nowy
Nowy
Posty: 113
Rejestracja: pn lut 28, 2005 1:33 am
Lokalizacja: Kraków / Katowice / Bydgoszcz
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: FanFataL »

viraptor pisze:Uuu.. a czemu pobierasz ilość wyników? :)
$user_id = mysql_num_rows($give_id);
Może lepiej $user_id=mysql_fetch_array($give_id)['id']; ? :)
Hmm - w ten sposób to raczej będzie parse error ;] [php]<?php
// ...
$user_id=mysql_fetch_array($give_id);
$user_id=$user_id['id'];
// ...
?>[/php]
viraptor pisze:PS1. A pozatym popieram - logowanie robi się na sesjach. (inna sprawa, że sesje zwykle używają cookies ;) )
PS2. Jak ktoś ma cookie, że jest zalogowany, to i tak sprawdzaj jeszcze raz hasło i usera. Jak tego nie zrobisz, to wystarczy sobie ustawić 2 ciasteczka i bez hasła jesteś zautoryzowany.
To że sesje używają cookie to nic nie znaczy bo do cookie jest przekazywany tylko identyfikator sesji, zreszta nie trzeba uzywac cookie - można session_id przekazywać getem w urlu ;)
Identyfikator sesji nic nie da użytkownikowi, który by chcial sobie podmienić ciacho - natomiast jakby w ciachu miał user_id no to wystarczy ze sobie go podmieni i KLOPS !! ;D

Pozdrawiam :wink:
...
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: viraptor »

FanFataL pisze:Hmm - w ten sposób to raczej będzie parse error ;]
Prawda, prawda... ale takie są wyniki, jak się w jednym oknie pisze w jednym języku, w drugim w innym, a odpisuje się na posta w jeszcze innym ;)
Swoją drogą - mogliby taką składnie dodać do php - $var=func()['index']. Przydałaby się czasem.
FanFataL pisze:Identyfikator sesji nic nie da użytkownikowi, który by chcial sobie podmienić ciacho - natomiast jakby w ciachu miał user_id no to wystarczy ze sobie go podmieni i KLOPS !! ;D
No właśnie - z tym logowaniem, to chodziło mi o pierwotną sytuację - ciastko 'logged' i ciastko 'userid' - wtedy zawsze trzeba sprawdzać dane ponownie. W przypadku sesji to już nie obowiązuje.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql]Cookies i id z bazy

Post autor: Strachu »

No to przeniosłem się z cookies na sesje. I po przemianie tak u mnie wygląda kod:
[php]<?php
$give_id = mysql_query("SELECT id FROM " .$prefix. "users WHERE (username = '$username') AND (pass = '$haslo')");
$user_id = mysql_fetch_array($give_id);
$user_id = $user_id[id];
IF ($_SESSION[logged] == 2) {
session_destroy();
}
session_start();
$_SESSION[userdata] = get_userdata($user_id, $dbconnect);
$_SESSION[logged] = 2;
echo "Logowanie zakończone powodzeniem<BR>Kliknij <a href=index.php?" .SID. ">Tutaj</a>, aby wejść na stronę główną.";
mysql_close();
}
IF ($_GET[logout]==1) {
$_SESSION[logged] = 0;
session_destroy();
echo "Zostałeś wylogowany.<BR>Kliknij <a href=index.php>tutaj</a>, aby powrócić na forum.";
}
?>[/php]
I mam pytanie:
Głównie mi chodzi o to, że jak logowanie się zakonczy to wyświetla tekst "Logowanie zakończone, kliknij..." No i gdy klikam w link to zamiast po znaku zapytania powinien wyświetlać mi się:
PHPSESSID={id}
To zamiast tego nic mi się nie wyświetla :/
Jak pierwszy raz uruchomiłem logowanie z sesjami to mi się pokazało id sesji, a teraz nie pokazuje :?

Co może być powodem tego, że id sesji nie jest wyświetlane w adresie URL?
FanFataL
Nowy
Nowy
Posty: 113
Rejestracja: pn lut 28, 2005 1:33 am
Lokalizacja: Kraków / Katowice / Bydgoszcz
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: FanFataL »

To, że id sesji nie idzie via url to nie znaczy że sesji nie ma - jej identyfikator przechowuje ciacho ;]

Pozdrawiam :wink:
...
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql]Cookies i id z bazy

Post autor: Strachu »

Dzięki, a można zrobić tak, aby id sesji było przechowywane tylko w URL?
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: viraptor »

Można, ale nie jest polecane (głównie ze względu na kopiowanie takiego linka przez userów w całości :) ) - w php.ini (http://www.php.net/manual/en/ref.session.php):
session.use_cookies=0
session.use_only_cookies=0
session.use_trans_sid=1
Nie jestem pewny, czy można to ustawić w czasie wykonania skryptu...
A id sesji możesz wziąść z session_id() jak jest w ciastku albo linku. SID będzie ustawiony tylko z linka.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql]Cookies i id z bazy

Post autor: Strachu »

Jak zniszczyć sesję, gdy chcę się wylogować? Bo ja nie mogę. :?
Dałem funckę session_destroy() i zamiast zniszczyć sesję to wyświetla mi błąd :(

Wie ktoś jak zniszczyć tą sesję?
viraptor
Zaczyna działać
Zaczyna działać
Posty: 633
Rejestracja: pn cze 28, 2004 12:58 pm
Kontakt:

Re: [php][mysql]Cookies i id z bazy

Post autor: viraptor »

Jaki błąd dokładnie?
A jeśli sesje masz tylko do logowania, to możesz nawet takiemu gościowi zostawić sesje na jakiś czas, tylko np. przy wylogowaniu ustawić logged=0 i wyzerować user_id, bo i tak kiedyś wejdzie jeszcze raz i się będzie logował.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql]Cookies i id z bazy

Post autor: Strachu »

Dzięki za radę :wink:
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql]Cookies i id z bazy

Post autor: Strachu »

Kolejny problem :? :
W jednej z podstron skryptu, gdy się odświerzy tą podstronę lub uruchomi poraz drugi to gubiona zostaje sesja :cry: Nie wiem dlaczego.
Wie ktoś dlaczego i jak się tego pozbyć?

Poniżej są pełne kody plików:
[php]<?
// Plik profile.php
include "config.php";
include "includes/connect.php";
include "includes/function.php";

session_start();

include "includes/page_header.php";
$mode = $_GET[mode];
$id = $_GET[id];

IF ($mode) {
SWITCH ($mode) {
CASE 'viewprofile' :
include "includes/profile_view.php";
BREAK;
CASE 'edit' :
include "includes/profile_edit.php";
BREAK;
}
} elseif (!$mode) {
echo ("Parametr mode nie został określony!!!");
}
require "includes/page_footer.php";
// Koniec pliku profile.php
?>[/php]
[php]<?
// includes/profile_edit.php
IF ($_SESSION[logged]==2) {
IF ($submit) {
$error = '';
$email = addslashes($_POST[email]);
$haslo = $_POST[haslo];
$new_haslo = md5($_POST[new_haslo]);
$confirm_new_haslo = md5($_POST[confirm_new_haslo]);
$miejsce = addslashes($_POST[u_from]);
IF ($new_haslo != '' || $confirm_new_haslo != '') {
IF ($haslo=='' && $new_haslo || $confirm_new_haslo) {
$error .= 'Jeśli chcesz zmienić hasło na nowe musisz wpisać obecne!<BR>';
$error_sql = true;
}
IF (!check_user_pass($_SESSION[userdata][username], $haslo, $dbconnect) ) {
$error .= 'Wpisałeś błędne hasło w pole "Obecne hasło"!!!<BR>';
$error_sql = true;
}
IF ($new_haslo != $confirm_new_haslo) {
$error .= 'W pole "Nowe hasło" i "Potwierdź nowe hasło" podano dwa różne hasła!!!<BR>';
$error_sql = true;
}
}
IF ($email=='') {
$error .= 'Musisz podać adres e-mail!<BR>';
$error_sql = true;
}
IF (!$error_sql) {
IF ($new_haslo=='') {
$new_haslo = $_SESSION[userdata][pass];
}
$sql = "UPDATE " .$prefix. "users SET email = '$email', pass = '$new_haslo', u_from = '$miejsce' WHERE id = '$_SESSION[id]'";
@mysql_query($sql) OR die("Wystąpił błąd przy aktualizacji profilu:<BR>" .mysql_error() );
@mysql_close();
}
}
?>
<FORM ACTION="<? echo ("profile.php?mode=edit&" .SID) ?>" METHOD="POST">
<TABLE border=0 width=100%><TR><TD>
<TABLE border=0 width=100%>
<TR align="center">
<TD><FONT FACE="Courier new" SIZE=2><? echo $error ?></FONT></TD>
</TR>
<TR align="center">
<TD><FONT FACE="Courier new" SIZE=3><B>Podstawowa konfiguracja:</B></FONT></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=1>Wszystkie pola z * są obowiązkowe.</FONT></TD>
<TD></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=2><B>Nazwa użytkownika:</B></FONT></TD>
<TD><FONT FACE="Courier new" SIZE=2><? echo $_SESSION[userdata][username] ?></FONT></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=2><B>E-Mail*:</B></FONT></TD>
<TD><FONT FACE="Courier new" SIZE=2><INPUT TYPE="POST" name="email" value="<? echo $_SESSION[userdata][email] ?>"></FONT></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=2><B>Obecne hasło:</B></FONT></TD>
<TD><FONT FACE="Courier new" SIZE=2><INPUT TYPE="PASSWORD" name="haslo"></FONT></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=1>Wpisz obecne hasło, aby poniżej je zmienić.</FONT></TD>
<TD></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=2><B>Nowe hasło:</B></FONT></TD>
<TD><FONT FACE="Courier new" SIZE=2><INPUT TYPE="PASSWORD" name="new_haslo"></FONT></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=1>Wpisz nowe hasło, które chcesz używać zamiast starego.</FONT></TD>
<TD></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=2><B>Potwierdź nowe hasło:</B></FONT></TD>
<TD><FONT FACE="Courier new" SIZE=2><INPUT TYPE="PASSWORD" name="confirm_new_haslo"></TD>
</TR>
<TR align="center">
<TD><FONT FACE="Courier new" SIZE=3><B>Dodatkowa konfiguracja:</B></FONT></TD>
</TR>
<TR align="left">
<TD width=25%><FONT FACE="Courier new" SIZE=2><B>Skąd:</B></FONT></TD>
<TD><FONT FACE="Courier new" SIZE=2><INPUT TYPE="POST" name="u_from" value="<? echo $_SESSION[userdata][u_from] ?>"></FONT></TD>
</TR>
<TR align="left">
<TD width=50%><CENTER><INPUT TYPE="SUBMIT" value="Wyślij" name="submit"></TD>
<TD width=50%><CENTER><INPUT TYPE="RESET" value="Wyczyść"></TD>
</TR>
</TABLE></TD></TR></TABLE>
<?
} elseif ($_SESSION[logged]!=2) {
header ("Location: login.php");
}
?>[/php]
[php]function get_userdata($id, $dbconnect) {
global $prefix;
$sql = "SELECT * FROM " .$prefix. "users WHERE (id = '$id')";
$query = @mysql_query($sql);
IF (!$query) {
echo mysql_error() . "<br>";
echo "Nie można wykonać zapytania do bazy danych!!!";
}
$data = mysql_fetch_array($query);
IF (!$data) {
echo mysql_error() . "<br>";
echo "Nie można pobrać wyników z bazy danych!!!";
}
return ($data);
} //get_userdata[/php]

Wie ktoś może co powosuje zgubienie sesji po odświerzeniu lub kolejnym wejściu na podstonę i jak się tego pozbyć?
Link do tej podstrony na stronie głównej prowadzony jest w ten sposób:
[php]<?php
<a href="<? echo ("profile.php?mode=edit&" .SID) ?>">Edytuj profil</a>
?>[/php]

Proszę o pomoc.
Strachu
Nowy
Nowy
Posty: 32
Rejestracja: pt lip 08, 2005 10:28 am

Re: [php][mysql]Cookies i id z bazy

Post autor: Strachu »

Witajcie, doszłem do wniosku, że błędu nie generuje żaden z powyższych plików tylko plik includes/page_header.php, który jest załączany do tego pliku.
Oto jego kod:
[php]
<?
IF ($_SESSION[logged]!=2) {
$_SESSION[id]=1;
$_SESSION[userdata] = get_userdata($_SESSION[id], $dbconnect);
?>
<TABLE border=0 width=100%><TR><TD align="center" style="BORDER-LEFT: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; BORDER-TOP: #000000 1px solid;"><BR>
<TABLE border=0 width=95%>
<TR>
<TD align="left" width=35%>  <a href="<? echo $server_name ?>/<? echo $script_path ?>/index.php"><IMG src="images/logo.gif" border=0 alt="<? echo $forum_title ?> Strona główna"></IMG></a></TD>
<TD align="center" width=65%><TABLE border=0 width=100%><TR><TD><? echo $_forum_title ?><BR><BR><? echo $_forum_description ?></TD></TR>
<TR>
<TD align="center"><a href="member.php">Użytkownicy</a>  |  <a href="register.php">Rejestracja</a><BR>
<a href="login.php">Zaloguj</a></TD>
</TR></TABLE></TR></TABLE>
<?
}
IF ($_SESSION[logged]==2) {
$_SESSION[userdata] = get_userdata($_SESSION[id], $dbconnect);
?>
<TABLE border=0 width=100%><TR><TD align="center" style="BORDER-LEFT: #000000 1px solid; BORDER-RIGHT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; BORDER-TOP: #000000 1px solid;"><BR>
<TABLE border=0 width=95%>
<TR>
<TD align="left" width=35%>  <a href="<? echo $server_name ?>/<? echo $script_path ?>/index.php"><IMG src="images/logo.gif" border=0 alt="<? echo $forum_title ?> Strona główna"></IMG></a></TD>
<TD align="center" width=65%><TABLE border=0 width=100%><TR><TD><? echo $_forum_title ?><BR><BR><? echo $_forum_description ?></TD></TR>
<TR>
<TD align="center"><a href="<? echo ("member.php?" .SID) ?>">Użytkownicy</a><BR>
<a href="<? echo ("profile.php?mode=edit&" .SID) ?>">Edytuj profil</a>  |  <a href="<? echo ("login.php?login=3&logout=1&" .SID) ?>">Wyloguj</a></TD>
</TR></TABLE></TR></TABLE>
<?
}
?>[/php]

Co w Tym pliku jest źle?

EDIT:
Problem rozwiązany! :-D
bwo
Przelotem
Przelotem
Posty: 224
Rejestracja: wt cze 07, 2005 1:50 pm

Re: [php][mysql]Cookies i id z bazy

Post autor: bwo »

Jak rozwiązałeś? :)
ODPOWIEDZ