Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP + MYSQL] Usuwanie rekordów i kolumn
Forum PHP.pl > Forum > PHP
topcio
Witam Ponownie

Mam jeszcze jeden problem.
Nie wiem jak powinienem prawidłowo zapisać co poniżej.
Chciałbym usuwać z bazy konkretny rekord i konkretną kolumnę jednak usuwa mi zawsze ostatnią.
Wiem że problem leży w $SESSION bo zawsze ma w pamięci ostatnią wartość, ale nie potrafię napisać tego inaczej.

  1. case 'lista_kamere' :
  2. // sprawdzamy czy użytkownik jest zalogowany
  3. if($users->is_logged()) {
  4. echo "<table><tr><p><h3>Lista Kamer</h3></p></tr><tr>";
  5. $rezultat = mysqli_query($sql_monitoring, "SELECT $db_table_kamery.$db_row_kam_number, $db_table_kamery.$db_row_kam_name, $db_table_spec.$db_row_kam_model, $db_table_kamery.$db_row_kam_serial, $db_table_spec.$db_row_kam_resolution, $db_table_spec.$db_row_kam_type FROM $db_table_kamery, $db_table_spec WHERE $db_table_kamery.$db_row_kam_spec = $db_table_spec.$db_row_kam_id ORDER BY $db_row_kam_name" );
  6. $ile = mysqli_num_rows($rezultat);
  7. if ($ile>=1) {
  8. echo "<td width=\"100\" align=\"center\" bgcolor=\"e5e5e5\">Nazwa</td>";
  9. echo "<td width=\"150\" align=\"center\" bgcolor=\"e5e5e5\">Model</td>";
  10. echo "<td width=\"80\" align=\"center\" bgcolor=\"e5e5e5\">Numer Seryjny</td>";
  11. echo "<td width=\"80\" align=\"center\" bgcolor=\"e5e5e5\">Rozdzielczosc</td>";
  12. echo "<td width=\"100\" align=\"center\" bgcolor=\"e5e5e5\">Typ Kamery</td>";
  13. echo "<td width=\"20\" align=\"center\" bgcolor=\"e5e5e5\">Usuń Kamerę</td>";
  14. echo "</tr>";
  15. for ($i = 1; $i <= $ile; $i++) {
  16. echo "<tr>";
  17.  
  18. $row = mysqli_fetch_array($rezultat);
  19. $Usun_Kamere = $row[$db_row_kam_number];
  20. $_SESSION['Usun_Kamere_ID'] = $Usun_Kamere;
  21. $Nazwa = $row[$db_row_kam_name];
  22. $_SESSION['Usun_Kamere_Name'] = $Nazwa;
  23. $Model = $row[$db_row_kam_model];
  24. $Numer_Seryjny = $row[$db_row_kam_serial];
  25. $Rozdzielczosc = $row[$db_row_kam_resolution];
  26. $Typ_Kamery = $row[$db_row_kam_type];
  27. echo "<td width=\"100\" align=\"center\" bgcolor=\"aaaaaa\"><a href=" . $Nazwa . ".php><font color=green>$Nazwa</font></a></td>";
  28. echo "<td width=\"150\" align=\"center\" bgcolor=\"aaaaaa\">" . $Model . "</td>";
  29. echo "<td width=\"80\" align=\"center\" bgcolor=\"aaaaaa\">" . $Numer_Seryjny . "</td>";
  30. echo "<td width=\"80\" align=\"center\" bgcolor=\"aaaaaa\">" . $Rozdzielczosc . "</td>";
  31. echo "<td width=\"100\" align=\"center\" bgcolor=\"aaaaaa\">" . $Typ_Kamery . "</td>";
  32. echo "<td width=\"20\" align=\"center\" bgcolor=\"aaaaaa\">" . $_SESSION['Usun_Kamere_ID'] ;
  33.  
  34. echo "<form action=index.php?action=usun_kamere method=post>";
  35. echo "<input type='submit' class='btn-block' value='Usuń Kamerę'></form</td>";
  36.  
  37. echo "</tr>";
  38. }}
  39. echo "</table>";
  40.  
  41.  
  42.  
  43.  
  44.  
  45. echo "<a href=\"index.php?action=login\">Powrót</a>";
  46. echo "<br>";
  47.  
  48. } else {
  49. echo '<p>Musisz być zalogowany aby przeglądać tę stronę.</p>';
  50. echo '<p><a href="?action=login">Zaloguj się ponownie</a></p>';
  51. }
  52.  
  53. break;
  54.  
  55. case 'usun_kamere':
  56. if($users->is_logged()) {
  57.  
  58. $Usun_Kamere_ID = $_SESSION['Usun_Kamere_ID'];
  59. $rezultat = mysqli_query($sql_monitoring, "DELETE FROM $db_table_kamery WHERE $db_row_kam_number = $Usun_Kamere_ID" );
  60. unset($_SESSION['Usun_Kamere_ID']);
  61. $Usun_Kamere_Name = $_SESSION['Usun_Kamere_Name'];
  62. $rezultat = mysqli_query($sql_monitoring, "ALTER TABLE $db_table_user DROP COLUMN $Usun_Kamere_Name" );
  63. unset($_SESSION['Usun_Kamere_Name']);
  64.  
  65. header("Location: ?action=lista_kamere");
  66. }
  67. break;
  68.  
