note 56106 added to function.session-decode

From: Date: Tue, 23 Aug 2005 19:54:16 +0000
Subject: note 56106 added to function.session-decode
Groups: php.notes 
Request: Send a blank email to php-notes+get-94090@lists.php.net to get a copy of this message
Here is a function that returns decoded session data, that seems to work in every cases, even when strings contain reserved chars : <?php define('PS_DELIMITER', '|'); define('PS_UNDEF_MARKER', '!'); function session_real_decode($str) { $str = (string)$str; $endptr = strlen($str); $p = 0; $serialized = ''; $items = 0; $level = 0; while ($p < $endptr) { $q = $p; while ($str[$q] != PS_DELIMITER) if (++$q >= $endptr) break 2; if ($str[$p] == PS_UNDEF_MARKER) { $p++; $has_value = false; } else { $has_value = true; } $name = substr($str, $p, $q - $p); $q++; $serialized .= 's:' . strlen($name) . ':"' . $name . '";'; if ($has_value) { for (;;) { $p = $q; switch ($str[$q]) { case 'N': /* null */ case 'b': /* boolean */ case 'i': /* integer */ case 'd': /* decimal */ do $q++; while ( ($q < $endptr) && ($str[$q] != ';') ); $q++; $serialized .= substr($str, $p, $q - $p); if ($level == 0) break 2; break; case 'R': /* reference */ $q+= 2; for ($id = ''; ($q < $endptr) && ($str[$q] != ';'); $q++) $id .= $str[$q]; $q++; $serialized .= 'R:' . ($id + 1) . ';'; /* increment pointer because of outer array */ if ($level == 0) break 2; break; case 's': /* string */ $q+=2; for ($length=''; ($q < $endptr) && ($str[$q] != ':'); $q++) $length .= $str[$q]; $q+=2; $q+= (int)$length + 2; $serialized .= substr($str, $p, $q - $p); if ($level == 0) break 2; break; case 'a': /* array */ case 'O': /* object */ do $q++; while ( ($q < $endptr) && ($str[$q] != '{') ); $q++; $level++; $serialized .= substr($str, $p, $q - $p); break; case '}': /* end of array|object */ $q++; $serialized .= substr($str, $p, $q - $p); if (--$level == 0) break 2; break; default: return false; } } } else { $serialized .= 'N;'; $q+= 2; } $items++; $p = $q; } return @unserialize( 'a:' . $items . ':{' . $serialized . '}' ); } ?> Please let met know if you find any bug. ---- Manual Page -- http://www.php.net/manual/en/function.session-decode.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+56106 Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+56106&report=yes&reason=added+to+the+manual Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+56106&report=yes&reason=bad+code Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+56106&report=yes&reason=spam Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+56106&report=yes&reason=useless Delete: non-english -- http://master.php.net/manage/user-notes.php?action=delete+56106&report=yes&reason=non-english Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+56106&report=yes Reject -- http://master.php.net/manage/user-notes.php?action=reject+56106&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#94090) next »