복붙노트

php serialize () 및 unserialize ()를 사용하는 방법

PHP

php serialize () 및 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 배열을 serialize 할 필요가 상황의 예를 누구든지 줄 수 있습니까?

해결법

  1. ==============================

    1.PHP 배열이나 객체 또는 다른 복잡한 데이터 구조는 실행중인 PHP 스크립트 외부로 전송되거나 저장되거나 달리 사용될 수 없습니다. 스크립트의 단일 실행 이상으로 복잡한 데이터 구조를 유지하려면 직렬화해야합니다. 이것은 데이터베이스, 텍스트 파일, 소켓과 같은 PHP 이외의 것들이 처리 할 수있는 "하위 공통 분모"에 구조를 추가하는 것을 의미합니다. 표준 PHP 함수 serialize는 이러한 것을 표현하는 형식 일 뿐이며 데이터 구조를 PHP 고유의 문자열 표현으로 직렬화하고 unserialize를 사용하여 PHP 객체로 되돌릴 수 있습니다. 하지만 JSON 또는 XML과 같은 다른 많은 형식이 있습니다.

    PHP 배열이나 객체 또는 다른 복잡한 데이터 구조는 실행중인 PHP 스크립트 외부로 전송되거나 저장되거나 달리 사용될 수 없습니다. 스크립트의 단일 실행 이상으로 복잡한 데이터 구조를 유지하려면 직렬화해야합니다. 이것은 데이터베이스, 텍스트 파일, 소켓과 같은 PHP 이외의 것들이 처리 할 수있는 "하위 공통 분모"에 구조를 추가하는 것을 의미합니다. 표준 PHP 함수 serialize는 이러한 것을 표현하는 형식 일 뿐이며 데이터 구조를 PHP 고유의 문자열 표현으로 직렬화하고 unserialize를 사용하여 PHP 객체로 되돌릴 수 있습니다. 하지만 JSON 또는 XML과 같은 다른 많은 형식이 있습니다.

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

    PHP와 Javascript는 문자열을 통해서만 통신 할 수 있습니다. "foo"문자열을 Javascript에 매우 쉽게 전달할 수 있습니다. Javascript에 숫자 1을 매우 쉽게 전달할 수 있습니다. 부울 값 true 및 false를 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>
    

    복잡한 데이터 구조를 문자열로 전달해야하는 경우가 많이 있습니다. 임의의 데이터 구조를 문자열로 나타내는 직렬화는이를 수행하는 방법을 해결합니다.

  2. ==============================

    2.PHP는 직렬화 () unserialize () 사용

    PHP는 직렬화 () 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);
    

    이게 도움이되기를 바랍니다.

  3. ==============================

    3.PHP 값을 저장 가능하게 만들고 싶으면 serialize ()가하는 문자열 값으로 변환해야합니다. 그리고 unserialize ()는 그 반대의 작업을합니다.

    PHP 값을 저장 가능하게 만들고 싶으면 serialize ()가하는 문자열 값으로 변환해야합니다. 그리고 unserialize ()는 그 반대의 작업을합니다.

  4. ==============================

    4.대부분의 저장 매체는 문자열 유형을 저장할 수 있습니다. 그들은 배열이나 객체와 같은 PHP 데이터 구조를 직접 저장할 수 없으며 데이터 저장 매체와 PHP를 결합하지 않아야합니다.

    대부분의 저장 매체는 문자열 유형을 저장할 수 있습니다. 그들은 배열이나 객체와 같은 PHP 데이터 구조를 직접 저장할 수 없으며 데이터 저장 매체와 PHP를 결합하지 않아야합니다.

    대신 serialize ()를 사용하면 이러한 구조체 중 하나를 문자열로 저장할 수 있습니다. unserialize ()로 캐릭터 라인 표현으로부터 직렬화 복원 할 수 있습니다.

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

  5. ==============================

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

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

    본질적으로, 그것은 php 배열이나 객체를 취하고이를 문자열로 변환합니다 (여러분이 보았던 것처럼 전송하거나 저장할 수 있습니다).

    Unserialize는 문자열을 다시 객체로 변환하는 데 사용됩니다.

  6. ==============================

    6.

    <?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 = 배열 ​​값의 크기

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

  7. ==============================

    7.부디! 부디! 부디! 데이터를 직렬화하여 데이터베이스에 저장하지 마십시오. 직렬화는 그런 식으로 사용할 수 있지만 관계형 데이터베이스와 데이터베이스 엔진에 고유 한 데이터 유형의 점이 누락되었습니다. 이렇게하면 데이터베이스의 데이터를 이동성이없고 읽기가 어려워 질 수 있으며 쿼리가 복잡해질 수 있습니다. 애플리케이션을 다른 언어로 이식하기를 원한다면, Java를 사용하는 것이 의미있는 앱의 일부분에 Java를 사용하려는 것처럼, 직렬화가 엉덩이의 고통이 될 것입니다. 삽입 할 데이터를 조작하려면 타사 중간 도구를 사용하지 않고 데이터베이스의 데이터를 항상 쿼리하고 수정할 수 있어야합니다.

    부디! 부디! 부디! 데이터를 직렬화하여 데이터베이스에 저장하지 마십시오. 직렬화는 그런 식으로 사용할 수 있지만 관계형 데이터베이스와 데이터베이스 엔진에 고유 한 데이터 유형의 점이 누락되었습니다. 이렇게하면 데이터베이스의 데이터를 이동성이없고 읽기가 어려워 질 수 있으며 쿼리가 복잡해질 수 있습니다. 애플리케이션을 다른 언어로 이식하기를 원한다면, Java를 사용하는 것이 의미있는 앱의 일부분에 Java를 사용하려는 것처럼, 직렬화가 엉덩이의 고통이 될 것입니다. 삽입 할 데이터를 조작하려면 타사 중간 도구를 사용하지 않고 데이터베이스의 데이터를 항상 쿼리하고 수정할 수 있어야합니다.

    코드, 이식성 문제가있는 코드 및 다른 RDMS 시스템, 새로운 스키마 등으로 마이그레이션하기가 더 어려운 데이터를 유지 관리하는 것은 정말로 어렵습니다. 또한 다음 중 하나를 기반으로 데이터베이스를 검색하는 것이 지저분 해지는 단점이 있습니다. 당신이 직렬화 한 분야.

    그것은 serialize ()가 쓸모 없다는 것을 말하는 것이 아닙니다. 그것은 아닙니다 ... 그것을 사용하는 좋은 장소는 예를 들어, 데이터 집중적 인 연산의 결과를 포함하는 캐시 파일 일 수 있습니다. 수 많은 사람들이 있습니다 ... 따라 오는 다음 사람이 유지 보수 또는 이주의 악몽을 겪을 것이므로 남용하지 마십시오.

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

    페이지에서 분류 해제

    if($_GET['x']) {
       // unpack searilized and ecoded URL
       $_POST = unserialize(base64_decode($_GET['x']));
    }
    
  8. ==============================

    8.예, 저는 할수 있습니다. 우리는 시스템 수단을 추적해야한다고 가정합니다. 시스템에 둘 이상의 관리자 및 하위 관리자가 있습니다. 이들 모두는 정보를 삽입하거나 업데이트하거나 편집 할 수 있습니다. 나중에 누가이 변경을 수행했는지 알아야합니다. 이 문제를 해결하려면 직렬화가 필요합니다.

    예, 저는 할수 있습니다. 우리는 시스템 수단을 추적해야한다고 가정합니다. 시스템에 둘 이상의 관리자 및 하위 관리자가 있습니다. 이들 모두는 정보를 삽입하거나 업데이트하거나 편집 할 수 있습니다. 나중에 누가이 변경을 수행했는지 알아야합니다. 이 문제를 해결하려면 직렬화가 필요합니다.

      **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)
    

    이게 당신을 도울 수 있기를 바랍니다.

  9. ==============================

    9.기본적으로 배열이나 객체를 직렬화 할 때 PHP 스크립트 외부에 쉽게 저장할 수 있도록 유효한 문자열 형식으로 변환하면됩니다.

    기본적으로 배열이나 객체를 직렬화 할 때 PHP 스크립트 외부에 쉽게 저장할 수 있도록 유효한 문자열 형식으로 변환하면됩니다.

    객체에 대한 참고 사항에서는 마술 __sleep 및 __wakeup 메소드를 사용해야합니다. __sleep은 serialize ()에 의해 호출됩니다. 수면 메소드는 유지하려는 객체의 값 배열을 반환합니다.

    __wakeup은 unserialize ()에 의해 호출됩니다. 웨이크 업 메소드는 직렬화되지 않은 값을 가져 와서 오브젝트에서 초기화합니다.

    PHP와 js 사이에서 데이터를 전달하려면 json_encode를 사용하여 php 배열을 유효한 json 형식으로 변환합니다. 아니면 JSON.parese ()를 사용하여 출력 데이터 (문자열)를 유효한 json 객체로 변환합니다. 로컬 저장소를 사용하려면이 작업을 수행해야합니다. (오프라인 데이터 액세스)

  10. from https://stackoverflow.com/questions/8641889/how-to-use-php-serialize-and-unserialize by cc-by-sa and MIT license