Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> MySQL zapytanie usuwające wiersz o konkretnym id.
Peperoni
post 29.08.2019, 18:39:45
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 29.08.2019

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
viking
post 29.08.2019, 19:18:52
Post #2





Grupa: Zarejestrowani
Postów: 5 362
Pomógł: 909
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Zmień to sobie najlepiej na formularz dla każdego wiersza który np w input hidden będzie zawierał id do usunięcia.


--------------------
Go to the top of the page
+Quote Post
Peperoni
post 30.08.2019, 05:08:40
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 29.08.2019

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Peperoni 30.08.2019, 05:45:24
Go to the top of the page
+Quote Post
viking
post 30.08.2019, 05:50:02
Post #4





Grupa: Zarejestrowani
Postów: 5 362
Pomógł: 909
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Pokaż cały wygenerowany html tego fragmentu.


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 30.08.2019, 06:10:21
Post #5





Grupa: Zarejestrowani
Postów: 1 488
Pomógł: 177
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Peperoni
post 30.08.2019, 06:19:56
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 29.08.2019

Ostrzeżenie: (0%)
-----


Działa jak powinno. Dzięki wielkie.
Go to the top of the page
+Quote Post
viking
post 30.08.2019, 06:39:55
Post #7





Grupa: Zarejestrowani
Postów: 5 362
Pomógł: 909
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.10.2019 - 19:47