【问题标题】:unserialize() value of database and putting it in json_encode after foreachunserialize() 数据库的值并在 foreach 之后将其放入 json_encode
【发布时间】:2011-11-08 08:26:46
【问题描述】:

我使用函数serialize()=>[$row->units] 插入数据库值(数组)$row->units,如何在json_encode$row->name 中使用unserialize() 回显它们? (在 jQuery 中为 ajax 调用返回发送)

数据库中的列:

$row->单位 => a:6:{i:0;s:15:"Coffee";i:1;s:14:"Satellite";i:2;s:11:"Game Notes";i:3;s:14:"Internet";i:4;s:10:"Pool";i:5;s:0:"";}

$row->name=> George Kurdahi

$query = $this->db->query("SELECT * FROM arraha WHERE name LIKE '%$search%' ORDER BY name asc");

$data = array();
foreach ($query->result() as $row)
{
   $data[] = array('name' => $row->name, 'units' => unserialize($row->units)); // Line 22
}
return json_encode($data)

上面代码的错误是:

遇到了 PHP 错误

严重性:通知

消息:unserialize() [function.unserialize]:偏移 277 处出错 281 字节

文件名:model.php

行号:22

【问题讨论】:

  • 要么序列化失败,要么列不够大,无法容纳数据,要么存在字符集问题。您能否向我们展示您反序列化之前的字符串,以及SHOW CREATE TABLE arraha 输出?
  • 编辑了我的帖子。请再看一遍。
  • 为什么要将序列化的值放入 RDBMS?
  • 创建另一个表,比如arraha_units,有两个字段,比如arraha_id(在arraha 中为您的PK 提供FK)和unit(也可能是它自己的PK)。去掉arraha 中的units 列。现在将(1, 'Coffee')(1, 'Satellite') 等行插入到这个新表中。
  • 现在您可以使用以下命令获取 id=1 的所有单位:SELECT unit FROM arraha_units WHERE arraha_id=1

标签: php codeigniter serialization json denormalized


【解决方案1】:

您在字符编码方面遇到了一些问题:

s:15:"Coffee"

15 表示以字节为单位的长度。因此,您必须将从 DB 获取的数据的编码转换为与 serialize() 一起使用的编码

您可以使用 json_encode 代替序列化:

$arr = array('Coffee', 'Satellite', /*...*/);
$row->units = json_encode($arr);

【讨论】:

  • 这是真的,您的序列化列不应该有字符集。就序列化字符串而言,您没有存储“文本”数据。考虑使用 BINARY/VARBINARY/BLOB 列而不是 CHAR/VARCHAR/TEXT 列。
  • @George 如果您不想更改应用程序设计,请更改 DB 中的列类型或将序列化替换为 json_encode。或者,您可以将数组存储为 XML 文档。然后就可以用ExtractValueMySQL函数查询了
  • @Wrikken 没错。我用过VARCHAR。我使用哪一个(BINARYVARBINARYBLOB)?
  • @ExtractValue 如何使用json_encode,你能在第一篇文章中给出我的代码示例吗?
  • @George Kurdahi:类型取决于需要。您需要在那里输入多少数据? (尽管 NullUserException 的评论有些为时过早,因为他还不知道您的数据,但数据库规范化可能是一个更好的解决方案)。
猜你喜欢
  • 2011-11-19
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多