2016-04-13 22 views
0

PHP/MySQLで私より賢明な人のインスピレーションを探しています。アレイアップデートの操作方法

データベースアプリケーションがあり、この例では2つのプライマリテーブルと1つの子テーブルがあります。

プライマリ表1 - 文書は プライマリ表2 - JobDesriptions 子表 - LnkDocuments_JobDescriptions、タイトルが示すように文書およびジョブ説明表の間、多くのリレーショナルテーブルへの1つです。私のドキュメントテーブルでは、私はJobDescriptionsのルックアップで、チェックボックスとしてオプションを提示するフィールドを持っています。このフィールドはアプリケーションが動作する方法のために 'AppliesTo'と呼ばれ、フィールドは結果を文字列、 2,3,4,5)explode関数を使ってこれを配列に変換し、各レコードを子テーブルに挿入しました。私は1-2の関係を好むので、これは私のコードです。 。作品

$jdarray = explode(',',$values['AppliesTo']); 

foreach($jdarray as $item) 
{ 
$sql2 = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) 
values ('".$keys["DocumentPk"]."', '$item')"; CustomQuery($sql2); 
} 

私は今、そのテーブルが更新された場合、私はまた、子テーブルを更新する必要があるということです持っている問題を、私はこのコードを試してみました(が、すぐにそれが間違っていることに気づい):

$jdarray = explode(',',$values['AppliesTo']); 

foreach($jdarray as $item) 
{ 
    $sql = "SELECT * FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk='$item'"; ; 
    $num_rows = mysql_num_rows(CustomQuery($sql)); 

    if ($num_rows > 0) //Delete Record 
     { 
      $sql2 = "DELETE FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk='$item'"; CustomQuery($sql2); 
      echo "JD FK : ".$item." deleted"; 
     } 
    else //Insert Record 
     { 
      $sql3 = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) 
      values ('".$keys["DocumentPk"]."', '$item')"; CustomQuery($sql3); 
      echo "JD FK : ".$item." added"; 
     } 

} 

配列の相違点を比較する必要があることが私には分かりましたが、これを行う方法を手がかりにしていませんでしたが、これが私の必要とするものです:

$ oldarrayと$ new配列を比較すると、例

値が1,2,3,4あって$ newarrayに値1,2,3,5があった場合は、コードがループして変更があるかどうかを確認したい、例えば古い配列と新しい配列に値が存在する場合は何もしません。古い配列に値が存在し、新しい配列ではなく新しい配列に値が存在する場合は削除します。

関連するすべてのレコードを削除してもう一度追加することも考えましたが、これは悪い習慣であり、高いプライマリキーになります。私の例ではわずか5つのオプションしかありません。テストのためだけに、実際には数十もあるかもしれません。事前

+0

私はすべてのコードを徹底的に見ていませんでしたが、うまくいくはずです。何が問題なのですか? – Technoh

+0

私が使用したコードの問題は、違いを比較しないで新しいレコードを挿入することですが、新しい配列で削除されたかどうかを考慮せず、既存のレコードがすべて削除されます。 – user5641678

+0

私はあなたが達成しようとしていることを、ありがとう。 – Technoh

答えて

0

おかげで、あなたは物事を最適化しようとしている場合は、私が不足しているレコードを挿入することである一方で、テーブルに既に存在する値を読み取ると、その後のみを削除すると、新しいバージョンではないことをわかりません行く最善の方法。私の意見では、1つのクエリですべてを削除してから、すべてのレコードを1つのクエリに挿入する方がはるかに高速です。

$item_list = implode(',' , $jdarray); 
$delete_query = "DELETE FROM LnkDocuments_JobDescriptions WHERE DocumentFk='".$keys["DocumentPk"]."' AND JobDescriptionFk IN ($item_list)"; 
CustomQuery($delete_query); 

$document_key = "'" . $keys["DocumentPk"] . "'"; 
$item_list_to_insert = "($document_key, " . implode("), ($document_key, ", $jdarray) . ")"; 

$insert_query = "INSERT INTO LnkDocuments_JobDescriptions (DocumentFk, JobDescriptionFk) VALUES " . $item_list_to_insert; 
CustomQuery($insert_query); 

:このような何かを試してみて、私はこれをテストしていない、いくつかのデバッグが必要な場合があります。

+0

私はそのレコードにリンクされていた子テーブルのすべてを削除し、新しい値に基づいて再度追加することについて考えましたが、悪い習慣ではありませんか? – user5641678

+0

実際、ほとんどのデータベース設定では、結果のクエリを高速に実行できるのは実際は標準的な方法です。通常、クエリの実行時間はクエリ実行時間よりも重要です。したがって、実行するクエリの数を最小限に抑える必要があります。それはループの処理時間を含んでいません。 – Technoh

+0

okコードを入れてもうまくいきますが、このようにしたい理由の1つは、後で、購読したユーザーに変更を電子メールで送信するコードを拡張したいのです。 – user5641678

関連する問題