如何使用php serialize()和unserialize()


How to use php serialize() and unserialize()

我的问题很简单。

我没有找到任何例子来满足我的需要,到底是什么serialize()unserialize()在php中意味着?他们只是给出了一个例子-序列化一个数组并以无法解释的格式显示输出。通过他们的行话,很难理解基本概念。

编辑:

<?php
$a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3');
print_r($a);
echo ("<br></br>");
$b=serialize($a);
print_r($b);
?>
输出:

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 
a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

我无法理解第二个输出。除此之外,谁能给一个例子的情况下,我需要序列化一个php数组之前使用它?

PHP数组、对象或其他复杂数据结构不能在运行的PHP脚本之外传输、存储或以其他方式使用。如果您希望在单次运行脚本之外持久化这样一个复杂的数据结构,您需要序列化它。这只是意味着将结构放入一个"较低的公分母",可以由PHP以外的东西处理,如数据库、文本文件、套接字。标准PHP函数serialize只是格式来表达这样的事情,它将数据结构序列化为PHP独有的字符串表示,并且可以使用unserialize反转为PHP对象。还有许多其他格式,如JSON或XML。


以下面这个常见问题为例:

如何将PHP 数组传递给Javascript?

PHP和Javascript只能通过字符串通信。您可以很容易地将字符串"foo"传递给Javascript。您可以很容易地将数字1传递给Javascript。您可以轻松地将布尔值truefalse传递给Javascript。但是如何将这个数组传递给Javascript呢?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

答案是序列化。对于PHP/Javascript, JSON实际上是更好的序列化格式:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }

Javascript可以很容易地将其转换为实际的Javascript数组。

这是相同数据结构的有效表示:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

但是几乎只有PHP使用它,其他地方很少支持这种格式。
这是很常见的,也得到了很好的支持:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>
在许多情况下,您需要将复杂的数据结构作为字符串传递。将任意数据结构表示为字符串的序列化解决了如何做到这一点。

PHP serialize () unserialize()使用

http://freeonlinetools24.com/serialize

echo '<pre>';
// say you have an array something like this 
$multidimentional_array= array(
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 4, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 5, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 8, 7) 
    )
);
// serialize 
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);

输出如下

a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}
还是

如果你想取回原始数组只需使用PHP的unserialize()函数

$original_array=unserialize($serialized_array, ['allowed_classes' => false]);
var_export($original_array);

我希望这对你有帮助

注意:出于安全考虑,在反序列化中将allowed_classes设置为false。参见警告https://www.php.net/manual/en/function.unserialize.php

<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b, ['allowed_classes' => false]);
print_r($c);

运行这个程序,输出

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}

注意:出于安全考虑,在反序列化时将allowed_classes设置为false。


这里的
a=size of array
i=count of array number
s=size of array values

可以使用serialize在数据库
中存储数据数组,并且可以检索和UN-serialize数据以供使用。参见警告https://www.php.net/manual/en/function.unserialize.php

当你想让你的php值可存储时,你必须把它变成一个字符串值,这就是serialize()所做的。而unserialize()则做相反的事情。

大多数存储介质都可以存储字符串类型。它们不能直接存储PHP数据结构,如数组或对象,也不应该这样做,因为那样会将数据存储介质与PHP耦合在一起。

相反,serialize()允许您将其中一个结构体存储为字符串。它可以用unserialize()从它的字符串表示反序列化。

如果您熟悉json_encode()json_decode()(以及一般的JSON),那么概念是相似的。

请!拜托!拜托!不要序列化数据并将其放入数据库。序列化可以用这种方式使用,但是这忽略了关系数据库和数据库引擎中固有的数据类型的要点。这样做会使数据库中的数据不可移植,难以阅读,并可能使查询复杂化。如果你希望你的应用程序可以移植到其他语言,比如你发现你想在应用程序的某些部分使用Java,那么序列化将成为一个痛苦的问题。您应该始终能够查询和修改数据库中的数据,而无需使用第三方中介工具来操作要插入的数据。

它使得维护代码、存在可移植性问题的代码以及迁移到其他RDMS系统、新模式等的数据变得更加困难。它还有一个额外的缺点,即根据序列化的字段之一搜索数据库会变得很混乱。

这并不是说serialize()没用。这不是……例如,使用它的一个好地方可能是包含数据密集型操作结果的缓存文件。还有很多其他的……只是不要滥用序列化,因为下一个出现的人将会有一个维护或迁移的噩梦。

serialize()和unserialize()的一个很好的例子可能是这样的:

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");

在页上取消序列化

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}

From http://php.net/manual/en/function.serialize.php:

生成值的可存储表示形式。这对于存储或传递PHP值而不丢失其类型和结构非常有用。

本质上,它接受一个php数组或对象并将其转换为字符串(然后您可以根据需要传输或存储字符串)。

Unserialize用于将字符串转换回对象。

基本上,当您序列化数组或对象时,只需将其转换为有效的字符串格式,以便您可以轻松地将它们存储在php脚本之外。

  1. 使用序列化在数据库中保存对象的状态(让我们以User类为例)接下来反序列化数据以将之前的状态加载回对象(方法不是序列化器,您需要包含对象类才能使用它)
    • 用户个性化

注意对象你应该使用魔术__sleep和__wake方法。__sleep由serialize()调用。sleep方法将返回一个数组,其中包含您希望持久化的对象的值。

__wakeup由unserialize()调用。唤醒方法应该接受未序列化的值,并在对象中初始化它们。

为了在php和js之间传递数据,你可以使用json_encode将php数组转换为有效的json格式。或者其他方式-使用json .parese()将输出数据(字符串)转换为有效的json对象。这样做是为了利用本地存储。(离线数据访问)

是的,我可以。假设我们需要跟踪您的系统意味着在您的系统中有多个管理员和子管理员,所有这些都可以插入或更新或编辑任何信息。之后你需要知道是谁做了这个更改。要解决这个问题,需要序列化。

  **Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:
  history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)
我希望这对你有帮助。
preg_match_all('/'".*?'"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');