簡體   English   中英

unserialize()函數不能對新服務器上的MySQL表中的變量起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM