Strona 1 z 2

[php][mysql]Cookies i id z bazy

: sob lip 09, 2005 6:50 pm
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.

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

: sob lip 09, 2005 7:58 pm
autor: FanFataL
Logowania nie robi się na cookiesach tylko na sesjach !!

Pozdrawiam :wink:
...

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

: sob lip 09, 2005 9:33 pm
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.

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

: ndz lip 10, 2005 2:25 am
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:
...

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

: ndz lip 10, 2005 11:30 am
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.

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

: ndz lip 10, 2005 12:20 pm
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?

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

: ndz lip 10, 2005 1:02 pm
autor: FanFataL
To, że id sesji nie idzie via url to nie znaczy że sesji nie ma - jej identyfikator przechowuje ciacho ;]

Pozdrawiam :wink:
...

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

: ndz lip 10, 2005 1:10 pm
autor: Strachu
Dzięki, a można zrobić tak, aby id sesji było przechowywane tylko w URL?

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

: ndz lip 10, 2005 1:25 pm
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.

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

: ndz lip 10, 2005 1:48 pm
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ę?

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

: ndz lip 10, 2005 2:16 pm
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ł.

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

: ndz lip 10, 2005 2:44 pm
autor: Strachu
Dzięki za radę :wink:

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

: pn lip 11, 2005 7:58 pm
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.

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

: wt lip 12, 2005 5:36 pm
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

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

: śr lip 13, 2005 6:08 pm
autor: bwo
Jak rozwiązałeś? :)