@The_Last_Dot

DELETE FROM list WHERE id = 'id строки в списке дел'. Как мне указать этот id?

delete.php:

$id = $_GET['notesDelete']; //?
$dbc = mysqli_connect('localhost', 'root', '', 'notes')
    or die('Connect error...');
$query = "DELETE FROM note WHERE id = '$id'"; //?
$result = mysqli_query($dbc, $query);
mysqli_close($dbc);


index.php:

a href="delete.php?id=notesDelete=' . $row['id']  . '"><button>-</button>a //?
  • Вопрос задан
  • 570 просмотров
Решения вопроса 1
@FirststepsRu
Ошибка в генерации URL для удаления
<a href="delete.php?id=notesDelete=' . $row['id']  . '">

Тут ошибочное id=notesDelete=N. По коду delete.php должно быть delete.php?notesDelete=N
Но скорее всего хотелось сделать что-то типа
echo "<a href=delete.php?id=",$row['id'],"&notesDelete=1><button>delete</button></a>";

Тогда delete.php мог бы выглядеть так
if (!isset($_GET['id'])) die("Error: not found id parameter");
$id = intval($_GET['id']);
if ($id == 0) die("Error: wrong id parameter value");
if (isset($_GET['notesDelete'])) {
      $dbc = mysqli_connect('localhost', 'root', '', 'notes') or die('Connect error...');
      $query = "DELETE FROM note WHERE id = ".$id;
      $result = mysqli_query($dbc, $query);
      mysqli_close($dbc);
} else {
      die("Error: no any action found");
}

Хотелось сделать важное замечание для начинающего. Ваш изначальный код не защищен от так называемых SQL инъекций. Вот пример кода
$id = intval("SELECT nothing"); var_dump($id);
$id = intval("1312; DELETE something"); var_dump($id);
$h = "DELETE FROM note WHERE id = '$id'";
var_dump($h);
$id = "10'; DROP DATABASE mysql; SELECT * FROM note WHERE id='1";
$h = "DELETE FROM note WHERE id = '$id'";
var_dump($h);

Выведет
int(0)
int(1312)
string(34) "DELETE FROM note WHERE id = '1312'"
string(80) "DELETE FROM note WHERE id = '10'; DROP DATABASE mysql; SELECT * from note id='1'"

То есть если злоумышленник подставит в URL текст с DROP DATABASE то сможет нарушить работу программы или получить какие-то секретные данные.
Я в коде продемонстрировал как можно от этого себя обезопасить, это принудительно привести тип входных данных к требуемому для работы, в данном случае к целому числу intval(). Таким образом все непонятное будет обрезано или пребразовано к 0. Для строковых выражений обязательно применять экранирование с помощью mysqli_real_escape_string().
Но более лучшей практикой в таком случае будут так называемые "подготовленные запросы SQL" о создании которых упомянул alexalexes, но не пояснил почему так надо делать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
1. Подготовить текст запроса prepare-функцией.
2. Присобачить нужные параметры запроса bind-функцией.
3. Выполнить запрос execute-функцией.
Запрос не выполняется? Посмотреть ошибки.
PS: В любой непонятной ситуации читай документацию.
Ответ написан
Комментировать
Поиграем в злого и доброго комментатора, я буду добрым :) У вас ссылка неправильно формируется - с кавычками намудрили. Вы посмотрите какая ссылка формируется на самом деле. В параметр notesDelete передаётся строка ' . $row['id'] . ' вместо значения $row['id']
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы