【问题标题】:Inserting into a serialized array in PHP在 PHP 中插入序列化数组
【发布时间】:2010-08-28 00:40:38
【问题描述】:

这是我第一次来这里,我一直在努力解决这个问题,所以我认为这对我来说是一个很好的第一个问题。

我将一些数组数据保存到 mysql 数据库中,然后我使用反序列化对其进行编辑。问题是当我只编辑一个索引时,它会清除数组中的所有其他索引。下面是一些示例代码:

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);
  }

感谢您提供的任何见解。

【问题讨论】:

  • 对于初学者,您不应该将序列化的数组插入数据库。现在,剩下的代码在哪里? $tempArray 是什么样的,你是如何保存这些数据的?
  • 那么我将如何将数组数据插入我的数据库?而 $tempArray 是一个临时数组,仅用于在我使用 unserialize 后编辑保存的数组。
  • 你没有。创建另一个表并使用外键将它们链接在一起。你总是可以使用 JOIN 得到你想要的。
  • @NullUserException 感谢您的帮助,我会考虑改用该方法。

标签: php serialization


【解决方案1】:

要将序列化的数组数据存储在 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);

}

以上只是给你一个想法。我希望你已经明白这里应该怎么做。

【讨论】:

  • 在 RDBMS 表中存储序列化数据几乎不是您想要做的。它对 RDBMS 本身隐藏了数据,因此您不能使用 SQL 的任何强大功能来搜索或以任何方式操作该数据。如果您想与数据库中数组中的项目建立“多”关系,请将它们放在自己的表中,并使用外键返回包含项目。
  • 那又怎样?他只是问如何去做,而不是写一本关于良好代码实践的书。也许根本不需要以关系方式处理这些数据。
  • @GlennPlas 感谢您的支持,就像您说的,这个问题没有询问任何类型的关系数据,它明确说明了数据的序列化和反序列化,数据库的设计是不同的故事。马克-里德一定误解了这一点。对于某些人来说答案可能很糟糕,因为会有不同的方法来实现相同的结果,而是评论“可怕的想法”,最好展示正确的方式 Nulluserexception
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 2012-06-10
  • 2014-05-21
  • 2012-12-23
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多