ugrás a tartalomhoz

A Drupal session kezelőjére hasonlító rendszer

Anonymous · 2006. Már. 27. (H), 18.32
Üdv!

Nos otthoni php szerverem csináltam egy oldalt, ami persze még nagyon az elején van.
A session okat ugyebár alapból a php úgy építi ki hogy létrehoz egy fájlt sess_ésazazonosito amit egy könyvtárba elment,
és az adatokat is ebbe a fájlba menti. Na de én ezt megpróbáltam kiküszöbölni a session_save_path() al ami sikerült is.
A sid (session azonostót), a hostname (ip címet), az uid (felhasználó azonosítója), timestamp (időbélyeget) egy mysql táblába mentettem aminek a neve: session és az oszlopai: uid, sid, hostname, timestamp.
Értelemszerű hogy mit hova írok be.
Nos ez eddig rendben is van csak nem voltam benne biztos hogy ide télleg elmenti vagy csak beírja az adatokat.
Mikor oldalamat feltöltöttem egy nem ingyenes oldal al-domainjára akkor minden ok volt, kivéve akkor mikor megnéztem a session táblát és láttam hogy akárhányszor is frissítem az oldalt nem íródik oda be semmi, sőt a $PHPSESSID -re sem történt semmmi mikor ezt megpróbáltam kiiratni a prin függvénnyel.
Végülis az működött hogy például: print $_SESSION['uid'] akkor kiírta hogy -1 mert az van beállítva.
Az eredeti session 'rendszereben' volt egy olyan sor hogy ha a $PHPSESSID egyenlő a semmivel akkor ne történjen semmi, tehát ne írjon be semmit a mysql táblába, mivel olt arra példa hogy elindítottam a böngészőt és beírt mindent egy sorba csak a sid -et hagyta le, nem tudom hogy miért.
Ezért gondoltam hogy itt valami gond van és ezt a sort kitöröltem, ezután minden működött csak éppen a sid -be ismét nem került be semmi.
Nos itt az eredeti session 'rendszerem':

<?php
$timeseconds = 180;
$timeout = time() - $timeseconds;
mysql_query("DELETE FROM sessions WHERE timestamp<$timeout");
session_save_path("$session_mentes");
session_start();
if (empty($_SESSION['uid'])) {
$_SESSION['uid'] = "-1";
}

