【问题标题】:Adding entries into database instantly or after filling out form立即或在填写表格后将条目添加到数据库中
【发布时间】:2013-03-29 19:21:17
【问题描述】:

我正在开发一个允许在数据库中维护组织成员的 PHP/MySQL 应用程序。目前,在单击“添加成员”跨度时,我在数据库中插入一个空白条目并将创建的 ID 返回给 PHP。收到有效 ID 后,应用程序用户将通过 jQuery 重定向到引用新创建成员的编辑页面。

据我所知,这有以下优点/缺点:

优势

  • 可以在提交 jQueryUI 对话框后立即将购买/付款与成员关联,因为我已经拥有该成员的 ID。
  • 统一了原本单独的添加/编辑屏幕,因此更易于维护。

缺点

  • 很有可能我的条目过时。也就是说,有人可能多次单击“添加成员”而不保存新页面,从而导致条目保持空白。
  • 无法在表中强制执行尽可能多的约束,因为我需要能够接受所有列的 NULL。

我是否考虑了所有场景/优点/缺点?我应该为添加成员创建一个单独的页面,还是最好接受过时的条目,并在我获取所有成员时添加一些检查以确保我没有显示过时的条目?

我目前添加成员的数据库功能:

public static function addMember()
{
    $q = 'INSERT INTO ' . MemberTable::TABLE_NAME
            . ' (' . MemberTable::ID
            . ') VALUES (null)';
    try
    {
        $db = new DBConnection();
        $toRet = $db->execute($q);
    }
    catch(Exception $e)
    {
        error_log($e->getMessage());
        $toRet = -1;
    }
    if($toRet > 0)
    {
        DBSystemEvent::logMessage("Added new member with ID $toRet");
    }
    unset($db);
    return $toRet;
}

编辑1:重读问题后,我需要澄清第一段中提到的成员和用户是不同的。用户是指登录到应用程序的人。会员无法登录应用程序。这类似于医院应用程序(患者不能登录或编辑自己的信息;只有护士或医生等应用程序用户才能登录和编辑信息)。

编辑 2: 虽然没有一个给出的答案完全适合我的问题(因为我可能不得不在不知道 ID 的情况下插入数据库),但我决定根据我的问题接受一个答案措辞(因为使它更具体可能会进入过于本地化的领域)。

【问题讨论】:

  • 为什么不直接将编辑页面用作添加/编辑页面?如果填写时未设置 ID,则添加;如果填写时未设置 ID,则进行编辑?
  • @MichaelRushton - 我在这个应用程序的早期迭代中已经这样做了。但是,如果设置了 ID 但没有具有该 ID 的成员,则无法进行编辑(因为 UPDATE 会影响 0 行)。话虽如此,我已经在顶部获取成员,如果找不到成员,我基本上可以取消设置 ID...
  • 为什么不办理全流程?如果他们未能完成就中止。
  • 如果没有具有该 ID 的成员,则无需设置该 ID。您将拥有edit.php?id=0 而不是edit.php?id=1(并且在提交表单时,如果id == 0 那么您INSERT 而不是UPDATE)。
  • 如果他使用用户 ID 将购买保存到数据库中,那么 ID=0 可以在 2 个同时的新用户之间混合数据。

标签: php mysql web-applications


【解决方案1】:

这是一个常见问题 - 您需要在 INSERT 之前知道 ID,但只有在之后才知道。所以只有一个合适的解决方案:使用 GUID (http://en.wikipedia.org/wiki/Globally_unique_identifier) 而不是自动增量 ID。从 PHP 代码生成 guid,例如 com_generate_guid(),并且根本不要 preINSERT 空行。并在具有 GUID 字段的表之间建立关系。

【讨论】:

  • 我会说这个答案是最好的,因为我认为你永远不应该将你可能永远不会使用的东西插入数据库。当 db 结构(具有空字段的列)依赖于代码中的功能时,它就不可能是正确的。但请注意答案:它是 PHP 的 com_create_guid()。 php.net/manual/en/function.com-create-guid.php.
【解决方案2】:

我有点不清楚您网站的工作流程到底是什么。 如果用户来到你的页面,那么我假设他必须从你获得他的 ID 的地方登录。如果他是新用户,那么他将被重定向到 userdata.php?id=0,他在其中输入他的数据。提交后,您应该检查 $id=0 以及具有相同用户名/id/.. 的用户是否存在(SELECT... WHERE ID=xxx)并警告用户更改他的用户名。如果未找到匹配项,则可以执行 INSERT 并获取新 ID。

如果将来用户想要更改他的数据,那么在登录后您可以将他引导到 userdata.php?id=123(其中 123 是他的 ID)。然后你可以检查 $id>0 并执行更新。

【讨论】:

  • 我编辑了我的问题以更好地阐明用户和成员之间的区别。
  • 这使它更清晰,但相同的逻辑仍然存在 - 具有相同的更新/插入形式并将 ID 作为参数发送给它。就像迈克尔建议的那样。您担心 ID 不存在是没有根据的,因为 ID 要么是从成员选择中获得的,要么是在 INSERT 期间通过自动增量创建的。
  • 好吧,我仍然担心这会使管理会员付款/购买的逻辑更加复杂。正如我所看到的,我会为每次付款/购买使用一个临时 ID,以便我可以使用 JavaScript 并使用隐藏的输入字段在页面上添加/删除付款和购买,以便我可以知道哪些临时 ID 可以获取PHP端。这是正确的吗?
  • 为什么要使用临时ID(我假设您说的是会员ID)- 使用真实ID。如果您正在谈论购买 ID,那么这些是完全不相关的,您可以从购买表的自动增量字段中获取它们。如果用户进行购买,那么您可以将这些记录标记为最终记录。否则,您可以定期检查表并删除早于例如 24 小时的非最终记录。
【解决方案3】:

如果可以,请切换到 postgresql。这将允许您使用序列为您提供唯一 ID,而无需在数据库中输入空实体。 有趣的是,我的一个客户正在使用您选择的相同方法,到目前为止,这会导致大量维护和工作负载开销来清除数据库中的空条目。

如果您无法使用提供序列的数据库,请考虑使用其他空表,该表仅以原子方式为您提供唯一 ID。这样你就可以开始使用 id 在客户端准备关系,然后在最终创建成员时将它们批量输入到数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2016-11-15
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多