Проблема с десериализацией класса PHP и с gzinflate - PullRequest
0 голосов
/ 09 апреля 2011

Я пытаюсь сериализовать класс (User) и передать его как переменную GET на следующую страницу.

Вот мой тестовый код:

$usr->getByLoginPass($db,"perf@stud.de","a32636ba1c7875b19c6f32121078c2da0be6f857");
$serial = $usr->serialize();
$handle = fopen("http://localhost/newClassSite/utests/userSerializationTest.php?data=$serial", "rb");
$contents = "";
while (!feof($handle)) {
    $contents .= fread($handle, 8192);
}
fclose($handle);
if(strpos($contents,"Perfect") === false) {
    echo"$contents<br>";
    echo"Problem with serialization testUser.test:16" . $usr->getLastError() . "<br>";
}

Вот код в userSerializationTest.php:

$data = $_GET['data'];
echo"5: $data<br>";
include('../user.inc');
$usr = new User();
$usr->deserialize($data);
$usr->printUser();

Вот код в классе:

public function serialize() {
    $serial = serialize($this);
    $df = gzdeflate($serial);
    $b64 = base64_encode($df);
    $ue = urlencode($b64);
    echo "<font face='Courier New'>1: $serial<br><br>2: $df<br><br>3: $b64<br><br>4: $ue<hr><br>";
    return($ue);
}

public function deserialize($data) {
    $ud = urldecode($data);
    $u64 = base64_decode($ud);
    $gf = gzinflate($u64);
    $us = unserialize($gf);
    echo"6: $ud<br><br>7: $u64<br><br>8: $gf<br><br>9: $us<hr><br>";
}

А вот и вывод:

1: O: 4: «Пользователь»: 9: {s: 12: «UseruserID»; s: 1: «9»; s: 15: «UserstudentID»; s: 3: «007»; s: 11: "USEREMAIL"; s: 12: "perf@stud.de"; s: 10: "Usersha1"; s: 40: "a32636ba1c7875b19c6f32121078c2da0be6f857"; s: 11: "Userfname"; s: 7: "Идеальный"; с: 11: "Userlname"; s: 7: "Студент"; s: 12: "UserStatus"; s: 2: "ОК"; s: 17: "UsermiddleNames"; s: 0: ""; s: 15 : "UserlastError"; s: 0: "";}

2:] M ™ = 0 @ [hŸº0 & ÖÄxÊOlÒVte¼ »” † ƺðÍ0o † ÐÝi ‹‚ · Bm¦ófËé € vªâ ^ $ ÍùQéÁÏrc $ t / Ú. ¢ ÷ ÒÖì§ + [¥ # à ^Œ Î Œ Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î Î ! ¢ • d & £ «IKI • Àf|, þ ™ Ào1” º † 9Zúμ¡û1ÜæÚ © Wz <ð £> X @ õ9Š <‰}«T§ / ": BÍõGtÂù £ μO» г / </p>

3: XZBNDsIgFIQ9CwcwQFtonxsXujAm1sR4AMpPbNJWA3RlvLuUhsa6gfDNMG + ghhzQ3WmLoIK3A0IBbabzZgzL6YB2gQGq4l4kzflR6cHPcgYIYx4NJBl0L9ouopD30tbspytbpSPDS85DkInkgYiMsow1gkhe8qIhlWQmo4QSzEtJlcCNZqYs / gaZQfQxlAO6hjla + RWH + zHc5tqpV3qL8KObWED1OYo8iX2rVKcvISI6Qs31R3TC + aO1T7uony8 =

4: XZBNDsIgFIQ9CwcwQFtonxsXujAm1sR4AMpPbNJWA3RlvLuUhsa6gfDNMG% 2BghhzQ3WmLoIK3A0IBbabzZgzL6YB2gQGq4l4kzflR6cHPcgYIYx4NJBl0L9ouopD30tbspytbpSPDS85DkInkgYiMsow1gkhe8qIhlWQmo4QSzEtJlcCNZqYs% 2FgaZQfQxlAO6hjla% 2BrWh% 2BzHc5tqpV3qL8KObWED1OYo8iX2rVKcvISI6Qs31R3TC% 2BaO1T7uony8% 3D

5: XZBNDsIgFIQ9CwcwQFtonxsXujAm1sR4AMpPbNJWA3RlvLuUhsa6gfDNMG + ghhzQ3WmLoIK3A0IBbabzZgzL6YB2gQGq4l4kzflR6cHPcgYIYx4NJBl0L9ouopD30tbspytbpSPDS85DkInkgYiMsow1gkhe8qIhlWQmo4QSzEtJlcCNZqYs / gaZQfQxlAO6hjla + RWH + zHc5tqpV3qL8KObWED1OYo8iX2rVKcvISI6Qs31R3TC + aO1T7uony8 =

Предупреждение: gzinflate () [function.gzinflate]: ошибка данных в C: \ wamp \ www \ newClassSite \ user.inc в строке 117 6: XZBNDsIgFIQ9CwcwQFtonxsXujAm1sR4AMpPbNJWA3RlvLuUhsa6gfDNMG ghhzQ3WmLoIK3A0IBbabzZgzL6YB2gQGq4l4kzflR6cHPcgYIYx4NJBl0L9ouopD30tbspytbpSPDS85DkInkgYiMsow1gkhe8qIhlWQmo4QSzEtJlcCNZqYs / gaZQfQxlAO6hjla RWH zHc5tqpV3qL8KObWED1OYo8iX2rVKcvISI6Qs31R3TC aO1T7uony8 =

7:] M = 0 @ [hŸº0 & ÖÄxÊOlÒVte¼ »” † ƺðÍ0h! ‡ 47Zbè ÀÐ € [i¼Ùƒ2ú @j¸—‰3~Tzps܂ǃI]ö‹¨¤=ôµ»)ÊÖéHðÒóä"y b#,£ '¼¨ˆeY ¨á³Òep # Y © ‹? ¦P} eî¡ŽV« ZÇs ›j ¥] ê / ÂŽmaÔæ (ò% öRœ¼ „ˆé7ÕÓ £ µO» ¨Ÿ /

8:

9:

Пользователь: ID: -1 Sid: Эл. адрес: проходить: имя_файл: LNAME: статус: середина:

Я бы хотел, чтобы поля были заполнены в конце.
Почему gzinflate не работает?
Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 09 апреля 2011

Посмотрите на данные в 3 и 6. Они не совпадают!

В результате получилось, что символ + служит пробелом в URL-адресе, поэтому "+" get декодируется как ""между 5 и 6 (где я думаю, что 5 - это необработанные данные $ _GET и показывает, что они уже были декодированы)

0 голосов
/ 09 апреля 2011

Вам не нужно urldecode() в вашей функции deserialize().PHP уже позаботился обо всем этом, когда создавал массив $ _GET.Скорее всего, это проблема - вы дважды декодируете данные, и по случайной случайности некоторые из gzdata имеют последовательности символов, которые в конечном итоге выглядят как достоверные данные в кодировке urlencoded.<font> тег для вывода ваших данных отладки?Используйте <pre>.он предназначен для вывода текста шрифтом фиксированной ширины.

...