1

私は、組織のメンバーをデータベース内で維持できるようにする PHP/MySQL アプリケーションに取り組んでいます。現在、「メンバーの追加」スパンをクリックすると、空白のエントリがデータベースに挿入され、作成された ID が PHP に返されます。有効な ID を受け取ると、アプリケーション ユーザーは jQuery を介して、新しく作成されたメンバーを参照する編集ページにリダイレクトされます。

私が知る限り、これには次の利点/欠点があります。

利点

  • メンバーの ID を既に持っているため、jQueryUI ダイアログを送信するとすぐに購入/支払いをメンバーに関連付けることができます。
  • 別々の追加/編集画面だったものを統合するので、私の側では保守が容易になります。

短所

  • 古いエントリになる可能性が高いです。つまり、誰かが [メンバーの追加] を複数回クリックして新しいページを保存せず、エントリが空白のままになる可能性があります。
  • すべての列に 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

これはよくある問題です。INSERT の前に ID を知る必要がありますが、それは INSERT の後になって初めてわかります。したがって、適切な解決策は 1 つだけです。自動インクリメント ID の代わりにGUID ( http://en.wikipedia.org/wiki/Globally_unique_identifier ) を使用します。たとえばcom_generate_guid()、PHP コードから GUID を生成し、空の行を preINSERT しません。GUID フィールドを持つテーブル間の関係を作成します。

于 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 かどうかを確認して UPDATE を実行できます。

于 2013-03-29T20:44:36.300 に答える
0

可能であれば、postgresql に切り替えます。これにより、空のエンティティをデータベースに入力することなく、シーケンスを使用して一意の ID を提供できます。おもしろいことに、私のクライアントの 1 人が、あなたが選択したのと同じアプローチを使用しています。これまでのところ、データベースから空のエントリを取り除くために、多くのメンテナンスと作業負荷のオーバーヘッドが発生しています。

シーケンスを提供するデータベースを使用できない場合は、アトミックに一意の ID のみを提供する空のテーブルの使用を検討してください。そうすれば、ID を使用してクライアント側でリレーションを準備し、メンバーが最終的に作成されたときにそれらを一括してデータベースに入力することができます。

于 2013-03-29T22:41:24.327 に答える