Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Wybór z listy rozwijanej, a wpływ na zapytanie do innej tabeli
Forum PHP.pl > Forum > Przedszkole
Therminus
Mam tabelę `ulice`z nazwami ulic (ok 20 pozycji). W PHP stworzyłem kod, który dokonuje wybranie konkretnej ulicy z listy rozwijanej, w której wyświetlają się nazwy ulic z tabeli `ulice` właśnie.
Fragment kodu:
  1. $sql = mysqli_connect('localhost', 'admin', 'admin');
  2. $db = mysqli_select_db($sql, 'nieruchomosci');
  3. $char = "SET CHARSET UTF8";
  4. mysqli_query($sql, $char);
  5. /* ustawiamy polskie locale */
  6. setlocale(LC_ALL, 'pl_PL');
  7.  
  8. echo "<form><select style='width:250px'>";
  9. $zapytanie0 = "SELECT `Ulica` FROM `ulice` ";
  10. $jaka_ulica = mysqli_query($sql, $zapytanie0);
  11. while($ulica = mysqli_fetch_array ($jaka_ulica))
  12. {
  13. <option value="'.($ulica['Ulica']).'">'.$ulica['Ulica'].'</option> ';
  14. }
  15. echo "</select></form>";

I teraz jak to zrobić, aby wybrana ulica z listy mogła mieć wpływ na zapytanie do innej tabeli. Na przykład:
  1. $zapytanie = "SELECT * FROM `budynki` WHERE `Ulica` LIKE 'Tutaj_zmienna_odwolujaca_sie_do_nazwy_wybranej_z_listy_rozwijanej' and `Kategoria` LIKE 'LU%' ";
  2. $wykonaj = mysqli_query($sql, $zapytanie);
  3. while($wiersz=mysqli_fetch_array ($wykonaj)) {
  4. echo '<tr>
  5. <td >'.$wiersz['ID'].'</td>
  6. <td >'.$wiersz['Ulica'].'</td>
  7. <td align="center">'.$wiersz['Klatka'].'</td>
  8. <td align="center">'.$wiersz['Nr_Nazwa'].'</td>
  9. <td align="center">'.$wiersz['Kategoria'].'</td>
  10. <td style="padding-right:10px"; align="right">'.$wiersz['Pow_Uzyt'].'</td>
  11. <td style="padding-right:10px"; width=\"10\"; align="right">'.$wiersz['Udzial_w_nieruch'].'</td>
  12. <td align="center">'.$wiersz['Data_ust_prawa_odr_wlasn'].'</td>
  13. <td >'.$wiersz['Nr_aktu_notar'].'</td>
  14. <td align="center">'.$wiersz['Ilosc'].'</td>
  15. </tr>';
viking
A jak tam klucze wyglądają? Budynek jest przy ulicy więc pewnie w budynki jakieś id_ulicy.
Wstaw w tej liście id_ulicy -> nazwa_ulicy, potem wybrane id podstaw (przez bindowanie parametrów w mysqli aby nie otworzyć się na sql injection) do SELECT * FROM `budynki` WHERE `Ulica_id` = %d
Therminus
Już dałem sobie radę.
Kod wygląda tak:
  1. $sql = mysqli_connect('localhost', 'admin', 'admin');
  2. $db = mysqli_select_db($sql, 'nieruchomosci');
  3. $char = "SET CHARSET UTF8";
  4. mysqli_query($sql, $char);
  5. /* ustawiamy polskie locale */
  6. setlocale(LC_ALL, 'pl_PL');
  7.  
  8. if(isset($_POST['wybor'])){
  9.  
  10. $wybor = $_POST['wybor'];
  11. }
  12. echo "<form method='POST'><select name='wybor'>";
  13.  
  14. $zapytanie0 = "SELECT `Ulica` FROM `ulice` ";
  15. $jaka_ulica = mysqli_query($sql, $zapytanie0);
  16.  
  17. while($ulica = mysqli_fetch_array ($jaka_ulica))
  18. {
  19. <option value="'.($ulica['Ulica']).'">'.$ulica['Ulica'].'</option> ';
  20. }
  21. echo "<input type='submit'/>";
  22. echo "</select></form>";
  23. $zapytanie = "SELECT * FROM `budynki` WHERE `Ulica` = '$wybor' and `Kategoria` LIKE 'LU%' ";
  24. (...)
  25.  

I to działa tak jak chcę. Ale wyłożyłem się na zdawałoby się prozaicznej sprawie: działaniu arytmetycznym na zmiennych.
Ale na to założę nowy wątek.
viking
No i tak jak napisałem, jesteś podatny na sql injection...
Therminus
Cytat(viking @ 31.07.2022, 14:32:10 ) *
No i tak jak napisałem, jesteś podatny na sql injection...

A mógłbyś coś więcej napisać? W jaki sposób ktoś mógłby w tym konkretnym przypadku zaszkodzić?
Przyznam, że temat tylko liznąłem.
nospor
To ze ktos dzieki tej luce moze wybrac wszystkie dane z twojej bazy, a jak mu sie poszczesci to nawet dobrac sie do serwera.
Tak jak juz ci pisano: uzyj BINDowania
Therminus
Cytat(nospor @ 2.08.2022, 12:25:48 ) *
To ze ktos dzieki tej luce moze wybrac wszystkie dane z twojej bazy, a jak mu sie poszczesci to nawet dobrac sie do serwera.
Tak jak juz ci pisano: uzyj BINDowania

Te ogólniki to ja znam. Jak konkretnie w moim przypadku może się dobrać do bazy?
nospor
przeczytaj w necie jak sie robi SQL INJECTION, 5 minut czytania, i bedziesz wiedzial. Cala masa przykladow na to jest
Therminus
Cytat(nospor @ 2.08.2022, 13:57:03 ) *
przeczytaj w necie jak sie robi SQL INJECTION, 5 minut czytania, i bedziesz wiedzial. Cala masa przykladow na to jest

Jak na razie trafiłem tylko na przykłady z formularzem logowania. Nie mam takiego formularza.
nospor
Ale tu nie chodzi o zaden formularz tylko o to, ze wkladasz do zapytania tekst ktory przychodzi od uzytkownika a uzytkownik moze tam wstawic wszystko.

Pierwszy lepszy przyklad z netu
https://sekurak.pl/czym-jest-sql-injection/
I tu nie ma znaczenia czy dane ida z URL czy z formularza. Wszystko idzie od uzytkownikia i uzytkownik moze namieszac o hakerze nie wspominajac
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.