【问题标题】:How to append a serialized string that already exists in the database如何附加数据库中已存在的序列化字符串
【发布时间】:2017-06-26 04:53:51
【问题描述】:

我刚刚开始学习序列化,我有一个问题,我似乎找不到简单的解释。

假设我有一个名为 week 的表,在 week 内我有 3 列,第三列包含一堆序列化的膳食 ID,就像这样存储在我的数据库中:

 INSERT INTO `week` (`week_id`, `meal_code`, `meal_id`) VALUES
(1, 'week12016', 'a:6:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;}');

但稍后我想将另一个 meal_id 附加到现有字符串但不更新任何其他列,以便读取

(1, 'week12016','a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;}') 

我已经尝试在一个php文件中存储以下内容

$food=array("7");
$sfood=serialize($food);

然后尝试将 7 添加到周表中现有的 meal_ids

mysqli_query($conn,"UPDATE week
            SET meal_id ('$sfood')");       
    //if entry into the database is successful, confirm with a alert popup and refresh the home page        
if(mysqli_affected_rows($conn) > 0){
    //header("location: admin.php");
 header("refresh:0; url=admin.php");
  echo "<script type='text/javascript'>alert('Upload Successful!')</script>";   
exit; 

但是当我检查我的数据库时,什么都没有改变。

我做错了什么,是否有可能做我想要实现的目标?

【问题讨论】:

  • UPDATE week SET meal_id ('$sfood') 您意识到您正在尝试在没有WHERE 子句的情况下更新整个数据库。通过mysqli_error($conn) 来检查错误会帮助你。 RTM dev.mysql.com/doc/refman/5.7/en/update.html 也让您失望了,您使用的语法不正确。
  • 我可能会建议获取列,反序列化,添加数据,重新序列化,然后 UPDATE ... WHERE。否则,您将覆盖数据或使其无效。
  • 另外,如果你想追加更新,你需要使用 CONCAT()CONCAT_WS() dev.mysql.com/doc/refman/5.7/en/string-functions.html 如果这是问题所在。
  • 数据库表中的序列化字符串不好。它们违反了 1NF,从长远来看,它们带来的麻烦多于它们的价值。举个例子,如果数据库设计更好,您就不会遇到这个问题。用外键、链接表等重构你的数据库。从长远来看,你会感谢我的。
  • 当然,这更像是一个关于更好地理解序列化的问题,我理解我所问的限制可能不是最佳实践,但就像我说的那样,我只是在学习序列化并给出了一个假设场景而不是基于我正在进行的实际设计。

标签: php mysql serialization


【解决方案1】:

您必须从表格行中读取该列。将其反序列化为 PHP 变量,然后为其添加新的出现。

然后序列化新数组并将其存储回您的数据库

// SELECT from table
$s = 'a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;}';

$d = unserialize($s);

print_r($d);

$d[] = 99;
print_r($d);

$s2 = serialize($d);
echo $s2;

// UPDATE table row

结果

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 99
)
a:8:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:99;}

不建议这样存储数据,因为这样会导致无法使用查询处理这些数据

【讨论】:

  • 不太清楚为什么这被否决了,它在技术上是正确的(至少就数据库中的序列化数据而言是正确的)。
  • @GordonM 我认为他们的答案之一让我感到不安,我认为这是正确的。但这不是第一次发生。我猜这是我 DV 回答他时留下评论的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多