PHP数组,序列化和反序列化

时间:2011-10-22 00:05:10

标签: php arrays serialization

我有问题。我有一个网站,上面有人和不同的交易,他们在虚假的网上银行。我希望能够在我的mysql数据库中存储每个人的事务数组。我希望将每个事务定义为带有时间戳的关联数组和表示与“bank”进行事务的sql查询。

然后我希望在序列化之后,这些是包含所有事务的事务数组的值。然后我想序列化它并将其存储在数据库中,以便稍后我可以通过反序列化它并添加另一个事务的序列化数组来添加事务。到目前为止,下面的代码工作,除了它只是覆盖一个事务而不添加新事务。我真的很感激任何帮助。

提前致谢

function modify_transactions($row, $sql)
{
 $sql=mysql_real_escape_string($sql);
 if(isset($row["TRANSACTIONS"]))
 {
  $transactions = unserialize($row["TRANSACTIONS"]);
 }
 else
 {
  $transactions = array();
 }
 $transaction_array = array("timestamp"=>time(),"query"=>$sql);
 $transaction_data  = serialize($transaction_array);
 $transactions[] = $transaction_data;
 $transactions_upload = serialize($transactions);
 $name = $row["NAME"];
 $query = "UPDATE band.students SET TRANSACTIONS = '$transactions_upload' WHERE students.NAME = '$name'";
 mysql_query($query);
}

2 个答案:

答案 0 :(得分:3)

如果我是你,我宁愿去一个新表,其中每个条目都代表一个交易,并且有一个外键student_id

那将更多,更清晰,更灵活,更具可扩展性(例如,如果您想显示用户X的最后3笔交易怎么办?如果用户有数百万笔交易怎么办?)。

答案 1 :(得分:1)

首先,您不需要序列化每个数组,然后再次序列化。 Serialize是递归的:

$array = array(
    array(
        '1',
        array()
    ),
    array(
        '2',
        array()
    )
);

$serialized = serialize($array);

$unserialized = unserialize($serialized);

echo "<pre>";
print_r($unserialized);
echo "</pre>";

打印:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => Array
                (
                )

        )

    [1] => Array
        (
            [0] => 2
            [1] => Array
                (
                )

        )

)

所以只需在插入数据库之前进行序列化。

其次,您应该更改数据库结构。与vzwick一样,创建一个包含学生外键的新表。这样每个条目代表一个交易。

另外,为什么要存储实际的SQL查询?这对我没有任何意义。你为什么不实际做假交易?

相关问题