如何使用php和ajax删除/编辑sql条目?

zzzyeukh  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(354)

我在学习php和sql,作为练习,我在一个页面上工作,这个页面实际上类似于一个列出电影的网站的管理面板。我使用lampp和phpmyadmin创建了一个简单的数据库,其中包含两个表,movie list和users list。
因为我是初学者,而且我的代码可能很混乱,所以我在描述我试图实现的目标。在login.php页面中,唯一的功能是输入用户名和密码。如果信息和sql表中的信息匹配,则用户继续访问adminpanel.php。
这个页面应该加载一个电影列表,并用这些数据创建一个表。在每一行的末尾我需要两个按钮,编辑和删除。我试图实现的是删除当前行中的删除按钮被点击,为删除按钮。“编辑”按钮应仅为单击按钮的行显示隐藏窗体。此表单将包含一个按钮,在填充表单并单击该按钮后,该按钮将实际更新sql表中的数据(我还没有添加显示表单的功能,我更关心的是在文件末尾添加电影的按钮表单。
这里是adminpanel.php

<html>
    <head>
        <script src="https://code.jquery.com/jquery-3.3.1.js" 
                integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
                crossorigin="anonymous">
        </script>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/core.js"></script>
        <script type="text/javascript" src="changes.js"></script>
        <script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"></script>

        <style type="text/css">

            *{text-align: center;}

            .skriveni_input{
                display: none;
            };

        </style>
    </head>

<?php 
    require_once('connection.php');

    if(!isset($_POST['btnlogin'])){
            exit;
        } 

        $username = $_POST['username'];
        $password = $_POST['password'];
        $query = "SELECT usrname,password FROM usrs WHERE usrname='$username' AND password='$password' ";

        $res = mysqli_query($conn,$query);
        $rows = mysqli_num_rows($res);

        if($rows == 1){
            echo "Welcome ".$_POST['username']."<br><br>";
        } else {
            echo "<script>
                alert('Wrong login info');
                window.location.href='login.php';
                </script>";
            exit;
        }

        $query = "SELECT * FROM movies";
        $result = $conn->query($query);

        echo "<table align = center cellspacing = 0 border = 0;><thead><tr><th>Name</th><th>Year</th><th>Genre</th></tr></thead><tbody>";
        while ($row = mysqli_fetch_array($result)) {
            echo "<tr>";
            echo '<td id="row_id" style="display:none;" value="'.$row["movie_id"].'">'.$row["movie_id"].'</td>';
            echo '<td>'.$row["name"].'</td>';
            echo '<td>'.$row["year"].'</td>';
            echo '<td>'.$row["genre"].'</td>';
            echo '<td><input type="submit" name="edit" value="edit" data-index="' . $row['movie_id'] . '" class="btnedit" id="btnedit"></input></td>';
            echo '<td><input type="submit" name="delete" value="delete" class="btndlt" id="btndlt"></input></td>';
            echo "</tr>";
            echo "<tr>
                      <td><input type='text' class='hidden_input' id='hidden_name" . $row['movie_id'] . "'placeholder='hidden name'></input></td>
                      <td><input type='text' class='hidden_input' id='hidden_year" . $row['movie_id'] . "'placeholder='hidden year'></input></td>
                      <td><input type='text' class='hidden_input' id='hidden_genre" . $row['movie_id'] . "'placeholder='hidden genre'></input></td>
                 </tr>";
        }
        echo "</tbody></table>";
?>

    <h3>Add movie form: </h3>
    <form action="" method="POST">
        <label for="movie_name">Movie name : </label>
        <input type="text" name="movie_name" id="movie_name">
        <br><br>
        <label for="movie_year">Year: </label>
        <input type="text" name="movie_year" id="movie_year">
        <br><br>
        <label for="movie_genre">Genre: </label>
        <input type="text" name="movie_genre" id="movie_genre">
        <br><br>
        <input type="submit" name="submit_movie" id="submit_movie" value="Submit"> 
    </form>

</html>

下面是我的带有ajax调用的javascript文件:

$(document).ready(function(e){

    $('#submit_movie').click(function(e){
        e.preventDefault();
        var movie_name = $('#movie_name').val();
        var movie_year = $('#movie_year').val();
        var movie_genre = $('#movie_genre').val();

        $.ajax({
            type: 'POST',
            data: {movie_name:movie_name, movie_year:movie_year, movie_genre:movie_genre},
            url: "insert.php",
            success: function(result){
                        alert('Movie ' + movie_name + ' (' + movie_year + ')' +' added successfully.');
                        document.location.reload();
                    }
        })
    });

    $('.btnedit').click(function(e){
        var id = $(this).parent().prev().prev().prev().prev().html();
        alert(id);
        //unfinished function
    })

    $('.btndlt').click(function(e){
        var id = $(this).parent().prev().prev().prev().prev().prev().html();
        e.preventDefault();
        $.ajax({
            type: 'POST',
            data: {id:id},
            url: 'delete_row.php',
            success: function(result){
                alert('Successfully deleted.');
                document.location.reload();
            }
        })
    })

});

下面是用于添加电影的php页面insert.php(这一个可以工作,发布它只是为了获得更多信息):

<?php 
require_once('connection.php');

if($_REQUEST['movie_name']){
    $name = $_REQUEST['movie_name'];
    $year = $_REQUEST['movie_year'];
    $genre = $_REQUEST['movie_genre'];

    $sql = "INSERT INTO movies(name, year, genre) VALUES ('$name','$year','$genre')";
    $query = mysqli_query($conn, $sql);

}

?>

下面是delete_row.php文件,用于使用delete按钮删除条目:

<?php 
require_once('connection.php');

    $id = $_REQUEST['id'];

    if(isset($_REQUEST['delete'])){
        $sql = "DELETE FROM `movies` WHERE movie_id = $id";
        $query = mysqli_query($conn, $sql);
    }
 ?>

正如您可能看到的,我到处都在使用php和ajax,因为我试图实现多个解决方案或将它们混合使用来解决问题。在这个阶段,当我单击delete按钮时,我会收到一条警告消息,说擦除成功,adminpanel.php会重新加载电影列表。然而,电影仍然在那里,在sql数据库中。
当我试着调试delete_row.php时,我发现索引“id”每次都是未定义的,尽管我认为我是用ajax调用传递它的。

编辑

我应该说安全性不是我现在关心的问题,我做这个练习只是为了我描述的功能。:)安全是我的下一步,我知道这个代码是不安全的。

drnojrws

drnojrws1#

当我试着调试delete_row.php时,我发现索引“id”每次都是未定义的,尽管我认为我是用ajax调用传递它的。
发生这种情况的原因可能是因为您正在访问 delete_row.php 直接通过浏览器提交,而且由于表单没有提交(稍后将通过ajax提交),因此$\u请求变量始终是未定义的。
将来调试$\u request(或$\u post)变量时,应该使用postman,在这里您可以实际请求发送自己post参数的php文件。
在您的特定代码上,查询将永远不会运行,因为有以下行:

if(isset($_REQUEST['delete']))

这是在检查 delete 一开始从未发送的变量,因此将始终解析 false 在delete_row.php上使用以下代码:

<?php 
require_once('connection.php');
    if(isset($_REQUEST['id'])){
        $id = $_REQUEST['id'];
        $sql = "DELETE FROM `movies` WHERE movie_id = $id";
        $query = mysqli_query($conn, $sql);
    }
 ?>

相关问题