【发布时间】: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