【问题标题】:When serializing array, won't serialize last number序列化数组时,不会序列化最后一个数字
【发布时间】:2016-07-03 22:38:43
【问题描述】:

在这个程序中,我试图从 MySQL 表中取出一个序列化数组,然后向其中添加一个结果,然后重新序列化该数组并将其放回表中。这是我的代码:

for($i = 0; $i < $count; $i++){
        $query = "SELECT `assignment_assigned` FROM `users` WHERE isAdmin = 0 LIMIT 1";
        $result = mysqli_query($con, $query);
        if($result === FALSE) { 
            echo "Failed".mysql_error();
        } else {
            $unserializedVal = unserialize(implode(mysqli_fetch_array($result)));
            $array = array_push($unserializedVal, $val);
            $serializedVal = serialize($unserializedVal);
}
<h1><?php print_r($unserializedVal); ?></h1> 

当我这样做时,我检索了数组并且可以很好地反序列化它,但是当我尝试重新序列化它时,就会出现:

a:8:{i:0;i:2;i:1;i:3;i:2;i:4;i:3;i:5;i:4;i:6;i:5;i:7;i:6;i:8;i:7;s:2:"10";}

原来的序列化字符串是这样的:

a:7:{i:0;i:2;i:1;i:3;i:2;i:4;i:3;i:5;i:4;i:6;i:5;i:7;i:6;i:8;}

我添加最后一个数字之前的数组如下所示:

Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 7 [6] => 8 )

加上最后一个数字后:

Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 7 [6] => 8 [7] => 10 )

这里有什么帮助吗?

【问题讨论】:

  • 快速提示:由于您总是运行相同的查询(不是动态的),只需将结果保存在for 之前的变量中。这样你就不会运行多个选择,据说每次都返回相同的结果......
  • 我刚刚意识到,您正在运行mysqli_* 函数,但是在显示错误时,您使用mysql_error。注意你can't mix APIs

标签: php mysql arrays serialization


【解决方案1】:

您将s:2:"10"; 添加到您的序列化数组中,因为您添加的值是字符串,而不是整数。

您可以使用intval() 将字符串转换为整数。

$val = intval($val);

对于错误检查,intval() 将返回 0。

已编辑以修复 db 数据将排列的错误。

$originalSerializedVal = mysqli_fetch_array($result);
$unserializedVal = unserialize($originalSerializedVal['0']);
$val = intval($val);
// add error handling here
$array = array_push($unserializedVal, $val);
$serializedVal = serialize($unserializedVal);

注意:已删除 implode(),正如其他人指出的那样。 mysqli_fetch_array 中的数据是一个数组,但您只对所选字段感兴趣。 implode 会将数组转换为字符串,但没有必要。

【讨论】:

  • 看来问题是$val不是整数,但是如果我取出implode,array_push不起作用,所以我实际上需要implode()。
【解决方案2】:

implode() 不做序列化字符串,所以你不能这样做:

$unserializedVal = unserialize(implode(mysqli_fetch_array($result)));

简单地使用:

$unserializedVal = mysqli_fetch_array($result);

我无法保证您的代码现在会按照您的意图执行,但这是一个明显的错误。

【讨论】:

  • 问题是如果我删除 implode 那么系统会抛出这个错误:Warning: unserialize() expects parameter 1 to be string, array given
  • 那是因为你听从了特里斯坦的建议,而他弄错了。请仔细阅读答案。
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 2016-01-15
  • 2017-01-25
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多