trueblue
Usuwa ostatni, bo w pętli wciąż nadpisujesz zmienną sesyjną (więc ta przyjmuje ostatnią wartość id).
Zamiast tego formularza wstaw tam link index.php?action=usun_kamere&id=id_kamery (zmienne będą w $_GET nie $_POST).
topcio
Wielkie dzięki.
Działa smile.gif

Dla potomnych poprawiony kod

  1. case 'lista_kamere' :
  2. // sprawdzamy czy użytkownik jest zalogowany
  3. if($users->is_logged()) {
  4. echo "<table><tr><p><h3>Lista Kamer</h3></p></tr><tr>";
  5. $rezultat = mysqli_query($sql_monitoring, "SELECT $db_table_kamery.$db_row_kam_number, $db_table_kamery.$db_row_kam_name, $db_table_spec.$db_row_kam_model, $db_table_kamery.$db_row_kam_serial, $db_table_spec.$db_row_kam_resolution, $db_table_spec.$db_row_kam_type FROM $db_table_kamery, $db_table_spec WHERE $db_table_kamery.$db_row_kam_spec = $db_table_spec.$db_row_kam_id ORDER BY $db_row_kam_name" );
  6. $ile = mysqli_num_rows($rezultat);
  7. if ($ile>=1) {
  8. echo "<td width=\"100\" align=\"center\" bgcolor=\"e5e5e5\">Nazwa</td>";
  9. echo "<td width=\"150\" align=\"center\" bgcolor=\"e5e5e5\">Model</td>";
  10. echo "<td width=\"80\" align=\"center\" bgcolor=\"e5e5e5\">Numer Seryjny</td>";
  11. echo "<td width=\"80\" align=\"center\" bgcolor=\"e5e5e5\">Rozdzielczosc</td>";
  12. echo "<td width=\"100\" align=\"center\" bgcolor=\"e5e5e5\">Typ Kamery</td>";
  13. echo "<td width=\"20\" align=\"center\" bgcolor=\"e5e5e5\">Usuń Kamerę</td>";
  14. echo "</tr>";
  15. for ($i = 1; $i <= $ile; $i++) {
  16. echo "<tr>";
  17.  
  18. $row = mysqli_fetch_array($rezultat);
  19. $Usun_Kamere = $row[$db_row_kam_number];
  20. $Nazwa = $row[$db_row_kam_name];
  21. $Model = $row[$db_row_kam_model];
  22. $Numer_Seryjny = $row[$db_row_kam_serial];
  23. $Rozdzielczosc = $row[$db_row_kam_resolution];
  24. $Typ_Kamery = $row[$db_row_kam_type];
  25. echo "<td width=\"100\" align=\"center\" bgcolor=\"aaaaaa\"><a href=" . $Nazwa . ".php><font color=green>$Nazwa</font></a></td>";
  26. echo "<td width=\"150\" align=\"center\" bgcolor=\"aaaaaa\">" . $Model . "</td>";
  27. echo "<td width=\"80\" align=\"center\" bgcolor=\"aaaaaa\">" . $Numer_Seryjny . "</td>";
  28. echo "<td width=\"80\" align=\"center\" bgcolor=\"aaaaaa\">" . $Rozdzielczosc . "</td>";
  29. echo "<td width=\"100\" align=\"center\" bgcolor=\"aaaaaa\">" . $Typ_Kamery . "</td>";
  30. echo "<td width=\"20\" align=\"center\" bgcolor=\"aaaaaa\">" . $Usun_Kamere ;
  31. echo "<a href=index.php?action=usun_kamere&kam_id=" . $Usun_Kamere . "&kam_name=" . $Nazwa . "><font color=green>Usuń Kamerę</font></a></td>";
  32. echo "</tr>";
  33. }}
  34. echo "</table>";
  35. echo "<a href=\"index.php?action=login\">Powrót</a>";
  36. echo "<br>";
  37.  
  38. } else {
  39. echo '<p>Musisz być zalogowany aby przeglądać tę stronę.</p>';
  40. echo '<p><a href="?action=login">Zaloguj się ponownie</a></p>';
  41. }
  42.  
  43. break;
  44.  
  45. case 'usun_kamere':
  46. if($users->is_logged()) {
  47. $Usun_Kamere_ID = $_GET['kam_id'];
  48. $rezultat = mysqli_query($sql_monitoring, "DELETE FROM $db_table_kamery WHERE $db_row_kam_number = $Usun_Kamere_ID" );
  49. $Usun_Kamere_Name = $_GET['kam_name'];
  50. $rezultat = mysqli_query($sql_monitoring, "ALTER TABLE $db_table_user DROP COLUMN $Usun_Kamere_Name" );
  51. header("Location: ?action=lista_kamere");
  52. }
  53. break;
  54.  