$_SESSION['hostname'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['timestamp'] = time();

if ($PHPSESSID == "") {
}
elseif (!sorlekeres("sessions", "sid", "$PHPSESSID")) {
$session_mentes = mysql_query("INSERT INTO sessions (sid, uid, hostname, timestamp) VALUES ('$PHPSESSID', '$_SESSION[uid]', '$_SESSION[hostname]', '$_SESSION[timestamp]')");
}

elseif (sorlekeres("sessions", "sid", "$PHPSESSID")) {
mysql_query("UPDATE sessions set timestamp='$_SESSION[timestamp]' WHERE sid='$PHPSESSID'");
}
?>
Nos itt mit vesztek észre?
Ezalatt azt értem h mik lehetnek itt a hibák vagy az egész úgy ahogy rossz?

Utánna észrevettem hogy az oldal sütikbe menti a session -okat ezért így próbáltam meg az otthoni php szerveremen hogy: $_COOKIE['PHPSESSID'] ezt használtam a $PHPSESSID helyett, ez otthon müködött.

Az az oldal is cookie -kba ment ahol van az oldalam.

Hallottam olyanról is hogy lekérdező karakterláncokba teszik a session id -t erről mi a véleményetek?

Esetleg nem tudnátok valami olyasmi session rendszert ajánlani ami se nem fájlba se nem cookie-ba ment, hanem mysql adatbázisba, valami olyasmi kéne mint a drupal-é.

Légyszi, ha lehet példát is írjatok ne csak függvény neveket.

A tárhely tulajdonos ezt javsolta nekem: ini_set(key, param)
hogy ezt használjam erről mi a véleményetek?, mert ezt sajna nem ismerem.

Előre is köszönöm.

Kiss Lajos
 
1

Erdemes lenne tajekozodni

Anonymous · 2006. Már. 27. (H), 18.49
Nem artana, ha elolvasnad a teljes manualt a sessionokrol.

En most mast nem emelnek ki csak ezt a reszt:
Esetleg nem tudnátok valami olyasmi session rendszert ajánlani ami se nem fájlba se nem cookie-ba ment, hanem mysql adatbázisba, valami olyasmi kéne mint a drupal-é.

A session mentese sosem tortenik cookie-ba. A cookie-ban a munkamenet azonositoja tarolodik. Ennek a masik modja, amikor URL-ben adjak at. A drupal adatbazisba menti, de ugyanugy cookie-t hasznal ahhoz, hogy azonositsa a kliens gepet. Egyebkent rengeteg adatbazisba mento session kezelo kod talalhato a neten.
2

Munkamenetkezelés

Poetro · 2006. Már. 27. (H), 19.01
A cikket ugye elolvastad?
3

..........

Anonymous · 2006. Már. 27. (H), 20.15
olvastam, persze.
lehet hogy félreértettetek.

Esetleg nem tudnátok segíteni egy ilyen adatbázisos rendszer kialakításában?
4

Hol akadtál el?

Dualon · 2006. Már. 27. (H), 20.21
Persze, szívesen segítünk. Konkrét kódot mutatnál?
5

Az elején van a kód...

Anonymous · 2006. Már. 27. (H), 21.23
Hát amit ott a legelején írtam sajnos csak addig jutottam.
6

nézd meg ezt

Poetro · 2006. Már. 27. (H), 21.48
Megint egy Drupal-os megoldással kell előhozakodnom a jó példa miatt.
Definiáljuk az elején a session_set_save_handler függvénnyel az egyes sessionkezelő függvényeket. A függvények kifejtése is elég jó példa a megvalósításra, érdemes áttekninteni.
7

nem értem:D

Anonymous · 2006. Már. 29. (Sze), 19.21
bocxs, de még mindig nem tom hogyan kell megcsinálni.
egy kódot nem tudnátok esetleg adni?

<?php
$timeseconds = 180;
$timeout = time() - $timeseconds;

function open_sess() {
return TRUE;

}

function close_sess() {
return TRUE;

}

function read_sess($sessionid) {
global $timeout;

$time = time();

mysql_query("SELECT * FROM sessions WHERE sid='$sessionid'");
return true;
}

function write_sess($sessionid) {

$time = time();
$hostname = $_SERVER['REMOTE_ADDR']; 
$a = mysql_query("INSERT INTO sessions (sid, uid, hostname, timestamp) VALUES ('$sessionid', '-1', '$hostname', '$time')");
return $a;
return TRUE;
}



function destroy_sess($sessionid, $a) {

mysql_query("DELETE FROM sessions WHERE sid='$sessionid'");

return TRUE;
}


function gc_session() {
$b = mysql_query("DELETE FROM sessions WHERE timestamp<$timeout");
return $b;
}

?>

<?php
session_set_save_handler("open_sess", "close_sess", "read_sess", "write_sess", "destroy_sess", "gc_sess");
?>
<?php
session_start();
print session_id();
$_SESSION['uid'] = "-1";
print $_SESSION['uid'];
?>
8

Hibák

Poetro · 2006. Már. 29. (Sze), 20.22
  • A read_sess nem adja vissza nálad a session adatokat.
  • A gc_session nem tudja mekkora a $timeout-od, mert a függvényen kívül deklaráltad.
9

nem tom.......

Anonymous · 2006. Már. 29. (Sze), 21.21
sajnos még mindig nem jó nekem, szerintem valami t rosszul csinálok:


<?php
$timeseconds = 180;
$timeout = time() - $timeseconds;

function open_sess($save_path, $session_name) {
return 1;

}

function close_sess() {
return 1;
}

function read_sess($sessionid) {
$time = time();
$df = mysql_query("SELECT * FROM sessions WHERE sid='$sessionid'");
return $df;

}

function write_sess($sessionid) {

$time = time();
$hostname = $_SERVER['REMOTE_ADDR']; 
$a = mysql_query("INSERT INTO sessions (sid, uid, hostname, timestamp) VALUES ('$sessionid', '-1', '$hostname', '$time')");

return '';
}



function destroy_sess($sessionid) {

$cd = mysql_query("DELETE FROM sessions WHERE sid='$sessionid'");
return $cd;

}


function gc_session() {
global $timeout;
$b = mysql_query("DELETE FROM sessions WHERE timestamp<$timeout");
return 1;
}

?>
<?php
session_set_save_handler("open_sess", "close_sess", "read_sess", "write_sess", "destroy_sess", "gc_sess");
?>

<?php
session_start();
print session_id();
$_SESSION['uid'] = "-1";
print $_SESSION['uid'];
?>
10

ez miért nem jó,,???

Anonymous · 2006. Ápr. 1. (Szo), 00.40
ÜDV!

Nem értem a kommentek alapján egy ilyet összedibtan, de mégsem jó...

miért, van ez?

<?php

function sess_open($save_path, $session_name) {

}


function sess_close() {

}

function sess_read($sid) {
$query = "SELECT data FROM sessions WHERE sid='$sid'";
mysql_query($query);
mysql_fetch_assoc($query);
return($row[data]);
}

function sess_write($sid, $val) {
$time = time();
$val = addslashes($val);
$query = "SELECT data FROM sessions WHERE sid='$sid'";
if (mysql_num_row($query)) {
$qquery = "UPDATE sessions set timestamp='$time', data='$val' WHERE sid='$sid'";
mysql_query($quuery);
}

else {
$quuery = "INSERT INTO sessions (sid, timestamp, data) VALUES ('$sid', '$time', '$val')";
mysql_query($quuery);
}

}




function sess_destroy($sid) {
mysql_query("DELETE FROM sessions WHERE sid='$sid'");
}

function sess_gc($max_lifetime) {
$time = time();
mysql_query("DELETE FROM sessions WHERE timestamp>$time");
}

?>
<?php
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
<?php
session_start();
print session_id(); 
$_SESSION['uid'] = -1;
print $_SESSION['uid'];
?> 
11

"mégsem jó"

Hojtsy Gábor · 2006. Ápr. 3. (H), 20.46
"Mégsem jó" mit jelent? Mivel tér vissza a session_set_save_handler()? Látsz hibaüzenetet? Milyen hibaüzenetet? ini_set("error_reporting", E_ALL); ini_set("display_errors", TRUE); mellett mondjuk könnyen láthatsz. Nem ment semmit adatbázisba? Nem ment mindent adatbázisba? Meg van nyitva bármilyen adatbázis kapcsolat? Ebből a kódból nem látni. Biztosan csak egy adatbázis kapcsolat van a programban, amivel minden adatbázis műveletet használni szeretnél? Miért nem térsz vissza TRUE/FALSE értékkel a függvényekből siker/sikertelenség esetén, ahogy a session_set_save_handler() dokumentációja előírja? Elsőre bennem ilyen dolgok merülnek fel a kód tüzetes átvizsgálása nélkül.
12

háááát.........

Anonymous · 2006. Ápr. 4. (K), 10.16
Hát próbűátam úgyis hogy true-val vissza térek.

Semmilyen üzenetet nem kapok, és van adatbázis kapcsolatom is...

A hiba a következő: nem menti el adatbázisba.
Az session azonosítót látom meg ha csinálok egy változót a session-ba akkor az is működik pl.: $_SESSION['uid'] = -1 ez mükődik és kiis írja, csak adatbázisba nem menti le a date oszlopba..

Különben kössz a segítséget...

de most mit javasolsz?
13

nem válaszoltál

Hojtsy Gábor · 2006. Ápr. 4. (K), 19.48
Először is még nem válaszoltál minden kérdésemre. És még annyit javasolnék, hogy a különböző sess_akarmi() függvényekbe rakj egy error_log('sess_akarmi() lefut', 3, 'session_log.txt'); hívást, akkor látni fogod, hogy hívódik meg a függvényeidből és milyen sorrendben. Ez mondjuk a szegény ember debug módszere.
14

aham, és ehez mit szólsz?

Anonymous · 2006. Ápr. 4. (K), 20.17
Bocs, de nem tudom hogy milyen kérdésre nem válaszoltam még.
Légyszíves mond meg.



Nos itt van még egy kód, de sajnos ez sem írja be az adatbázisba az adatokat...

<?php

function sess_open($save_path, $session_name) {
return true;
}

function sess_close() {
return true;
}

function sess_read($sess_id) {
$sql = "SELECT * FROM sessions WHERE sid='$sess_id'";
if ($result = mysql_query($sql)) {
return false;
}
if (mysql_num_rows($result)) {
$row = mysql_fetch_assoc($result); 
$sess_data = ($row["data"]);
return $sess_data;
}
else {
return "";
}
}

function sess_write($sess_id, $data) {
$time = time();
$sql = "update sessions set data='addlashes($data)', timestamp='$time' WHERE sid='$sess_id'";
if(!$result = mysql_query($sql)) {
return false;
}
if (mysql_affected_rows()) {
return true;
}
$sql = "insert into sessions (sid, data, timestamp) VALUES ('$sess_id', '$data', '$time')";
if (!$result = mysql_query($sql)) {
return false;
}
else {
return true;
}

}

function sess_destroy($sess_id) {
$sql = "delete sessions where sid='$sess_id'";
if($result = mysql_query($sql)) {
return true;
}
else {
return false;
}
}

function sess_gc($life) {
$time = time();
$sql = "delete sessions where timestamp<$time - $life";
if ($result = mysql_query($sql)) {
return true;
}
else {
return false;
}
}
?>
<?php
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
<?php
session_start();
print session_id(); 
$_SESSION['uid'] = -1;
print $_SESSION['uid'];
?> 
15

ne várd már el

Hojtsy Gábor · 2006. Ápr. 4. (K), 20.23
Nem fogom letesztelni a kódod. Nem fogom összehasonlítani, hogy mit változtattál meg a korábbi változatokhoz képest. Nem fogom leírni mégegyszer, hogy mit kérdeztem. Ott vannak a kérdőjelek a hozzászólásban, ha tiszteled annyira azt, aki segíteni akart, hogy megteszed, amit tudsz, akkor szépen megnézed, hogy minden kérdőjel előtti dologra válaszoltál-e. Nem tetted. Nem reagáltál semmit a legutóbbi javaslataimra. Jobb dolgom is van.

Erre nem érdemes válaszolnod, mert olyan keskeny lesz, hogy úgysem tudjuk elolvasni.
16

az ini_set és az error_reporting eredménye:

Anonymous · 2006. Ápr. 4. (K), 20.26
Ja kipróbáltam amit javasoltál...

az ini_set miatt nem kapok semmit hiba üzenetet..

a sess_akarmi -s error_reporting -nál pedig ez jött ki a session_log.txt -ben 1szeri lefutásnál

sess_open() lefutsess_read() lefut

most akkor ez azt jelenti hogy csak ez a 2 fut le vagy mi???
17

ez nagyon lol

Anonymous · 2006. Ápr. 5. (Sze), 20.49
:D:D:D
.........
:):):):):)