2017-02-14 101 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”子句。