[php] PHP serialize () 및 unserialize () 사용 방법

내 문제는 매우 기본적인 것입니다.

PHP에서 정확히 무엇 serialize()unserialize()의미 하는지에 대한 내 요구를 충족시키는 예를 찾지 못했 습니까? 그들은 단지 예를 제공합니다-배열을 직렬화하고 설명되지 않은 형식으로 출력을 표시합니다. 그들의 전문 용어를 통하는 기본 개념을 이해하는 것은 정말 어렵습니다.

편집하다:

<?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 고유의 문자열 표현으로 직렬화하고 .NET을 사용하여 PHP 객체로 되돌릴 수 있습니다 unserialize. 하지만 JSON 또는 XML과 같은 다른 많은 형식이 있습니다.


예를 들어 다음과 같은 일반적인 문제를 생각해보십시오.

a

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' }

자바 스크립트는 이것을 실제 자바 스크립트 배열로 쉽게 되돌릴 수 있습니다.

이것은 동일한 데이터 구조의 유효한 표현입니다.

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);
var_export($original_array);

도움이 되길 바랍니다


답변

PHP 값을 저장 가능하게 만들고 싶을 때 문자열 값으로 바꿔야 합니다. 이것이 serialize () 가하는 일입니다. 그리고 unserialize () 는 그 반대입니다.


답변

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

이 프로그램을 실행하면 출력이 에코됩니다.

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


여기서
a = 배열의 크기
i = 배열 ​​수
의 개수 s = 배열 ​​값의 크기

직렬화를 사용하여 데이터베이스에 데이터 배열을 저장
하고 사용할 데이터를 검색하고 직렬화 해제 할 수 있습니다.


답변

대부분의 저장 매체는 문자열 유형을 저장할 수 있습니다. 그들은 배열이나 객체와 같은 PHP 데이터 구조를 직접 저장할 수 없으며, 데이터 저장 매체를 PHP와 결합하기 때문에 그렇게해서는 안됩니다.

대신 serialize()이러한 구조체 중 하나를 문자열로 저장할 수 있습니다. 를 사용하여 문자열 표현에서 역 직렬화 할 수 있습니다 unserialize().

json_encode()json_decode()(및 일반적으로 JSON)에 익숙하다면 개념은 비슷합니다.


답변

부디! 부디! 부디! 데이터를 직렬화하지 말고 데이터베이스에 배치하십시오. 직렬화는 그런 방식으로 사용할 수 있지만 관계형 데이터베이스의 요점과 데이터베이스 엔진에 내재 된 데이터 유형이 없습니다. 이렇게하면 데이터베이스의 데이터를 이식 할 수없고 읽기 어렵고 쿼리가 복잡해질 수 있습니다. 애플리케이션이 다른 언어로 이식되기를 원하는 경우, 예를 들어 Java를 사용하는 것이 합당한 앱의 일부에 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']));
}


답변

에서 http://php.net/manual/en/function.serialize.php :

값의 저장 가능한 표현을 생성합니다. 이것은 유형과 구조를 잃지 않고 PHP 값을 저장하거나 전달하는 데 유용합니다.

기본적으로 PHP 배열 또는 객체를 가져 와서 문자열로 변환합니다 (그런 다음 적합하다고 생각되는대로 전송하거나 저장할 수 있음).

직렬화 해제는 문자열을 다시 개체로 변환하는 데 사용됩니다.


댓글 달기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다