1

我正在开发一个允许在数据库中维护组织成员的 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 的情况下插入数据库),但我决定根据我的问题的措辞接受一个答案(因为让它更具体可能进入过于本地化的领域)。

4

3 回答 3

2

It's a common problem - you need to know the ID before INSERT, but it's known only after. So there is only one adequate solution: use GUID (http://en.wikipedia.org/wiki/Globally_unique_identifier) instead of autoincrement ID. Generate guid from PHP code, for example com_generate_guid(), and do not preINSERT empty rows at all. And make relations between tables with GUID fields.

于 2013-03-30T00:11:57.383 回答
1

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

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

于 2013-03-29T20:44:36.300 回答
0

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

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

于 2013-03-29T22:41:24.327 回答