Удалить запись 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']
Кодируйте идентификатор с помощью двустороннего шифрования, чтобы он был "отослан", закодирован и декодирован для использования.