我正在尝试更新我拥有的多对多数据透视表。我不确定该怎么做。我已尝试进行研究,但未提出任何建议。
那么,当用户想要编辑横幅并单击要与横幅一起移动的框架时,将会发生更新,将更新数据透视表以具有框架ID。
我的桌子看起来像这样
横幅表
id | title
1 | Banner 1
2 | Banner 2
3 | Banner 3
4 | Banner 4
框架表
id | title
1 | Frame 1
2 | Frame 2
3 | Frame 3
4 | Frame 4
5 | Frame 5
我的banner_frame(我的数据透视表)
id | banner_id | frame_id
1 | 1 | 1
2 | 2 | 2
3 | 2 | 3
4 | 3 | 3
5 | 3 | 4
6 | 4 | 1
7 | 4 | 4
所以我想要的是,如果我在横幅1的编辑页面上,并且我决定不再希望框架1成为该横幅的一部分 相反,我想要第2帧,第4帧和第5帧。然后,我想更新banner_frame表。所以banner_frame表最终看起来像这样
id | banner_id | frame_id
1 | 1 | 2
2 | 2 | 2
3 | 2 | 3
4 | 3 | 3
5 | 3 | 4
6 | 4 | 1
7 | 4 | 4
8 | 1 | 4
9 | 1 | 5
目前唯一要更新的是横幅标题,banner_frame表中没有任何变化
这是我的代码
<?php
//GETS THE BANNER FROM THE b_id FROM THE URL
if(isset($_GET['b_id']))
{
$banner_id = $_GET['b_id'];
}
$query = "SELECT * FROM banners WHERE id = $banner_id";
$select_banner_by_id = mysqli_query($conn, $query);
confirmQuery($select_banner_by_id);
while($row = mysqli_fetch_assoc($select_banner_by_id))
{
$banner_id = $row['id'];
$banner_title = $row['title'];
}
//THIS UPDATES THE BANNER
if(isset($_POST['edit_banner']))
{
$banner_title = $_POST['banner_title'];
$query = "UPDATE banners SET ";
$query .= "title = '{$banner_title}' ";
$query .= "WHERE id = $banner_id ";
$update_banner = mysqli_query($conn, $query);
confirmQuery($update_banner);
$frames = $_POST['frames'];
if(!empty($_POST['frames']))
{
foreach($_POST['frames'] as $selected_frame)
{
// TO UPDATE THE BANNER_FRAME PIVOT TABLE
$query = "UPDATE banner_frame SET ";
$query .= "frame_id = $selected_frame, ";
$query .= "WHERE banner_id = $banner_id, ";
$create_banner_frame_query = mysqli_query($conn, $query);
confirmQuery($create_banner_frame_query);
}
}
//THIS REDIRECTS THE PAGE AFTER SAVING
header("Location: banners.php");
}
?>
<form action="" method="POST">
<div class="form-group">
<label for="banner_title">Title</label>
<input type="text" class="form-control" name="banner_title" value="<?php echo $banner_title ?>">
</div>
<!-- BEGIN FRAMES MODAL -->
<button type="button" class="btn btn-primary mb-20" data-toggle="modal" data-target="#frameModal">
Frames
</button>
<!-- MODAL -->
<div class="modal fade" id="frameModal" tabindex="-1" role="dialog" aria-labelledby="frameModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="frameModalLabel">Frames</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<?php
$query = "SELECT DISTINCT f.id as frameId, f.title as frameTitle, bf.banner_id ";
$query .= "FROM frames f ";
$query .= "LEFT JOIN banner_frame bf ON bf.frame_id = f.id AND bf.banner_id = $banner_id ";
$query .= "ORDER BY f.id ";
$banner_frame = mysqli_query($conn, $query);
confirmQuery($banner_frame);
while($row = mysqli_fetch_array($banner_frame))
{
$frame_id = $row['frameId'];
$frame_title = $row['frameTitle'];
$checked = '';
if ($row['banner_id'] == $banner_id) {
$checked = 'checked';
}
echo "<div class='form-check'>";
echo "<input type='checkbox' name='frames[]' id='frame_checkbox' value='$frame_id' $checked> ";
echo "<label for='frame_checkbox'>";
echo $frame_title;
echo "</label>";
echo "</div>";
}
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
<!-- END FRAMES MODAL -->
<div class="form-group">
<button type="submit" class="btn btn-dark btn-lg btn-block" name="edit_banner">Save</button>
</div>
</form>
答案 0 :(得分:0)
您没有清楚说明代码当前产生的结果,也没有给出架构的任何适当细节,但是,做出(我希望是)一些合理的假设,我想问题可能是UPDATE foreach循环中的语句每次都一次更新该横幅的所有帧记录。如果选择的帧数与先前选择的数不同,也会出错。
我实际上需要做的是删除该横幅的所有现有框架记录,然后根据提交的表单数据将所需的新框架/横幅关联插入表中。
所以你先做
DELETE FROM banner_frame WHERE banner_id ?
({?
在这里代表横幅ID,就像在正确参数化的查询中应该显示的一样)。
然后在
foreach($_POST['frames'] as $selected_frame)
{
循环,您需要生成类似
的查询INSERT INTO banner_frame (frame_id, banner_id) VALUES (?, ?)
其中第一个?
是当前$selected_frame
,第二个?
是横幅ID。
理想情况下,以上所有内容都应包装在事务中,以确保在发生意外错误时确保数据完整性。