php - 无法在 PHP 中更新数据透视表

标签 php mysql

我正在尝试更新我拥有的多对多数据透视表。我不知道该怎么做。我尝试过研究它,但没有任何结果。

因此,当用户想要编辑横幅并单击他们想要与横幅一起使用的框架时,系统会更新数据透视表以获取框架 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">&times;</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>

最佳答案

您没有清楚地解释您的代码当前产生的结果,或者给出您的架构等的任何正确详细信息,但是,做出(我希望的)一些合理的假设,我猜问题是更新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。

理想情况下,上述所有内容都应包含在事务中,以确保发生意外错误时数据的完整性。

关于php - 无法在 PHP 中更新数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101409/

相关文章:

javascript - 将文本添加到随机字符串

php - 状态位标志。查找一个标志 = 0 的状态

php - 在 PHP 和 MySql 编程中如何在单个语句中执行超过 3 个查询?

mysql - "Artful"newLisp的Mysql模块没有连接到MySQL

php - Mysql 查询显示项目两次

PHP。如何获取访问 token 。使用 Google API 的 OAuth 2.0 进行身份验证

php - 在 MYSQL、PHP 或 R 中从 mysql 数据库制作共现矩阵

php - Laravel - 将值从路由器传递到 Controller

mysql - 有理由使用两个数据库吗?

java - JPA连接表查询