Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP + MYSQL] Usuwanie rekordów i kolumn
topcio
post
Post #1





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


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.  
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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).
Go to the top of the page
+Quote Post
topcio
post
Post #3





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Wielkie dzięki.
Działa (IMG:style_emoticons/default/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.  
Go to the top of the page
+Quote Post
viking
post
Post #4





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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.
Go to the top of the page
+Quote Post
topcio
post
Post #5





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


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

Ten post edytował topcio 15.01.2017, 11:22:38
Go to the top of the page
+Quote Post
viking
post
Post #6





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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.
Go to the top of the page
+Quote Post
topcio
post
Post #7





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


No to mnie załamałeś, bo 2 miesiące pisania całego kodu w tył.
Go to the top of the page
+Quote Post
viking
post
Post #8





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Czegoś się chociaż nauczysz (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
topcio
post
Post #9





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


Czy to oznacza, tak na szybko czytając, że cały kod powinienem przerobić na wersję PDO (IMG:style_emoticons/default/questionmark.gif)
Czy nie do końca rozumiem i mieszam pojęcia.
Go to the top of the page
+Quote Post
viking
post
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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.

Ten post edytował viking 15.01.2017, 12:20:38
Go to the top of the page
+Quote Post
topcio
post
Post #11





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


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
Go to the top of the page
+Quote Post
viking
post
Post #12





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Tu nie chodzi o to, jaką masz wersję obecnie. Tylko że ty jako programista musisz pisać kod tak, żeby nie był podatny na losowosc.
Go to the top of the page
+Quote Post
topcio
post
Post #13





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


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
Go to the top of the page
+Quote Post
viking
post
Post #14





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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.

Go to the top of the page
+Quote Post
topcio
post
Post #15





Grupa: Zarejestrowani
Postów: 140
Pomógł: 0
Dołączył: 14.01.2017

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


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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 00:50