2016-04-29 8 views
0

私はこれを試して説明するために最善を尽くすつもりです。私はいくつかのロールタイプを含むアプリケーションを持っています。この場合重要なのは「マネージャー」と「代理人」だけです。代理人が作成されると、その会社の1人または複数のマネージャーに割り当てられます(会社はマネージャー作成時に割り当てられます)。すべてのユーザーがUsersという同じテーブルに格納されることに注意してください。配列の比較に基づくSQLの削除、更新または挿入

代表者とマネージャ関係の関係が作成されると、代表者のプライマリキーと私の場合は代表者のプライマリキー(私の場合、ユーザテーブルの「userId」列)がManagerRepRelationshipというテーブルにプッシュされます。私は、次のユーザーテーブルを持っているのであれば、たとえば(この場合のみでかまいcolsので仕事に行く):そのテーブルは、上記のことになりますので、もし唯一の自分のアカウント内で管理者に割り当てることができ

userId | username |  role  | accountId | 
______ ________ ______________ _________ 
    1  jsmith  manager   14 
    2  mfoster  manager   14 
    3  lcarter  manager   18 
    4  jdoe  representative 14 
    5  tlarson  representative 18 
    6  rhoward  representative 18 

代表

道、ManagerRepRelationshipは次のようになります。

repId | managerId 
_____ _________ 
    4  1 
    5  3 
    6  3 

私はに実行していますトラブルを、それはこれらの関係を編集するために来るときです。現在、私は非常に制限されたページになるので、これらの関係の変更を処理するために、別のフォームとページを持っています。この場合、代理人jdoeを編集し、別のマネージャーを割り当てようとしています。現在彼はjsmithに割り当てられていますが、彼に2人のマネージャーを与えたいので、彼にmfosterも割り当てます。この場合、ページのURLのようなものになります。ページの上部に

http:localhost:8888/mod-super-admin/edit-relatoinship.php?repId=4&accountId=14

を、私はそのアカウント(以下、クエリ内のアドレステーブルをノートのすべてのマネージャーをつかむだけの場所ですI私はこのページのアドレステーブルのために何も更新していません。私<select>オプションについては、経営者の姓)

// Get the url variables 
$rep_id = $_GET["repId"]; 
$account_id = $_GET["accountId"]; 

// grab all managers tied to the account (not the rep) 
$manager_sql = "SELECT Users.userId, Address.firstName, Address.lastName FROM Users JOIN Address ON Users.addressId=Address.addressId WHERE Users.role='manager' AND Users.accountId=" . $account_id; 
$account_managers = mysqli_query($connection,$manager_sql); 

// grab all managers assigned to the rep 
$relationship_sql = "SELECT managerId FROM ManagerRepRelationship WHERE repId=" . $rep_id; 
$rep_rels = mysqli_query($connection, $relationship_sql); 

// create and array that houses current assigned managers 
$current_managers = array(); 
while($row = mysqli_fetch_array($rep_rels)){ 
    array_push($current_managers, $row["managerId"]); 
} 

次のようにフォームがあります。すでに割り当てられている場合、マネージャーが強調表示されます。我々の場合

<form method="POST" action="./mod-super-admin/edit-relationship.php?repId=<?php echo $rep_id; ?>&accountId=<?php echo $account_id; ?>"> 
      <div class="col-sm-12"> 
       <div class="form-group"> 
       <div class="form-group mbs"> 
        <label for="manager" class="label-medium">Assigned Managers</label><br> 
        <small>To Select Multiple Managers Hold Down CTRL (CMD for Mac) and click</small> 
        <select name="manager[]" class="form-control input-medium" multiple="multiple"> 
        <?php 
         $output; 
         while($manager = mysqli_fetch_assoc($account_managers)) : 
         $output .= '<option value="' . $manager["userId"] . '"'; 
         foreach($current_managers as $key=>$value) : 
          if($value === $manager["userId"]){ 
          $output .= ' selected'; 
          } 
         endforeach; 
         $output .= '>' . $manager["lastName"] . ', ' . $manager["firstName"] . '</option>'; 
         endwhile; 
         echo $output; 
        ?> 
        </select> 
       </div> 

       <input type="submit" name="editRelationshipSubmit" class="btn btn-large btn-green mtm" value="Update Relationship"> 
       </div> 
      </div> 

      </form> 

、PHP、上記が出力マネージャの名前を持つと管理者が担当者に割り当てられている場合、それは既に強調表示されますmutliselect。ここで私は問題を抱えています。これらのrealtionshipsを編集することになります。たとえば、をマネージャーとして追加する場合は、jdoeと実行するだけで、をManagerRepRelationshipに追加するか、jsmithをマネージャーとして削除する場合は、DELETE FROM ManagerRepRelationship WHERE repId=4 AND managerId=1を実行します。

どのようにして何が起こるのかを補うにはどうすればよいですか?私は、これらの変更を行っている現在のユーザーがマネージャー関係を追加したり、マネージャー関係を削除したり、両方の作業を少しやっているかどうかは分かりません。

私はその$current_managers配列を作ったので、フォームが提出されたときに配列$_POST["manager"];と照合することができました。配列が格納する唯一のデータはuserIdです。私はそれらの配列の比較に基づいて自分のデータベースを更新するために、別のSQLコマンドを実行しているだけです。

+0

あまりにも長い質問:o –

+0

@HamzaZafeerもし私が詳細を提供しなかったならば、私は "十分ではない情報"と言われていただろう –

答えて

2

これはかなり一般的な問題だと思います。私がこの種のことをいつも解決してきた方法は、おそらく少しシンプルですが、うまくいくし、実装も簡単です。変更されたものを修正しようとするのではなく(例えば、2つのマネージャーを削除し、1を追加して1を保持するなど)、正しい行を挿入/削除するだけで、既存の行をすべて削除してから、ユーザーが入力したデータに関連する新しいものの

したがって、ユーザーが担当者4を選択し、マネージャ3,7、および8を選択するように、選択したマネージャを編集するとしましょう。(N.B.以前に選択したものは無関係です)。だから、あなたは、データベースに対して次のコマンドを実行したい:

delete from ManagerRepRelationship where repId = 4; 
insert into ManagerRepRelationship (repId, managerId) values (4, 3); 
insert into ManagerRepRelationship (repId, managerId) values (4, 7); 
insert into ManagerRepRelationship (repId, managerId) values (4, 8); 

もちろん、あなたのGUIで選択した値に基づいてINSERT文を生成するためにループを使用したいと思います。

このようにして、以前のものと現在のものとを比較することを心配する必要はありません。

P.S.処理中にエラーが発生した場合に間違った情報が残らないように、すべてのSQL操作の回りにトランザクションを使用するようにしてください。

+0

うわー、私はオプションとしてこれも考えなかった!それはとても巧みで、多くのコード/作業を削減します。アイデアをありがとう、私はここからどこに行くのか正確に知っています。あなたのために質問が答えられUpVoteは私の友人です。 –

+0

お寄せいただきありがとうございます。がんばろう! – ADyson

関連する問題