Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MySQL zapytanie usuwające wiersz o konkretnym id.
Forum PHP.pl > Forum > Bazy danych > MySQL
Peperoni
Witam,
piszę stronkę na zaliczenie i mam w panelu administracyjnym tabelę z menu do której ładnie się dodaje i usuwa kiedy podam konkretne ID. Zrobiłem obok wiersza w tabeli html przycisk usuń i chciałbym żeby usuwał dokładnie ten wiersz do którego jest przypisany.

Tutaj kod tworzący tabelę i wypełniający ją danymi z bazy:

  1. require_once ('../db_connect.php');
  2.  
  3. if ($result = $polaczenie->query("SELECT * FROM jadlospis ORDER BY ID")){
  4. if($result->num_rows > 0) {
  5. echo '<div class="card mb-3">';
  6. echo '<div class="card-header">';
  7.  
  8. echo 'Jadłospis</div>';
  9. echo '<div class="card-body">';
  10. echo '<div class="table-responsive">';
  11.  
  12. echo '<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">';
  13. echo '<thead>';
  14. echo "<tr>
  15. <th>ID </th>
  16. <th>Dzień </th>
  17. <th>Śniadanie </th>
  18. <th>Obiad</th>
  19. <th>Podwieczorek</th>
  20. <th>Usuń/Popraw</th>
  21. </tr>";
  22.  
  23. echo '</thead>';
  24.  
  25. while($row = $result->fetch_object()){
  26. echo '<tbody>';
  27. echo "<tr>";
  28.  
  29. echo "<td>" . $row ->id . "</td>";
  30. echo "<td>" . $row ->dzien . "</td>";
  31. echo "<td>" . $row ->sniadanie . "</td>";
  32. echo "<td>" . $row ->obiad . "</td>";
  33. echo "<td>" . $row ->podwieczorek . "</td>";
  34.  
  35. echo "<td> <input type=submit class=btn btn-primary btn-block name=idusun value=usuń> </td>";
  36.  
  37.  
  38.  
  39. echo "</tr>";
  40. echo '<tbody>';
  41.  
  42. }
  43.  
  44. echo "</table>";



Zapytanie SQL pod Submita wygląda następujaco:

  1. if (isset($_POST['idusun']))
  2. {
  3.  
  4. //Udana walidacja
  5. $wszystko_OK=true;
  6.  
  7. $userid = $_SESSION['user'];
  8.  
  9.  
  10.  
  11. [sql]$delete = "DELETE FROM `jadlospis` WHERE `ID` = id";[/sql]
  12.  
  13. //Połączenie z bazą
  14.  
  15. require_once "../db_connect.php";
  16. mysqli_report(MYSQLI_REPORT_STRICT);
  17.  
  18. try
  19. {
  20. $polaczenie = new mysqli($host, $db_user, $db_password, $db_name);
  21. if ($polaczenie->connect_errno!=0)
  22. {
  23. throw new Exception(mysqli_connect_errno());
  24. }
  25. else
  26. {
  27.  
  28. if ($polaczenie->query($delete))
  29. {
  30. $_SESSION['udanezamowienie']=true;
  31. header('Location: form-basic.php');
  32. }
  33. else
  34. {
  35. throw new Exception($polaczenie->error);
  36. }
  37.  
  38. }
  39.  
  40. }
  41.  
  42. catch(Exception $e)
  43. {
  44. echo '<span style="color:red;">Coś się popsuło!</span>';
  45. echo '<br />Informacja developerska: '.$e;
  46. }
  47.  
  48. }


Niestety usuwa ono wszystkie wiersze, a chciałbym tylko jeden.
Proszę bardzo o pomoc.
viking
Zmień to sobie najlepiej na formularz dla każdego wiersza który np w input hidden będzie zawierał id do usunięcia.
Peperoni
Zrobiłem tak jak poradziłeś:
  1. echo "<input type=hidden name=idusun value=".$row->id.">";
  2.  
  3. $usun = $_POST['idusun'];
  4. $delete = "DELETE FROM `jadlospis` WHERE `ID` = '$usun'";


I teraz usuwa mi po kolei od najwyższego ID niezależnie od tego, w którym wierszu wcisnę usuń. W źródle strony sprawdzałem, php pokazuje po kolei wartości ID każdego wiersza.
viking
Pokaż cały wygenerowany html tego fragmentu.
Tomplus
Nie musi nic pokazywać. Zamknął w <form> wszystkie input-hidden więc wiadomo, że formularz po wysłaniu będzie odczytywał ostatnią taką zmienną.

@peperoni
Zamiast input-submit daj button-submit. Jest to lepsze rozwiązanie, i pominiesz problem który masz wyżej:
  1. echo "<td> <button type='submit' class='btn btn-primary btn-block' name='idusun' value='".$row->id."'>usuń</button> </td>";

Teraz nie potrzebujesz input-hidden, a wartość _POST[idusun] zostanie poprawnie przesłana jednym kliknięciem.

Dobrym zwyczajem jest zamykanie w cudzysłowie podwójne lub pojedyńcze wartości atrybutów tagów HTML.
Peperoni
Działa jak powinno. Dzięki wielkie.
viking
Ja to wiem ale przy okazji chciałem nauczyć żeby czasami sprawdzać wygenerowany kod czy zgadza się z tym co być powinno. I też pokazać że to co zrobił nijak ma się do mojej odpowiedzi. W tym kodzie nie było też żadnego formularza co jest niepoprawne.
Jeszcze kolejna rzecz. Rzutuj to id na int chyba że chcesz atak sql injection.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.