php反序列化值

Posted

技术标签:

【中文标题】php反序列化值【英文标题】:php unserialize values 【发布时间】:2017-06-10 19:46:50 【问题描述】:

$psabad1(i:169;i:170;i:173);这是序列化的。我想将此值转换为(169,170,173)。在这段代码中只返回第一个值(169),而我想返回所有值(169,170,173)

$stmt1 = $db->prepare("SELECT `psabad`,`transId`,`pardakht` FROM `orders` WHERE      `transId`=?");
$stmt1->bind_param("s", $transId);
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($psabad1, $transid1, $pardakht1);

while ($stmt1->fetch()) 
    $pardakht =  unserialize($psabad1);
    $stmt2 = $db->prepare("SELECT `idsabad`,`idmahsool`,sabad.tedad, sabad.pardakht, pack2.titr, pack2.brand FROM `sabad` INNER JOIN pack2 ON pack2.id = sabad.idmahsool WHERE `idsabad`=?");
    $stmt2->bind_param("i", $pardakht);
    $stmt2->execute();
    $stmt2->store_result();
    $stmt2->bind_result($idsabad2, $idmahsool2,$tedad2, $pardakht2, $titr2, $brand2 );
    $stmt2->fetch();
    echo $titr2;

【问题讨论】:

我无法理解您的问题。你能用一个暗示性的标题和简洁的信息重写你的帖子吗? 使用英文变量名也有助于我们更好地理解您的代码。 在此代码中仅打印第一个 $psabad1 的值,而我想打印 $psabad1 中的所有值 【参考方案1】:

你的输出看起来很奇怪。通常,序列化数据如下所示:

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

如果你的数据真的像你在标题中所说的那样,如下面的$s,你可以用这个小函数检索一个数组:

<?php

$a = [1,2,3,4,5,6,7,8,9];
$s = 'i:1;i:2;i:3;i:4;i:5;i:6;i:7;i:8;i:9;';

var_dump($a === _unserialize($s));

function _unserialize($s)
    $i = 0;
    $_s = '';
    foreach(explode(';', trim($s, '()')) as $part)
        if($part != '')
            $_s .= 'i:' . ($i++) . ';' . $part . ';';
        
    
    return unserialize('a:' . $i . ':' . $_s . '');

?>

输出:

..\php\php5.6\php.exe serialize.php
bool(true)

【讨论】:

感谢您的回答我想要 $s = 'i:1;i:2;i:3;i:4;i:5;i:6;i:7;i:8;我:9;';转换为 $a=1,2,3,4,5,... 并使用 Just one in ring while 例如:while($S.count)replace $r=a 我的例子中的 implode(',' _unserialize($s))foreach(_unserialize($s)...) 怎么样? 您的代码返回真或假,但我想返回数组值中的所有值,这意味着分别返回 1,2,3,4,5,6 和值 $s 来自数据库 请回答这个问题

以上是关于php反序列化值的主要内容,如果未能解决你的问题,请参考以下文章

PHP数组序列化和反序列化

理解PHP数组的序列化和反序列化

PHP反序列化漏洞

PHP序列化以及反序列化系列[1]--PHP序列化格式的写法

php序列化与反序列化

PHP 序列化与反序列化函数