2012-01-03 19 views
0

私はさまざまな分野のデータベースをセットアップし、必要な登録やログインなどをすべて実行することができます。次のように私が今行う必要がある何PHPのメンバーシップMySQLデータベースを自動的に更新

は次のとおりです。

新しいメンバーが彼/彼女が(それがあったように、スポンサーのような)既存のメンバーのメールアドレスを提供しなければならない登録しようとするとき。スポンサーの電子メールが偽物であるか、またはデータベースに存在しない場合、参加するアプリケーションは拒否されます。

本物の場合、スポンサーのレコードを自動的に取得し、新しいメンバーを2つの可能なフィールドのいずれかに入れて、そのレコードを更新する必要があります。各メンバーは、2人、2人だけの新しいメンバーをスポンサーすることができます。スポンサーに新しいメンバーがいない場合、フィールドAとフィールドBは空になるので、新しいメンバーのEメールはフィールドAに割り当てられます。一方、フィールドAに既にエントリがある場合、新しいメンバー電子メールはフィールドBに格納されます。両者がすでに満たされている場合、警告が表示され、スポンサーは「第3の」新メンバーの紹介を拒否されます。

私は一週間の最高の部分を成功せずに費やして、これを助けてくれたことを最も感謝しています。私は、この素晴らしいサイトの専門家からかなり簡単な答えがあると確信しています。

答えて

3

Fang Man

私はこれに2列を使用しません。

たとえば、新しいテーブルmember_sponsorsを作成します。

それはで構成されます:

ID - 後援された日付のメンバー - スポンサー memeber_idのID - - 新しいmemeber sponsor_dateのID自動プライマリインデックス sponser_idをインクリメント?

この方法で、このテーブルをクエリし、2よりも少ないかどうかを確認できます(または、この値を増やしたい場合は、これを簡単に行うことができます)。

次に、このテーブルに情報を追加します。

このコンセプトが理にかなっていて、あなたに役立つことを願っています。

既存のメンバーと自分のテーブルは以下の構造を持つ「メンバー」と呼ばれていると仮定すると、ティム

+0

ありがとうTim - 別のテーブルを持つことをお勧めします - 私はそれを行っています! – fangman

2

:登録要求が送信されると

Field name   Type 
------------------------------------------ 
id     int (primary, auto) 
name     varchar 
email     varchar 
submember1   int 
submember2   int 

、私は "のようなあなたは価値があるでしょうと仮定sponsor_email "をチェックしてください。この値を消毒し、それが電子メールアドレスであることを確認した後

SELECT 
    id, 
    name, 
    submember1, 
    submember2 
FROM 
    members 
WHERE 
    email = "'.$sponsor_email.'" 

を...とサインアップするユーザーは有効なメンバーのメールアドレスを持っていることを確認してください:(ヒント:使用正規表現)は、あなたのメンバーに関する情報をつかみます。 、$member['submember1']がある場合はゼロよりも大きいが(すでにいっぱい) - あなたはこの新しいサインアップを置くためにどのスロットを把握する必要があります、今

if ($member['submember1'] > 0 && $member['submember2'] > 0) { 
    // add warning to sponsor, reject the signup 
} 

:もしそうなら、そのメンバーは、オープンスロットを持っているかどうかを確認しますサインアップはスロット2に、スロット1にはサインインします。

さらに柔軟な方法は、メンバテーブルとスポンサーをリンクする連想テーブルを追加することです。の代わりにを使用して、これをメンバテーブルで追跡するフィールドを追加します。このアプローチにはいくつかの利点があります。最も重要なことは、データベース構造に触れることなく、コード内の小さなスポットを簡単に変更することができます。 「あなたの方法」を完了したら、データベースとコードを変更する必要があります。

if ($member['submember1'] > 0 && $member['submember2'] > 0 && $member['submember3'] > 0 && $member['submember4'] > 0 && $member['submember5'] >0) { 
    // add warning to sponsor, reject the signup 
} 

... yuck!さらに、これは、新しいサインアップを挿入するスロットを髪型にすることになります。連想表にはこの問題はありません。

Field name   Type 
------------------------------------------ 
id     int (primary, auto) 
name     varchar 
email     varchar 

...そして、あなたはmember_sponsorsテーブルを持っている:連想テーブルのルートを使用して、あなたはまだメンバー表を持って

Field name   Type 
------------------------------------------ 
id     int (primary, auto) 
sponsor_id   int 
member_id    int 

MEMBER_IDフィールドには、「スポンサー」メンバーのIDを持ちますsponsor_idフィールドは、「スポンサード」メンバーのIDを保持します。サインアッププロセスでこれらのテーブルを使用して

限り、電子メールの一致として、あなたが行を持つことになり、もう一度、あなたのメンバーを取得するだけでなく、参加しないと今、彼らの現在のスポンサー

SELECT 
    members.id, 
    members.name, 
    COUNT(member_sponsors.id) AS sponsored_count 
FROM 
    members 
LEFT JOIN 
    member_sponsors ON 
     member_sponsors.member_id = members.id 
WHERE 
    email = "'.$sponsor_email.'" 
GROUP BY 
    members.id 

のカウント指定されたユーザーが持っているスポンサーメンバーのID、名前、および現在の数を表示します。あなたのPHPは現在、次のようになります。

$limit_on_sponsorships = 2; 
if ($member['sponsored_count'] >= $limit_on_sponsorships) { 
    // add warning to sponsor, reject the signup 
} 

$limit_on_sponsorships ...など、あなたは数に変更を加えるために今しなければならないすべてを、どこから来て、それに一定にし、それデータベース設定することができます許可されたスポンサーはその1つの値を変更します。この方法を使用すると、コードをより柔軟に変更できるようになります。

+0

Chrisにありがとうございます - これを試していますが、おそらくもっと助けが必要です。あなたは迅速な返信を感謝します。 – fangman

+0

よく聞いてください - 連想表の概念は重要です。もしあなたがまだこの仕組みを使っていなければ、それを学ぶことはあなたの理解に非常に強力な概念を加えるでしょう。データベース駆動型のシステムでは、この概念を利用しているため、大規模システムと小規模システムで何度も繰り返されることがあります。まずデータベースとSQLを使い、それがどのように機能するのか(テーブルが正しく設定されているか)を理解してください。 –

関連する問題