我在申请SO Ans.后提出问题
我正在尝试从DB中提取的序列化字符串中取消序列化。
我得到错误:取消初始化偏移错误
我有两箱
两种情况下的代码相同:
$categories = preg_replace( '!s:('d+):"(.*?)";!se', "'s:'.strlen('$2').':'"$2'";'", $data['Member']['category'] );
var_dump($categories);
$cat_unserialize = unserialize($categories);
var_dump($cat_unserialize );
情况1:当
$data['Member']['category'] => Adventure Camps
情况1:错误:
string 'Adventure Camps' (length=15)
Notice (8): unserialize(): Error at offset 0 of 15 bytes
boolean false
情况2:当
$data['Member']['category'] => a:4:{i:0;s:9:"Adventure";i:1;s:12:"Sports ";i:2;s:15:"Training";i:3;s:29:"Educational";}
情况2:无错误代码id工作良好
Unserialize仅适用于序列化的字符串。当试图取消序列化非序列化数组的字符串时,需要防止打印通知。
$cat_unserialize = @unserialize($categories);
否则,我不知道为什么会有问题
然后,在使用变量之前,您可以检查它是数组还是字符串。
if(is_array($cat_unserialize)) {
//do something with array.
}
else {
//do something with string.
}
此外,我不理解preg_replace()。为什么要删除使字符串序列化的元素,然后尝试取消序列化?
如果你想要长选项:这是来自wordpress
<?php
function is_serialized( $data ) {
// if it isn't a string, it isn't serialized
if ( !is_string( $data ) )
return false;
$data = trim( $data );
if ( 'N;' == $data )
return true;
if ( !preg_match( '/^([adObis]):/', $data, $badions ) )
return false;
switch ( $badions[1] ) {
case 'a' :
case 'O' :
case 's' :
if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]'$/s", $data ) )
return true;
break;
case 'b' :
case 'i' :
case 'd' :
if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;'$/", $data ) )
return true;
break;
}
return false;
}
检查字符串是否已序列化?