【问题标题】:append data in serialized array with php用php在序列化数组中追加数据
【发布时间】:2012-07-12 23:46:35
【问题描述】:

我正在编写一个用于创建序列化数组的 php 脚本,如下所示:

$x=Array();
  $x[0]=$_GET['fname'];
  $x[1]=$_GET['lname'];
  $str=serialize($x);
  print $str;
  $y=$_GET['hf'];
  $con = mysql_connect("localhost","root","");
    if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("formdemo", $con);
    $sql="update rohit set data='$str' where fid='$y'";

现在我想在这个数组上附加更多数据。我该怎么办呢

感谢

【问题讨论】:

标签: php


【解决方案1】:

您必须将未序列化的数组添加值并再次序列化。

function add($serializedArray, $item)
{
   $array = unserialize($serializedArray);
   $array[] = $item;
   return serialize($array);
}

【讨论】:

    【解决方案2】:

    首先,您不会转义传递给脚本的数据。你必须这样做:

    $x[0] = mysql_real_escape_string( $_GET['fname'] );
    

    另外你不需要设置索引,所以:

    $x[] = mysql_real_escape_string( $_GET['fname'] );
    

    它将数据追加到数组的末尾。

    如果要在现有的序列化数组中添加新数据,则需要反序列化,添加数据并再次序列化:

    $x   = unserialize($x);
    $x[] = 'something else';
    $x   = serialize($x);
    

    【讨论】:

    • "First of all" 应该写成,"首先,不要使用mysql_*函数" ;)
    • 你不会拯​​救世界。我不做 ops app 重构,只是强调 SQL 注入问题。
    【解决方案3】:

    将其从数据库中取出,反序列化,添加数据,序列化,然后再次更新:

    $mysqli = new mysqli("localhost", "root", "", "formdemo");
    $stmt = $mysqli->prepare("SELECT data FROM rohit WHERE fid = ?");
    $stmt->bind_param('i', $_GET['hf']);
    $stmt->execute();
    $stmt->bind_result($x);
    $stmt->fetch();
    $stmt->close();
    
    $x = unserialize($x['data']);
    $x[] = "new data";
    $x = serialize($x);
    
    $stmt = $mysqli->prepare("update rohit set data=? where fid=?");
    $stmt->bind_param('si', $x, $_GET['hf']);
    $stmt->execute();
    

    【讨论】:

    • 我已经应用了所有方法,但我遇到了同样的问题 unserialize() [function.unserialize]: Error at offset 0 of 1 bytes
    • 并且,您是否回显了 $x 并查看它是什么?数据库中有数据吗?为简洁起见,我跳过了错误检查代码。每个结果访问方法都应该只在检查返回的行时使用。见这里:us.php.net/manual/en/class.mysqli-stmt.php
    • 当我使用 print_r 然后它返回数组但是当我再次更新表时它返回错误 unserialize() [function.unserialize]: Error at offset 0 of 1 bytes
    • 该错误听起来像是在传递的内容中没有看到序列化数据,这意味着可能没有正确设置数据库行。如果您在各个点检查数据(包括在数据库中的 PHPMyAdmin 或终端中),您应该能够追踪到问题。
    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 2021-03-29
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多