api
(Sitemaster)
12 Kwiecień 2007 21:36
#1
Mam se stringa wyglądającego tak:
Jak teraz wyciągnąć z niego wartość dla zmienna2 ?
Chciał bym mieć to w formie tablicy by moc sie odwoływać np $tablica[‘zmienna2’]
Jak to zrobić???
Podpowiem, że w takiej formie zapisuje dane skrypt ale musze się do tego dostać z poziomu innego gdzie już nie mam obsługi sesji przez tego handlera.
Zastanawiamnie że przypomina to troche serializowaną tablice
a:3:{s:8:“zmienna1”;s:5:“test1”;s:8:“zmienna2”;s:5:“test2”;s:8:“zmienna3”;s:5:“test3”;}
ale unserialize nic tunie daje.
Pomocy!
<?php ini_set(“session.cookie_lifetime”, 0); define(“BLAD”, " BŁˇD: “); $life=“60”; session_module_name(“user”); $id = session_id(); function session_open() { return(true); } function session_close() { return(true); } function session_read($id) { global $life; session_gc($life); $conn = mysql_connect(‘localhost’,‘root’,‘krasnal’)or die (“Problem connecting to Database”); $db = mysql_select_db(“pnr”,$conn); $query = “SELECT * FROM sessions WHERE session_id=’$id’”; $result = mysql_query(”$query") or die(BLAD . ‘Nie można sprawdzić statusu sesji.’); if(mysql_num_rows($result) == “1”) { $field = mysql_fetch_array($result); return $field[‘session_data’]; } else { $query = “INSERT INTO sessions (session_id) values (’$id’)”; mysql_query($query) or die(BLAD . ‘Nie można stworzyć nowej sesji.’); return(true); } } function session_write($id, $data) { $conn = mysql_connect(‘localhost’,‘root’,‘krasnal’)or die (“Problem connecting to Database”); $db = mysql_select_db(“pnr”,$conn); $query = “SELECT * FROM sessions WHERE session_id=’$id’”; $result = mysql_query($query) or die(‘Nie można sprawdzić danych z bazy.’); while($line = mysql_fetch_array($result)) { $dane = $line[‘session_data’]; } if($dane != $data) { $rdata = $data; $query = “update sessions set session_data=’$rdata’ WHERE session_id=’$id’”; $result = mysql_query("$query") or die(BLAD . ‘Nie można zaktualizowac daty sesji.’); } } function session_remove($id) { $conn = mysql_connect(‘localhost’,‘root’,‘krasnal’)or die (“Problem connecting to Database”); $db = mysql_select_db(“pnr”,$conn); $query = “delete FROM sessions WHERE session_id=’$id’”; mysql_query($query) or die(BLAD . ‘Nie można usun±ć sesji.’); return(true); } function session_gc($life) { $conn = mysql_connect(‘localhost’,‘root’,‘krasnal’)or die (“Problem connecting to Database”); $db = mysql_select_db(“pnr”,$conn); $query = “delete FROM sessions WHERE session_time < '” . date(“YmdHis”, time() - $life) . “’”; mysql_query($query) or die(BLAD . “Nie można usun±ć sesji.”); return(true); } session_set_save_handler(“session_open”, “session_close”, “session_read”, “session_write”, “session_remove”, “session_gc”); session_start(); session_register(“sesja”) or die(BLAD . ‘Nie można zarejestrować zmiennej.’); //zapis danych $_SESSION[“zmienna1”]=‘test1’; $_SESSION[“zmienna2”]=‘test2’; $_SESSION[“zmienna1”]=‘test3’; //odczyt echo $_SESSION[“zmienna1”]; ?>
mrbungle
(mrbungle)
12 Kwiecień 2007 22:59
#2
tak zacząłem sobie “rozkminiać” jak PHP zapisuje dane z sesji przy zapisie plikow tymczasowych sess_XXXXXXXXXXXXXXXXXXXX… i zgadzam sie - wyglada to na dane serializowane.
Abstrachując od Twojego zapisu ja bym to zrobił tak:
<?php
$string = 'user|s:5:"admin";id|s:32:"0dc937c4f00e7121c370e20ca4550fb5";';
$_COOKIE['SESSION'] = array();
//1. podział na poszczegolne zmienne
$data = explode(';', $string);
// dla kazdej zmiennej wyciagnij dane
foreach($data as $value)
{
if(!empty($value))
{
$first = explode('|', $value);
$second = explode(':', $first[1], 3);
switch($second[0])
{
case 's':
$type = 'string';
break;
case 'i':
$type = 'integer';
break;
// ... itd
}
// wyciecie "srodka"
$second[2] = substr($second[2], 1, strlen($second[2])-2);
// ustalenie typu zmiennej - w sumie w PHP chyba niepotrzebne
settype($second[2], $type);
$_COOKIE['SESSION'][$first[0]] = $second[2];
}
}
echo '
';
print_r($_COOKIE['SESSION']);
echo '
'; ?> [/code] efekt koncowy dla tych danych:
[code] Array ( [user] => admin [id] => 0dc937c4f00e7121c370e20ca4550fb5 )
tak jest ok?
api
(Sitemaster)
12 Kwiecień 2007 23:41
#3
Stary, życie mi uratowałeś
mrbungle
(mrbungle)
13 Kwiecień 2007 07:23
#4
już nie przesadzajmy
ale ciesze sie że Ci pomogłem
crew1
(L337 Crew)
13 Kwiecień 2007 13:30
#5
w sumie jest to rozbicie na tablice, a separatorem jest tutaj |
Analogiczny przykład:
http://www.programuj.com/artykuly/www/plikiphp.php
api
(Sitemaster)
13 Kwiecień 2007 14:58
#6
Nie jdeno rozbicie bo kilka razy explode trzeba użyć, szkoda że nie ma prostszego sposobu.
Okroiłem tylko nieco i jest spoko.
<?php $string = ‘sesja|N;zmienna1|s:5:“test1”;zmienna2|s:5:“test2”;zmienna3|s:5:“test3”;’; $tablica = array(); $data = explode(’;’, $string); foreach($data as $value) { if(!empty($value)) { $first = explode(’|’, $value); $second = explode(’:’, $first[1], 3); $second[2] = substr($second[2], 1, strlen($second[2])-2); $tablica[$first[0]] = $second[2]; } } echo $tablica[‘zmienna2’]; ?>