【问题标题】:Unserialize query (array) data is not working反序列化查询(数组)数据不起作用
【发布时间】:2014-09-04 13:25:21
【问题描述】:

我最近创建了一个带有复选框的搜索功能,用于查询提交的复选框值并将这些值返回到表中。 然而问题是某些复选框值(在数据库中)是序列化的。当我在 foreach 中为每个复选框值显示查询结果变量时,它返回序列化字符。显然我只想显示没有奇怪字符的字符串。

原始的一段代码,返回整个序列化字符如下:

if(count($tmp)>0){
    for($i=0;$i<count($tmp);$i++){
        echo "<tr>";  
            foreach($tmp[$i] as $key=>$value){

               echo"<td>" . $value . "</td>";           
            }           
        echo "</tr>";
    }
}
echo '</table>';

所以为了只显示数据库值的字符串,我尝试使用反序列化函数($tmp 是存储查询结果的变量)。然而,这有几个问题,即:

  1. echo 不支持反序列化
  2. 数据库和查询也可以返回非序列化数据(因此 $tmp 变量可以包含 a. 带有奇怪字符的序列化值和 b. 只是一个非序列化的普通字符串)。
  3. 因为反序列化函数也得到“正常”字符串,这些正常字符串将被输出为空白..
  4. 出于某种原因,数组/未序列化数据(使用 print_r)的输出显示的不是字符串,而是整个数组名称,如下所示:Array ( [0] =&gt; [1] =&gt; Netherlands )

下面的代码是我尝试反序列化数据的方式:

  if(count($tmp)>0){
        for($i=0;$i<count($tmp);$i++){
            echo "<tr>";  
                foreach($tmp[$i] as $key=>$value){              

                echo "<td>";
                $b=unserialize($value);
                print_r($b);
                echo "</td>";                                                   
                }           
            echo "</tr>";
        }
    }
    echo '</table>';

尽管如前所述,上面的代码显示了整个数组名称,而数据库的“普通”字符串也被查询,显示为空白。

那么如何解决这个问题呢?

提前谢谢你

【问题讨论】:

    标签: php mysql sql arrays deserialization


    【解决方案1】:

    Php 反序列化可以返回几个东西,包括一个数组,这是你的情况。这样做

    foreach($tmp[$i] as $key=>$value){              
    echo "<td>";
    $b=unserialize($value);
       if(is_array($b)){
         //this assumes your array is always like this Array ( [0] => [1] => Netherlands )
         echo $b[1];
        }
       else{
         echo $value;
        }
    echo "</td>";                                                   
    }    
    

    【讨论】:

    • 啊,太棒了,谢谢。但是,[1] 并不总是相同的,数组也有可能包含 2 个值(或更多),因此它将是 Array ( [0] => [1] => Netherlands )、Array ( [0 ] => [2] => 美国),数组([0] => [3] => 英国)。因此 [] 是一个可以更改的值(如果只选择一个选项,则无论名称是什么,该选项都将始终为 [1]。尽管一旦用户选择了多个选项,[2],[ 3] 将被分配(选择列表是按字母顺序排列的,因此如果选择了所有选项,则字母的第一个字母将是 [1],依此类推)。
    • 您可以使用array_filter($b) 删除数组中的空值。
    • 如果你的数组像你在上面评论中所说的那样,你总是会使用 $b[0]
    • 嗯@Funk Doc 随着更新 [0] 它什么也没显示,所以这是不对的。 So i looked at my arrays once more and i noticed that when more than one is selected it shows this: Array ( [0] => [1] => Netherlands [2] => America )
    • 然后这样做 if(is_array($b)){ array_filter($b); foreach($b as $y){echo $y;} }
    猜你喜欢
    • 2013-04-23
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2012-07-11
    • 1970-01-01
    • 2016-12-22
    • 2020-10-16
    相关资源
    最近更新 更多