我试图修复unserialize()
上的PHP错误。我知道我们可以使用@
来抑制它,但是可以在不压制的情况下修复该错误。
这是表&我的代码:
TABLE: 'config'
id c_key c_value
1 facebook a:1:{i:0;s:8:"Newsfeed";}
2 mg_notification_msv to.aaaa.org
public function db_get_config($key, $default = null)
{
if (!empty($key)) {
// $record = $this->db_get_record($this->tables['config'], array('c_key' => $key));
$record = $this->db->from($this->tables['config'])->where(array('c_key' => $key))->limit(1)->get()->row_array();
if (!empty($record)) {
$value = unserialize($record['c_value']); // Message: unserialize(): Error at offset 0 of 15 bytes
if ($value === false) {
$value = $record['c_value'];
}
return $value;
}
}
return $default;
}
将$key
作为facebook
或mg_notification_msv
传递时,该函数会在array(1) { [0]=> string(8) "Newsfeed" }
上返回string(15) "to.aaaa.org"
或var_dump()
。
这将返回错误:
遇到PHP错误 严重性:通知消息:unserialize():偏移量为0的15字节错误 文件名:models / common_model.php 行号:xxxx
有没有办法解决这个PHP错误?
在strlen()
上使用$record['c_value']
对我没有帮助。
答案 0 :(得分:0)
它可能会抛出该错误,因为当您尝试反序列化mg_notification_msv的值时,它尝试反序列化之前未序列化的字符串(to.aaaa.org
不是序列化的字符串)
只有在字符串不可序列化时,您才可以尝试反序列化:
if (@unserialize($record['c_value']) !== false ) {
$value = unserialize($record['c_value']);
} else {
$value = $record['c_value'];
}
答案 1 :(得分:0)
我试过WP is_serialized()
&可能解决了我的问题。
<?php
public function db_get_config($key, $default = null)
{
if (!empty($key)) {
// $record = $this->db_get_record($this->tables['config'], array('c_key' => $key));
$record = $this->db->from($this->tables['config'])->where(array('c_key' => $key))->limit(1)->get()->row_array();
if (!empty($record)) {
$e = $this->is_serialized($record['c_value']); // WP support function
if ($e === true) {
$value = unserialize($record['c_value']);
if ($value === false) {
$value = $record['c_value'];
}
} else {
$value = $record['c_value'];
}
return $value;
}
}
return $default;
}
private function is_serialized( $data, $strict = true )
{
// 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 ( strlen( $data ) < 4 ) {
return false;
}
if ( ':' !== $data[1] ) {
return false;
}
if ( $strict ) {
$lastc = substr( $data, -1 );
if ( ';' !== $lastc && '}' !== $lastc ) {
return false;
}
} else {
$semicolon = strpos( $data, ';' );
$brace = strpos( $data, '}' );
// Either ; or } must exist.
if ( false === $semicolon && false === $brace )
return false;
// But neither must be in the first X characters.
if ( false !== $semicolon && $semicolon < 3 )
return false;
if ( false !== $brace && $brace < 4 )
return false;
}
$token = $data[0];
switch ( $token ) {
case 's' :
if ( $strict ) {
if ( '"' !== substr( $data, -2, 1 ) ) {
return false;
}
} elseif ( false === strpos( $data, '"' ) ) {
return false;
}
// or else fall through
case 'a' :
case 'O' :
return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
case 'b' :
case 'i' :
case 'd' :
$end = $strict ? '$' : '';
return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data );
}
return false;
}
?>