我正在开发一个PHP / MySQL应用程序,允许组织成员在数据库中维护。目前,在单击“添加成员”范围时,我将空白条目插入数据库并将创建的ID返回给PHP。收到有效ID后,应用程序用户将通过jQuery重定向到引用新创建成员的编辑页面。
据我所知,这有以下优点/缺点:
优点
缺点
我是否考虑过所有情景/优点/缺点?我应该为添加成员创建一个单独的页面,还是更好地接受过时的条目,并且在我获取所有成员时可能会添加一些检查以确保我没有显示过时的条目?
我目前添加成员的数据库功能:
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的情况下插入数据库),我决定根据我的问题接受答案措辞(因为任何更具体的可能会进入过于局部化的领域)。
答案 0 :(得分:2)
这是一个常见问题 - 您需要在INSERT之前知道ID,但只有在知道之后才知道。因此,只有一个适当的解决方案:使用GUID(http://en.wikipedia.org/wiki/Globally_unique_identifier)而不是自动增量ID。从PHP代码生成guid,例如com_generate_guid()
,并且根本不预先插入空行。并使用GUID字段在表之间建立关系。
答案 1 :(得分:1)
我有点不清楚您网站的工作流程究竟是什么。 如果用户来到您的页面,那么我认为他必须从您获取其ID的位置登录。如果他是新用户,那么他被重定向到userdata.php?id = 0,在那里他输入他的数据。提交后,您应该检查$ id = 0以及是否存在具有相同用户名/ id / ..的用户(SELECT ... WHERE ID = xxx)并警告用户更改其用户名。如果未找到匹配项,则可以执行INSERT并获取新ID。
如果以后用户想要更改他的数据,那么在登录后你可以将他指向userdata.php?id = 123(其中123是他的ID)。然后你可以检查$ id是否> 0并做UPDATE。
答案 2 :(得分:0)
如果可以,请切换到postgresql。这将允许您使用序列为您提供唯一ID,而无需在数据库中输入空实体。 有趣的是,我的一个客户正在使用您选择的相同方法,到目前为止,这会导致大量维护和工作负担开销,以清除数据库中的空条目。
如果您不能使用提供序列的数据库,请考虑使用另外一个空表,该表仅以原子方式为您提供唯一ID。这样你就可以开始使用id在客户端准备关系,然后在最终创建成员时将它们批量输入到db中。