无法更新PHP

时间:2019-09-25 15:01:57

标签: 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>

1 个答案:

答案 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。

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