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

Ist*_*med 118 php

我的问题非常基本.

我没有找到任何例子来满足我的需求,究竟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);

?>
Run Code Online (Sandbox Code Playgroud)

输出:

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";}
Run Code Online (Sandbox Code Playgroud)

我无法理解第二个输出.除此之外,任何人都可以举例说明我需要在使用之前序列化一个php数组吗?

dec*_*eze 157

PHP数组或对象或其他复杂数据结构无法在正在运行的PHP脚本之外传输,存储或以其他方式使用.如果要将这种复杂的数据结构保留在单个运行的脚本之外,则需要对其进行序列化.这只是意味着将结构放入一个"较低的公分母",可以通过PHP之外的其他东西来处理,比如数据库,文本文件,套接字.标准的PHP函数serialize只是表达这种事物的一种格式,它将数据结构序列化为PHP独有的字符串表示形式,并且可以反转为PHP对象unserialize.还有许多其他格式,如JSON或XML.


以这个常见问题为例:

如何将PHP 数组传递给Javascript?

PHP和Javascript只能通过字符串进行通信.您可以"foo"非常轻松地将字符串传递给Javascript.您可以1非常轻松地将号码传递给Javascript.你也可以传递布尔值true,并false容易为JavaScript.但是你如何将这个数组传递给Javascript?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 
Run Code Online (Sandbox Code Playgroud)

答案是序列化.在PHP/Javascript的情况下,JSON实际上是更好的序列化格式:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }
Run Code Online (Sandbox Code Playgroud)

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

这同样是对同一数据结构的有效表示:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}
Run Code Online (Sandbox Code Playgroud)

但几乎只有PHP使用它,在其他地方几乎不支持这种格式.
这是非常常见的,并且得到了很好的支持:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>
Run Code Online (Sandbox Code Playgroud)

在许多情况下,您需要将复杂的数据结构作为字符串传递.序列化,将任意数据结构表示为字符串,解决了如何执行此操作.

  • 据我所知,很难找到那种格式的正式规格,但你可以猜到,不是吗?`i:1` =整数1,`s:6:"elem 1"`=带有6个字符的字符串"elem 1"...你要求的是什么样的例子,我以为我给了一个? (2认同)

小智 26

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);
Run Code Online (Sandbox Code Playgroud)

这给你一个像这样的输出

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;}}}
Run Code Online (Sandbox Code Playgroud)

再次,如果你想获得原始数组,只需使用PHP unserialize()函数

$original_array=unserialize($serialized_array);
var_export($original_array);
Run Code Online (Sandbox Code Playgroud)

我希望这个能帮上忙


xda*_*azz 7

当你想让你的php值可以存储时,你必须把它变成一个字符串值,这就是serialize()的作用.并且unserialize()做了相反的事情.

  • *"我们可以在不对其进行序列化的情况下将变量插入数据库"*.这仅适用于基本数据类型(字符串,整数,数字).我们不能直接将数组和对象*插入到DB或文件系统中.这就是`serialize()`和`unserialize()`的用法. (9认同)
  • @Istiaque Ahmed例如,当您想要将数组存储到磁盘上的文件时,您无法直接保存数组,而是将其转换为可存储的值,这是一个字符串. (2认同)

ale*_*lex 5

大多数存储介质可以存储字符串类型.它们不能直接存储PHP数据结构,例如数组或对象,它们不应该,因为它会将数据存储介质与PHP耦合.

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

如果你熟悉json_encode()json_decode()(以及一般的JSON),这个概念是相似的.


小智 5

<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);
Run Code Online (Sandbox Code Playgroud)

运行该程序,将其回显输出

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}
Run Code Online (Sandbox Code Playgroud)


这里
a =数组大小
i =数组数目计数
s =数组值大小

您可以使用序列化将数据数组存储在数据库中
,还可以检索和UN序列化要使用的数据。


Avn*_*lok 5

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

这使得维护代码、具有可移植性问题的代码以及更难以迁移到其他 RDMS 系统、新模式等的数据变得非常困难。它还有一个额外的缺点,即基于以下其中一项搜索数据库变得混乱您已序列化的字段。

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

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

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");
Run Code Online (Sandbox Code Playgroud)

在页面上反序列化

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

  • 所提供的代码包含多个安全漏洞,应该警告过来复制粘贴代码的人。 (3认同)