删除MySQLi记录而不显示URL中的id

时间:2015-07-16 16:08:23

标签: php mysqli

我正在尝试通过ID删除数据库中的记录。代码可以正常工作,但问题是URL出现在URL中,据我所知,这是不安全的。

网址:“http://localhost/Project/includes/delete.php?id=27

我使用预准备语句来删除记录,但问题来自按钮。是否有任何其他方法可以使用我已经使用的方法来保证安全?

以下是代码:

    while($row = $result->fetch_assoc()) {
        echo '<tr>';
            echo '<td>' . $row['row1'] . '</td>';
            echo '<td>' . $row['row2'] . '</td>';
            echo '<td>' . $row['row3'] . '</td>';
            echo '<td><a href="delete.php?id=' . $row['id'] . '">Delete</a></td>';
        echo '</tr>';
    }

if (isset($_GET['id']) && is_numeric($_GET['id'])) {
    $id = $_GET['id'];

    if ($stmt = $mysqli->prepare("DELETE FROM table WHERE id = ? LIMIT 1")) {
        $stmt->bind_param("i", $id);
        $stmt->execute();
        printf("Affected rows (DELETE): %d\n", $mysqli->affected_rows);
        $stmt->close();
    }
}

基本上我想让整个行都可以点击,只要用户点击行删除记录,而不是使用按钮。但是,我面临的最大挑战是如何不在URL中显示其ID。

非常感谢任何帮助。

谢谢

3 个答案:

答案 0 :(得分:1)

Id中设置$_SESSION,您可以在页面间传递它。

OR

你可以用ajax

来做
while($row = $result->fetch_assoc()) {
    echo '<tr class=\"deleted\">';
        echo '<td>' . $row['row1'] . '</td>';
        echo '<td>' . $row['row2'] . '</td>';
        echo '<td>' . $row['row3'] . '</td>';
        echo '<td><a href="#" id="'. $row['id'] .'" class=\"delete\">Delete</a></td>';
    echo '</tr>';
}

在上面代码所在的页面中添加此脚本;

<script type="text/javascript">
$(function() {
    $(".delete").click(function(){
    var element = $(this);
    var del_id = element.attr("id");
    var info = 'id=' + del_id;
    if(confirm("Are you sure you want to delete this?")){
     $.ajax({
       type: "POST",
       url: "delete.php",
       data: info,
       success: function(){
     }
    });
      $(this).parents(".deleted").hide(500);
     }
        return false;
    });
});
</script>

在root中创建一个delete.php,它就像

<?php
//Add your database connection first here
if (isset($_POST['id']) && is_numeric($_POST['id'])) {
    $id = $_POST['id'];

    if ($stmt = $mysqli->prepare("DELETE FROM table WHERE id = ? LIMIT 1")) {
        $stmt->bind_param("i", $id);
        $stmt->execute();
        //Set if condition here to check and show response
        if ($stmt) {
            echo "<font color='red'>Record Deleted Successful</font>";
            } else {
            echo "<font color='red'>Error While Trying To Delete Record, Please Try Again</font>";
            }
        //printf("Affected rows (DELETE): %d\n", $mysqli->affected_rows);
        $stmt->close();
    }
}
?>

使用Ajax,您的页面将不会刷新,数据将从数据库中删除,删除的行将被用户隐藏

答案 1 :(得分:0)

使用双向加密对ID进行编码,以便对其进行“发送”编码并进行解码以供使用。

答案 2 :(得分:0)

为此,您可以在最后一个表格单元格中放置一个表单:

echo '<td><form action="delete.php" method="post">';
echo '<input type="hidden" name="id" value="' . $row['id'] . '/>';
echo '<input type="submit" value="Delete" />';
echo '</form></td>';

表单使用隐藏的输入作为您的id值。

在PHP中,您将更改为$_POST数组$_POST['id']