>백엔드 개발 >PHP 튜토리얼 >PHP 직렬화된 문자열에서 'unserialize(): 오프셋 오류'를 수정하는 방법은 무엇입니까?

PHP 직렬화된 문자열에서 'unserialize(): 오프셋 오류'를 수정하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-08 12:51:11391검색

How to Fix

잘못된 바이트 수 길이로 손상된 직렬화된 문자열을 복구하는 방법

소개

직렬화된 데이터를 처리할 때 다음과 같은 오류가 발생할 수 있습니다. "unserialize() [function.unserialize]: 오프셋에 오류가 있습니다." 이 오류는 일반적으로 잘못된 바이트 수 길이로 인해 잘못된 직렬화 데이터로 인해 발생합니다.

오류가 발생하는 이유

직렬화 중에 PHP는 strlen( ) 기능. 그러나 데이터에 큰따옴표와 같이 특별한 처리(예: 이스케이프)가 필요한 문자가 포함된 경우 바이트 수가 올바르지 않을 수 있습니다.

빠른 수정

이 오류를 해결하려면 다음을 수행하십시오. 직렬 배열의 각 요소 길이를 수동으로 다시 계산하는 데 필요함:

$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);

권장 접근 방식

빠른 수정 외에도 잘못된 직렬화의 원인을 파악하는 것이 중요합니다. 다음 단계를 고려하세요.

  • 큰따옴표(")가 올바르게 이스케이프되었는지 확인하세요. 예를 들어 작은따옴표(')를 사용하세요.
  • 데이터에 UTF-8 문자가 포함되어 있으면 다음을 사용하세요. array_map("utf8_encode", $data)을 사용하여 직렬화하기 전에 인코딩합니다.
  • base64 인코딩을 사용하여 직렬화된 데이터를 변환합니다. 데이터를 데이터베이스에 저장하기 전에 안전한 형식으로 변환:
$toDatabase = base64_encode(serialize($data));  // Save to database
$fromDatabase = unserialize(base64_decode($data)); //Getting saved format

직렬화된 데이터에서 오류 감지

오류 메시지가 문제에 대한 일반적인 표시를 제공하지만 종종 도움이 됩니다. 손상된 데이터의 정확한 위치를 찾아내려면 두 개의 직렬화된 문자열을 비교하고 잘못된 문자열을 포함하여 둘 사이의 차이점을 식별하는 findSerializeError 함수를 사용하십시오. 바이트 수:

function findSerializeError($data1) {
    echo "<pre class="brush:php;toolbar:false">";
    $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1);
    // ...
}

이 기능은 오류에 대한 자세한 정보를 제공하여 직렬화 문제를 식별하고 해결하는 데 도움이 됩니다.

위 내용은 PHP 직렬화된 문자열에서 'unserialize(): 오프셋 오류'를 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.