【问题标题】:Mapping javascript objects to their ids in an MySQL database将 javascript 对象映射到它们在 MySQL 数据库中的 id
【发布时间】:2011-01-13 23:30:59
【问题描述】:

这是一个我想了很久的问题,但是因为不知道怎么形容,所以不想问。。还是不知道有没有我可以很好地描述它,但它就在这里..

我有一个网络应用程序,它允许您操作页面上的一堆元素,但有一个保存按钮。当我点击保存时,我想在一个 POST 中创建/更新所有这些更改(而不是增量)。如果这些 html 元素是第一次在页面上创建,我想将它们作为新条目插入到数据库中。当这些更改第一次保存在数据库中(创建)时,我返回索引 ID,因此如果我再次进行更改,它们将在数据库中更新,而不是再次创建。

难点在于批量保存,以免占用所有带宽。我希望能够混合和匹配创建和更新,但是从创建的元素发回 ID 并将它们映射到正确的 html 元素(以便下次更新它们)需要我了解每个批处理元素的顺序这导致了一些问题。我想知道是否有一种巧妙的方法来创建或更新,并将 ID 正确映射回一个 ajax 请求下的各种元素。

希望这很清楚,如果您需要澄清,请告诉我

谢谢, 马特·穆勒

【问题讨论】:

  • 你的元素有什么样的 ID 值?用户是否必须明确告诉页面需要一个新实体,或者是否有实体的某些属性用作键? (例如,如果用户输入最喜欢的度假城市的名称,城市名称可能是“自然”键,因此不必有明确的数据库生成键。)
  • 另外:请记住,当事情回到您的服务器应用程序时,一切都将在基于字段名称的映射中。一种常见的做法是让字段名称包含一些索引值(如“name_23”或“name[23]”,具体取决于您的服务器环境)。
  • 好问题。为了简单起见,我没有解释整个故事。 ID 是链接到数据库中主键的数字。 ID 存储在 javascript 中,映射到 html 元素。如果你熟悉 jQuery,它就像 $('#htmlelement').data('ID', 3);
  • 好吧,当我发布第一条评论时,我没有看到你是第二条评论。嗯,返回给应用程序的内容类似于 {7,9,34,5},它对应于更新/创建的 ID。问题是我必须知道它被批处理以更新 html 元素的顺序。这导致了一些问题..
  • 它们都以相同的字段名称保存到同一个表中,因此不会使返回的内容唯一。

标签: php javascript ajax mapping


【解决方案1】:

您可以只对新创建的元素使用负的自动递减 ID,并返回从负 ID 到正 ID 的映射。例如,发送[{id: 507, name: "foo"}, {id: -1, name: "bar"}, {id: -2, name: "baz"}],返回{-1: 510, -2: 511},然后让您的javascript根据地图更新其ID。

【讨论】:

  • 太巧妙了!因此,对于您只需要更新的元素,您会从服务器返回类似“{40:40}”的内容吗?
  • 是的。我的意思是,它可以假设不在地图中的元素保持相同的 id,但它肯定可以工作。我很高兴你喜欢它。 :)
  • 嗯,好电话。这就是我实现它的方式。我从没想过使用负数作为替代状态!如此优雅..
【解决方案2】:

好吧,加载后,从数据库中获取next ID,所以你知道,数据库中的下一页部分将是什么ID。然后,在创建后,您可以在 javascript 中使用它 - 即:

下一个 ID 是 15,所以当你添加下一个字段时,它的 ID 是 16,堆栈中有 ID 17...当你删除一个新创建的字段时,将每个更高的 ID 向下移动一个也没有问题。

然后,在您的保存脚本中,您知道,每个大于您之前获取的 ID 的 ID 都将被“保存”,而每个较小的 ID 都将被更新。

【讨论】:

  • 那么,如果两个人在使用该页面会发生什么?您不能假设新值的键值超出了以前的值。
  • - 每次都在一个时刻保存...所以当您要保存并知道 15 之后的所有内容都是新的时 - 您只需从数据库中获取新的 newID(比如 20),编辑新的 ID 并将其保存到数据库 - 不会造成任何伤害。
  • 这在正常情况下可以工作!我没有很好地解释我的应用程序,以便您更好地了解,但基本上所有内容都是在页面加载时“创建”的。它是一个 ajax 应用程序,因此在交互的生命周期中可以更新和创建事物,但一开始一切都是从创建开始的。当我添加“编辑”功能时,这将完美无缺。谢谢!
【解决方案3】:

如果您的页面知道何时创建了新元素,那么它应该安排该组参数(即要添加的实体的属性)的“id”参数为 null(未提供)或一些标记值。已经存在的实体有它们的 ID 值,客户端无法更改。服务器只需将 ID 值为空的参数组与非空值的参数组分开即可。

您的客户可能还希望将元素标记为删除。在这种情况下,已经存在的实体将通过一些指示“DELETE ME”的标志参数发回他们的 ID。在“提交”之前创建然后删除的实体不需要服务器处理。

【讨论】:

  • 是的,没错。我就是做这个的。在这个创建组中,我仍然需要知道它们是如何被批处理的(创建的顺序)。查看@bluej100 的回复。我认为这是解决这个问题的有效方法。感谢您的帮助!
猜你喜欢
  • 2023-03-15
  • 2012-07-18
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2022-12-10
  • 1970-01-01
相关资源
最近更新 更多