Удалить запись MySQLi, не показывая идентификатор в URL

Я пытаюсь удалить записи из БД по их идентификатору. Код работает как надо, но проблема в том, что в 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.

Любая помощь высоко ценится.

Спасибо

3 ответа

Решение

Установить Id в $_SESSION и вы можете передать его между страницами.

ИЛИ ЖЕ

Вы можете сделать это с помощью 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>

создайте 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 ваша страница не будет обновлена, а данные будут удалены из базы данных, а удаленная строка будет скрыта от пользователя.

Для этого вы можете поместить форму в последнюю ячейку таблицы:

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>';

Форма использует скрытый ввод для вашего значения идентификатора.

В вашем PHP вы бы изменили на $_POST массив, $_POST['id']

Кодируйте идентификатор с помощью двустороннего шифрования, чтобы он был "отослан", закодирован и декодирован для использования.

Другие вопросы по тегам