viking
Jesteś narażony na ataki SQL injection przy tym kodzie. I raczej nie powinno być sytuacji że dropujesz kolumnę. Masz raczej coś nie tak z logiką tej aplikacji.
topcio
Logika jest OK.
Przy dodawaniu kamery dodaję kolumnę w bazie użytkowników, którym z góry nie daje uprawnień.
Przy usuwaniu kamery usuwam również zbędną już kolumną dotyczącą danej kamery.

To jest tymczasowe nie mogłem sobie poradzić z osiągnięciem celu, więc by nie wertować między plikami pisałem wszystko w jednym.
Docelowo mam klasy użytkowników i będzie to podpięte pod klasę, która zapobiega takim atakom.

kod tej klasy
  1. <?php
  2.  
  3. class Sql extends mysqli {
  4.  
  5. /**
  6. * Filtruje zmienną
  7. * @param mixed $var
  8. * @return mixed
  9. */
  10. public function clear($var) {
  11. // jeśli nasza zmienna to tablica to używamy funkcji clear na każdym elemencie
  12. if(is_array($var)) {
  13. return array_map(array($this, 'clear'), $var);
  14. }
  15.  
  16. // jeśli jest ustawiona opcja magic_quotes to usuwamy backslashe
  17. $var = stripslashes($var);
  18. }
  19.  
  20. // filtrujemy znaki specjalne takie jak apostrof i cudzysłów
  21. $var = $this->real_escape_string($var);
  22.  
  23. // usuwamy białe znaki na początku i końcu zmiennej
  24. $var = trim($var);
  25.  
  26. // zamieniamy znaki specjalne html na encje
  27. $var = htmlspecialchars($var);
  28.  
  29. return $var;
  30. }
  31.  
  32. }
  33.  
  34. ?>


Popraw mnie jeśli się mylę, ale powinno być wówczas OK.
Jestem początkujący, dopiero się uczę, mam nadzieję, że szybko i każdy komentarz jest mile widziany
viking
Nie jest ok bo po pierwsze http://php.net/manual/en/security.magicquotes.php. po drugie żeby quotwanie działało musi być prawidłowo encoding. A od takich rzeczy masz prepare bez żadnego rozszerzania kodem sprzed10 lat.
topcio
No to mnie załamałeś, bo 2 miesiące pisania całego kodu w tył.
viking
Czegoś się chociaż nauczysz smile.gif
I nie zdawaj się na taką dowolność. htmlspecialchars przy takim użyciu będzie dawał losowe rezultaty na różnych wersjach PHP:
Cytat
If omitted, the default value of the encoding varies depending on the PHP version in use. In PHP 5.6 and later, the default_charset configuration option is used as the default value. PHP 5.4 and 5.5 will use UTF-8 as the default. Earlier versions of PHP use ISO-8859-1.
topcio
Czy to oznacza, tak na szybko czytając, że cały kod powinienem przerobić na wersję PDO questionmark.gif
Czy nie do końca rozumiem i mieszam pojęcia.
viking
Znaczy to, że w zależności od wersji php jest zupełnie inna wartość encoding. Domyślnie jest też html4.01.
Nie powinieneś też modyfikować danych oryginalnych bo później będziesz miał problem przy modyfikacjach. Powinny być zabezpieczone podczas wyświetlania - XSS.
topcio
Moja wersja PHP
Wersja PHP: 5.6.29-pl0-gentoo
a kodowanie php utf-8

Kodowanie znaków serwera: UTF-8 Unicode (utf8)

charset strony również ustawiony na utf-8
viking
Tu nie chodzi o to, jaką masz wersję obecnie. Tylko że ty jako programista musisz pisać kod tak, żeby nie był podatny na losowosc.
topcio
Testowo wykonałem podczas logowania do strony zamiast user name, oraz już po zalogowaniu we wszystkich dostępnych formularzach
  1. '; ALTER TABLE users DROP COLUMN testowa; --

Nie usunęło.

Znalazłem za to błąd, którego nie umiem ominąć.

W tej linii
  1. echo "<a href=index.php?action=usun_kamere&kam_id=" . $Usun_Kamere . "&kam_name=" . $Nazwa . "><font color=green>Usuń Kamerę</font></a></td>";


Wszystko jest OK, dopóki w nazwie nie ma spacji, jeśli natomiast dodam kamerę "Kamera 1", link generuje się tylko jako "Kamera"
Co można z tym zrobić?

Ok już sobie poradziłem funkcją str_replace
viking
Zawsze tworząc urle powinieneś używać http://php.net/manual/en/function.urlencode.php

A teraz w swoim zapytaniu podstaw w urlu pod kam_id=1 or 1=1 (nie rób tego na produkcji). Skasuje ci wszystkie rekordy w tabeli.

topcio
Po wpisaniu
index.php?action=usun_kamere_action&kam_id=1 or 1=1
Nic się nie dzieje z tablicami poza tym, że usunęło kam_id=1
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-2025 Invision Power Services, Inc.