[英]unserialize() function does not work on a variable from the MySQL table on new server
我們剛剛將網站切換到新服務器。 我的PHP軟件中有一部分從MySQL表中提取序列化數據值,並將其放入變量中,然后它應該是unserialize()。
我從來沒有在任何其他服務器上出現此問題(這個確切的代碼在許多不同的服務器上使用..),但我遇到的問題是值無法反序列化 - 它返回false(空白)。
但是,如果我復制確切的值,將其放入另一個$ var,然后反序列化($ var)它,它可以很好地處理數組...它們是完全相同的值。 一個有效,另一個沒有。
看看以下鏈接,想象我的意思..
http://paulmasoumi.com/admin/test.php
此頁面上的PHP代碼是:
<?
include 'start.php';
$var = 'a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";}';
echo 'Echoing $var:<br />';
echo $var;
echo '<br />';
echo 'Echoing $settings[\'remarksdisplay\'] retrieved from mysql database field:<br />';
echo $settings['remarksdisplay'];
echo '<br />';
echo '<br />';
echo 'When you run print_r(unserialize($var)):<br />';
print_r(unserialize($var));
echo '<br />';
echo 'When you run print_r(unserialize($settings[\'remarksdisplay\'])):<br />';
print_r(unserialize($settings['remarksdisplay']));
echo '<br />';
echo '<br />';
echo 'When you run IF statement to see if $settings[\'remarksdisplay\']==$var:<br />';
if($settings['remarksdisplay']==$var) {echo "EQUAL";} else {echo 'not equal';}
?>
我還檢查了有關serialize()和unserialize()函數的服務器設置......
看看這兩個設置: http : //www.paulmasoumi.com/admin/phpinfo.php http://demo.brixwork.com/admin/phpinfo.php
涉及字符串序列化,魔術引號等的設置都是相同的。
我錯過了什么?
字符串不相同。 查看頁面的來源,數據庫中出現的內容有一個換行符:
a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great
Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";
正如你所看到的那樣偉大。 但是,它應該處理新的行字符就好了。 當我復制數據庫序列化字符串並嘗試反序列化時,我收到了:
PHP注意:unserialize():第1行的php shell代碼中234字節的偏移量176出錯
這意味着發生了一些時髦的事情,不確定是什么。 我將繼續挖掘,但只是張貼我發現的東西。 但是,如果您想要真正的測試,請在Great之后添加換行符。
UPDATE
<?php
$var = 'a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great' . "\n" .
'Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";}';
$settings['remarksdisplay'] = 'a:8:{i:0;s:0:"";i:1;s:11:"New Listing";i:2;s:11:"Just Listed";i:3;s:9:"New Price";i:4;s:17:"Exclusive Listing";i:5;s:12:"Just Reduced";i:6;s:31:"Great
Price!;Showroom Condition";i:7;s:42:"Featured In;Dream Homes of Canada Magazine";}';
echo 'Echoing $var:' . PHP_EOL;
echo $var;
echo "\n\n";
echo 'Echoing $settings[\'remarksdisplay\'] retrieved from mysql database field:' . PHP_EOL;
echo $settings['remarksdisplay'];
echo "\n\n";
echo 'When you run print_r(unserialize($var)):' . PHP_EOL;
print_r(unserialize($var));
echo "\n";
echo 'When you run print_r(unserialize($settings[\'remarksdisplay\'])):' . PHP_EOL;
print_r(unserialize($settings['remarksdisplay']));
echo "\n\n";
echo 'When you run IF statement to see if $settings[\'remarksdisplay\']==$var:' . PHP_EOL;
if($settings['remarksdisplay']==$var) {echo "EQUAL";} else {echo 'not equal';}
echo PHP_EOL;
?>
抱歉,我將Linebreaks更改為NewLine字符,因為我在CLI中對其進行了測試。 上面的代碼在Great刪除后有額外的空間,它工作得很好。
所以發生的事情基本上就是額外的空間從計數中消失了,因為你可以看到s:XX數字表示字符串有多長,額外的空格使得32為“Great Price”語句而不是31,因為序列化需要准確,它是一個通知錯誤,大多數人沒有顯示,為什么沒有錯誤通過。
使用substr刪除引號
$str = substr( $data['str'], 1, -1 );
然后反序列化您的數據。
原因是mysql返回引用的字符串
只是猜測,也許數據庫會返回一些與unserialize不能很好匹配的對象? 嘗試:
$str = (string) $settings['remarksdisplay'];
print_r(unserialize($str));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.