2017-02-14 58 views
0

我在$ _ POST變量看起來像這樣利用結表:與SQL查詢引起PHP foreach循環內confusiont重複的ID

[genre_id] => Array 
    (
     [0] => 1 
     [1] => 3 
    ) 

我的PHP代碼像這樣的塊:

foreach ($_POST["genre_id"] as $key => $value) { 
    $genre_query = "UPDATE books_genres SET genre_id = $value WHERE book_id = $book_id"; 
    $genre_result = mysqli_query($connection, $genre_query); 
    if ($genre_result && mysqli_affected_rows($connection) >= 0) { 
    echo("Genre Update: Sucess<br>"); 
    } else { 
    echo("Genre Update: Fail<br>"); 
    } 
} 

由於多對多關係,名爲books_genres的表是一個聯結表。這意味着一些$book_id將被複制。顯而易見的情況是每次更新指定的book_id的每一行。
我應該在我的books_genres表中添加另一列嗎?即使如此,我不知道我將如何引用該索引?或者我應該以某種方式編寫查詢?

+0

通常,您不會更新聯結表。您將刪除舊值並插入新值。如果你想做這種類型的更新,你需要在你的where子句中包含「old」genre_id作爲附加謂詞,這樣它就知道你想更新哪個genre_id。 –

+0

@sean_lange所以我會更新書籍和流派表格,然後分別更新books_genres表格的代碼?我是否理解你所說的更標準? –

+0

不可以。結點表的一點是你不需要更新任何東西。它有兩個表的關鍵權利?關鍵是你的表沒有改變嗎?除非你已經非結構化你的結構,否則除非在非常罕見的場景中,否則不需要更新結合表。如果某本書被歸類爲「古典」,然後被重新歸類爲「恐怖」,那麼您將刪除古典詞條並插入恐怖詞條。也許發佈ddl和一些示例數據將有助於解釋這一點。 –

回答

0

聯結表的一點是你不需要更新任何東西。它有兩個表的關鍵權利?關鍵是你的表沒有改變嗎?除非你已經非結構化你的結構,否則除非在非常罕見的場景中,否則不需要更新結合表。如果某本書被歸類爲「古典」,然後被重新歸類爲「恐怖」,那麼您將刪除古典詞條並插入恐怖詞條。也許發佈ddl和一些示例數據將有助於解釋這一點。

0

明顯發生的情況是,每次都會更新指定的 book_id的每一行。

但這正是您要求MySQL引擎執行的操作!

請記住,SQL是聲明性語言,不是必要的。 因此,而不是顯示代碼,聲明你的意圖!

告訴你自己和我們你打算更新什麼。

換句話說,定義「更新」應該命中的記錄集。 有了這些,你可以很容易地獲得縮小操作所需的「where」子句。