在PHP中向序列化数组中插入数据

3

这是我第一次来到这里,我已经因为一个问题困扰了好久,所以我认为这是我问的一个好问题。

我正在将一些数组数据保存到mysql数据库中,然后稍后我要使用unserialize来对其进行编辑。问题在于,当我编辑一个索引时,它会使数组中的每个其他索引都变为空白。以下是示例代码:

foreach($post as $key => $value)  {
     if (isset($row)) {
        if ($i > 2) { $tempArray = unserialize($row[$i]); }
     }

     $tempArray[$time] = $value;

     if ($key == 'pid' || $key == 'uid') { $data[$key] = $value; }
     else { $data[$key] = serialize($tempArray); }
     $i += 1;
     unset($tempArray);
  }

感谢您能提供任何见解。
谢谢。

4
首先,您不应该将序列化数组插入数据库。现在,剩下的代码在哪里?$tempArray是什么样子的,以及您如何保存这些数据? - NullUserException
我该如何将数组数据插入到我的数据库中呢?$tempArray是一个临时数组,仅用于在使用反序列化之后编辑保存的数组。 - Axus
6
不需要这样做。创建另一个表格并使用外键将它们链接在一起。您可以始终使用JOIN获取所需内容。 - NullUserException
@NullUserException 谢谢你的帮助,我会研究一下使用那种方法。 - Axus
1个回答

3

要在MySQL中存储序列化的数组数据并检索和保存回同一表,以下是您需要执行的操作。

从表中获取序列化的数据并对其进行反序列化,将数组数据存储在变量中。通过使用我们存储数据的变量来更改数组数据。

再次序列化具有修改后数组的变量,并使用新的序列化数据更新mysql表字段。

例如:

$data = array(
   "uid" => "some value",
   "pid" => "some value"
);

$store_in_database = serialize($data);
/* ...do the mysql insert query to store the new data in the field (serializedfield)... */

现在需要更新存储在数据库表字段中的序列化数据。
/* ...以任何你喜欢的方式获取表格行或记录(单个记录或多个记录) */
foreach($db_result as $db_row){

$temp_array = $db_row['serializedfield'];
$temp_array['uid'] = "a new value";
$temp_array['pid'] = "another new value";

/* ... i wanted to add another array value */
$temp_array['akey'] = "some value";
$store_database = serialize($temp_array);
/* ... do the mysql update query to replace this new data with the old one. */
unset($temp_array);

}

以上只是为了让您有个概念。我希望您已经明白了应该如何在这里操作。

将序列化数据存储在关系型数据库表中几乎从来不是您想要做的事情。它会将数据隐藏在关系型数据库管理系统本身之外,因此您无法使用 SQL 的强大功能来搜索或以任何方式操作该数据。如果您想在数据库中使用“有多个”关系与数组中的项目相关联,请将它们放入自己的表中,并使用外键返回到包含项目。 - Mark Reed
1
那又怎样?他只是问如何做,而不是写一本关于好的代码实践的书。也许根本没有必要以关系方式处理那些数据。 - Glenn Plas
@GlennPlas 感谢您的支持,正如您所说,问题并没有要求任何关系数据,它明确说明了数据的序列化和反序列化,数据库的设计是另一回事。Mark-reed可能误解了这一点。答案对某些人来说可能很糟糕,因为有不同的方法可以实现相同的结果,但是与其评论“可怕的想法”,最好展示正确的方法。Nulluserexception - Raftalks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接