【发布时间】:2017-02-08 21:40:08
【问题描述】:
我正在学习序列化,虽然我理解这个概念,但我不熟悉它的局限性。
以下是一个虚构的场景,假设我有一个名为 week 的表格,并且表格周内有 3 列。第三列保存序列化数据如下:
INSERT INTO `week` (`week_id`, `meal_code`, `meal_id`) VALUES
(1, 'week12016', 'a:7:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}'),
然后我有另一张桌子叫meal,里面的饭菜如下:
INSERT INTO `meal` (`meal_id`, `meal_name`) VALUES
(1, 'Chorizo tapas'),
(2, 'Mediterranean halloumi burger'),
(3, 'Lamb Moussaka'),
(4, 'Snappy Asian Fish En Papillote'),
(5, 'Puttanesca Risotto'),
(6, 'Mexican Pork Chilli With Apple Salsa'),
(7, 'Warm Greek Salad');
现在说我有一些带有如下复选框的 HTML:
Monday []
Tuesday []
Wednesday []
Thursday []
Wednesday []
Thursday []
Friday []
Saturday []
Sunday []
然后我决定添加另一餐,餐食 ID 为 8 并勾选星期一框,是否可以更新序列化数组以反映勾选框,使其显示如下:
'a:7:{i:0;s:1:"8";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";i:4;s:1:"5";i:5;s:1:"6";i:6;s:1:"7";}'),
看看现在“8”是如何代替“1”的。餐桌有点无关紧要,因为它是一个序列化数组,但我已将其添加为上下文。
我想知道是否可以按照我的描述进行操作?
假设我猜是这样的:
$monday=$_POST['monday'];
$result = mysqli_query($conn,"SELECT meal_id from WEEK");
$array = unserialize( $result );
$array[0] = $meal_id;
$sfood=serialize($array);
if ($_POST['weekday'] == 'monday')
{
mysqli_query($conn, "UPDATE week SET meal_id ('$sfood') ");
}
我知道以上内容不正确,但这是我尝试过的,不知道下一步该做什么。
【问题讨论】:
-
你有错误的表结构.. 我想,你需要将它分开.. 想象一下,很难过滤出你在星期五吃“Puttanesca Risotto”的星期是多么困难?或者您是否会再添加 20 餐?或者您一天需要选择多于 1 餐?
-
哦,是的,我完全同意,如果这要在实际系统中实现,那将是错误的做法,但为了基于表格中的一行进行学习,应该是易于管理。
-
不,放弃这个想法,将每周的meal_id 存储在自己的行中。序列化的数据不适合数据库中的任何内容。您可以从我们/其他人的错误中学习,也可以通过艰难的方式学习。
-
我只是想澄清一下,我并不是要求基于数据库规范化的答案,因为我很欣赏这打破了 1NF,但我有兴趣了解序列化的局限性以及这个概念是否可行。跨度>
标签: php mysql arrays serialization