집 >데이터 베이스 >MySQL 튜토리얼 >직렬화된 PHP 문자열의 잘못된 바이트 수 길이로 인해 발생하는 'unserialize(): 오프셋 오류'를 수정하는 방법은 무엇입니까?
잘못된 바이트 수 길이로 인해 손상된 직렬화된 문자열을 수정하는 방법
오류 "unserialize() [function.unserialize ]: 오프셋 오류"는 손상된 직렬화된 문자열로 작업할 때 자주 발생합니다. 이 경우 문제는 잘못된 바이트 수 길이로 인해 발생합니다.
문제 이해
PHP가 데이터를 직렬화할 때 직렬화된 각 요소의 길이를 접두사. 이 길이가 정확하지 않으면 PHP는 문자열을 올바르게 역직렬화하지 못합니다.
빠른 수정
이 문제를 해결하려면 다음을 사용하여 직렬화된 배열의 각 요소 길이를 다시 계산하세요. 다음 코드:
$data = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data);
예:
$data = 'a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15:"submit_comments";s:4:"open";s:5:"image";s:19:"C:\fakepath0.jpg;"}'; var_dump(unserialize($data)); // Error var_dump(unserialize($recalculated_data)); // Correctly serialized
권장사항:
빠른 수정에 의존하는 대신 코드를 업데이트하는 데 중요 to:
검증 기능:
function findSerializeError($data1) { $data2 = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('').':\"\";'", $data1); $max = max(strlen($data1), strlen($data2)); for ($i = 0; $i < $max; $i++) { if (@$data1[$i] !== @$data2[$i]) { return "Error at offset $i"; } } return true; }
위 내용은 직렬화된 PHP 문자열의 잘못된 바이트 수 길이로 인해 발생하는 'unserialize(): 오프셋 오류'를 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!