Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Problem z dynamicznym generowaniem zapytania
Forum PHP.pl > Forum > PHP
Simek
Dopóki wszystko robiłem w miarę statycznie strona działała bez najmniejszego zarzutu, ale jako, że lubię wyzwania postanowiłem stworzyć funkcję, która wszystko generuje dynamicznie (a do wygenerowania jest kilka takich formularzy).

Także przejdźmy do sedna:
  1. function forma( $tabela, $teksty ) {
  2.  
  3. // tutaj znajduje się raczej nie istotna część kodu
  4.  
  5. if ( isset( $_POST[ $pole ] ) ) {
  6. $zapytanie = '"SELECT cena FROM ' . $tabela . ' WHERE';
  7.  
  8. foreach ( $_POST as $name => $value )
  9. $$name = trim( htmlspecialchars( $value ) );
  10.  
  11. foreach( $head as $name => $value ) {
  12. $pole = $tabela . "_" . $name;
  13. if ( $name != "cena" ) {
  14. $zapytanie .= " " . $name . " = '$" . $pole . "' AND";
  15. } else if ( $name == "cena" ) {
  16. $zapytanie = substr( $zapytanie, 0, -4 );
  17. $zapytanie .= '"';
  18. }
  19. }
  20.  
  21. echo $zapytanie;
  22.  
  23. $query = mysql_query( $zapytanie );
  24.  
  25. printf( "<h2 class=\"cena\">Cena: <span class=\"kolor\">%s zł</span></h2>", mysql_result( $query, 0 ) );
  26. }
  27. }

Wszystko jest wporządku oprócz tego, wsytepuję nastepujący błąd związany z zapytaniem MYSQL:
  1. Warning: mysql_result(): supplied argument is not a valid MySQL result resource

Zapytanie które wyrzucam sobie w ramach debugu do HTML wygląda nastepująco:
  1. "SELECT cena FROM ulotki WHERE rozmiar = '$ulotki_rozmiar' AND papier = '$ulotki_papier' AND skladane = '$ulotki_skladane' AND ilosc = '$ulotki_ilosc'"

Sprawdzałem już czy wszystkie zmienne generowane z $_POST nie są puste i zawierają odpowiednie wartości - odpowiedź brzmi tak.

Najważniejsze jest to, że jeśli skopiuję wygenerowane przez skrypt zapytanie i wkleję je na sztywno do kodu wybrana dana wyświetla sie bez najmniejszego problemu.

Liczę na jakakolwiek pomoc i sugestię, jako że jestem samoukiem ; )
legorek
Hej!

  1. $zapytanie .= " " . $name . " = '$" . $pole . "' AND";


zamień na:

  1. $zapytanie .= " " . $name . " = '" . $$pole . "' AND";


Poczytaj o zmiennych zmiennych.

A tak na marginesie, Twoje rozwiązanie jest wyjątkowo dziurawe i pozwala atakującemu na wykonanie praktycznie dowolnego zapytania SQL. Jak już musisz coś takiego robić to filtruj zawartość zmiennej $pole,
Simek
Oczywiście że mogę tam zastosować dynamiczne zmienne, nie tak "plain text" jak zrobiłem, ale to nie rozwiązuje problemu.

Co do zabezpieczeń, spokojnie, wiem że nie ma jakiegokolwiek filtrowania danych, ale po pierwsze póki co chciałem się skupić na działaniu kodu, zabezpieczenia dojdą za czasem, jak wszystko zacznie już działać w pełni poprawnie, po drugie formularz składa się z samych ?SELECTów?, więc aby wstrzyknąć kod wymagana już jest ingerencja za pomocą FireBuga lub podobnego narzędzia, więc połowa scripts-kiddes odpada w przedbiegach.

EDIT: Uporałem się z problemem, temat do zamknięcia.
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.