Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql] [php]w polu zamiast 1 czasami zapisuje 0
jagwie
post 9.01.2011, 09:45:52
Post #1





Grupa: Zarejestrowani
Postów: 71
Pomógł: 0
Dołączył: 6.01.2008

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


Witam Mam problem ze skryptem lub zapytaniem .
Czasami jak użytkownik zmienia dane w swoim panelu zamiast 1 w polu aktywna zamienia na 0.
Zdarza się to bardzo rzadko lecz jest o problem którego nie mogę rozwiązać .
Nie wiem czy za ten błąd jest odpowiedzialna któraś z przeglądarek czy problem w skrypcie.
plik.php wygląda tak
  1. /* ZAPISZ DANE DO MYSQL, JEŚLI JESZCZE NIE ISTNIEJˇ TO STWÓRZ REKORD */
  2. if(isset($_POST['zapisz'])) {
  3. $telefon = $_POST['telefon'];
  4. $adres = $_POST['adres'];
  5. $lat = $_POST['lat'];
  6. $lng = $_POST['lng'];
  7. $zom = $_POST['zom'];
  8. $www = $_POST['www'];
  9. $email = $_POST['email'];
  10. $nazwa_obiektu = $_POST['nazwa_obiektu'];
  11. $typ_dzialalnosci = $_POST['typ_dzialalnosci'];
  12. $kraj = $_POST['kraj'];
  13. $region = (int) $_POST['region'];
  14. $wojewodztwo = $_POST['wojewodztwo'];
  15. $miasto = $_POST['miasto'];
  16. $opcje = $_POST['opcje'];
  17. if(!empty($opcje)) $opcje = implode(', ',$opcje);
  18. $opis_obiektu = $_POST['opis_obiektu'];
  19. $ciekawe_miejsca = $_POST['ciekawe_miejsca'];
  20. $wszystkich_pokoi = $_POST['wszystkich_pokoi'];
  21. $wolnych_pokoi = $_POST['wolnych_pokoi'];
  22. $cena_od = $_POST['cena_od'];
  23. $cena_do = $_POST['cena_do'];
  24. $zapytanie = mysql_query("SELECT * FROM uzytkownicy WHERE login = '".$_SESSION['login']."'");
  25. $wynik = mysql_fetch_array($zapytanie);
  26. $id_uzytkownika = $wynik['id'];
  27. $zapytanie = mysql_query("SELECT * FROM oferty WHERE id_uzytkownika = $id_uzytkownika");
  28. $ile = mysql_num_rows($zapytanie);
  29.  
  30. if(!empty($nazwa_obiektu) && $typ_dzialalnosci!=0 && $kraj!=0 && $wojewodztwo!=0 && !empty($miasto) && !empty($telefon) && !empty($adres) && !empty($lat) && !empty($lng) && !empty($zom) && !empty($wszystkich_pokoi) && !empty($wolnych_pokoi) && !empty($cena_od) && !empty($cena_do))
  31. $aktywna = 1;
  32. else
  33. $aktywna = 0;
  34.  
  35. if($ile>0) {
  36. $zapytanie2 = mysql_query("SELECT * FROM oferty WHERE id_uzytkownika = $id_uzytkownika");
  37. $wynik2 = mysql_fetch_array($zapytanie2);
  38. if($wynik2['wazna_dni']==0) $aktywna = 0;
  39. mysql_query("UPDATE `oferty` SET `nazwa_obiektu` = '$nazwa_obiektu', `typ_dzialalnosci` = $typ_dzialalnosci, `kraj` = $kraj, `region` = $region, `wojewodztwo` = $wojewodztwo, `miasto` = '$miasto', `opcje` = '$opcje', `opis_obiektu` = '$opis_obiektu', `ciekawe_miejsca` = '$ciekawe_miejsca', `wszystkich_pokoi` = $wszystkich_pokoi, `wolnych_pokoi` = $wolnych_pokoi, `cena_od` = $cena_od, `cena_do` = $cena_do, `telefon` = '$telefon', `email` = '$email', `www` = '$www', `aktywna` = $aktywna, `adres` = '$adres', `lat` = '$lat', `lng` = '$lng', `zom` = '$zom', `dat` = now() WHERE `id_uzytkownika` = $id_uzytkownika LIMIT 1;");
  40. }
  41. else {
  42. $zapytanie2 = mysql_query("SELECT * FROM ustawienia");
  43. $wynik2 = mysql_fetch_array($zapytanie2);
  44. $dni_gratis = $wynik2['dni_gratis'];
  45. mysql_query("INSERT INTO `oferty` ( `id` , `nazwa_obiektu` , `typ_dzialalnosci` , `kraj` , `region` , `wojewodztwo` , `miasto` , `opcje` , `opis_obiektu` , `ciekawe_miejsca` , `wszystkich_pokoi` , `wolnych_pokoi` , `cena_od` , `cena_do` , `wazna_dni` , `id_uzytkownika`, `telefon`, `email`, `www`, `aktywna`, `adres`, `lat`, `lng`, `zom` , `promowana`)
  46. VALUES (0 , '$nazwa_obiektu', $typ_dzialalnosci, $kraj, $region, $wojewodztwo, '$miasto', '$opcje', '$opis_obiektu', '$ciekawe_miejsca', $wszystkich_pokoi, $wolnych_pokoi, $cena_od, $cena_do, $dni_gratis, $id_uzytkownika, '$telefon', '$email', '$www', 1, '$adres', '$lat', '$lng', '$zom',0);");
  47. }
  48. }
  49. /* KONIEC: ZAPISZ DANE DO MYSQL, JEŚLI JESZCZE NIE ISTNIEJˇ TO STWÓRZ REKORD */


Ten post edytował jagwie 9.01.2011, 22:21:40
Go to the top of the page
+Quote Post
Zajec
post 20.01.2011, 19:23:39
Post #2





Grupa: Zarejestrowani
Postów: 1 086
Pomógł: 8
Dołączył: 10.12.2003

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


No... Przecież sam widzisz, że dla pewnych przypadków ustawiasz $aktywna = 0;, więc... po prostu został spełniony warunek? A potem poszedł UPDATE. Nie rozumiem chyba pytania.

Swoją drogą wyłącz szybko swój skrypt/serwis, przepisz go i dopiero uruchom. Jesteś w pełni podatny na SQL Injection, przecież wpisujesz w zapytanie wszystko co wysłał ci user!

Przemyśl sobie dobrze, co się stanie jak otrzymasz $nazwa_obiektu o wartości
Kod
'; DELETE * FROM oferty; '
Chyba, że korzystasz z jakichś magic quotes... ale to jest deprecated i nie należy raczej na tym polegać.
Go to the top of the page
+Quote Post
jagwie
post 23.01.2011, 09:53:24
Post #3





Grupa: Zarejestrowani
Postów: 71
Pomógł: 0
Dołączył: 6.01.2008

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


Tak dla pewnych przypadków lecz te przypadki nie występują więc $aktywna = 0;
I w tym właśnie problem że przypadek nie występuje a $aktywna = 0; się zeruje

A jeśli chodzi o
  1. '; DELETE * FROM oferty; '
to po wpisaniu otrzymasz zapis '; DELETE * FROM oferty; ' jako nazwę obiektu
Go to the top of the page
+Quote Post
Zajec
post 24.01.2011, 11:20:00
Post #4





Grupa: Zarejestrowani
Postów: 1 086
Pomógł: 8
Dołączył: 10.12.2003

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


Cytat(jagwie @ 23.01.2011, 09:53:24 ) *
Tak dla pewnych przypadków lecz te przypadki nie występują więc $aktywna = 0;
I w tym właśnie problem że przypadek nie występuje a $aktywna = 0; się zeruje
Możemy sobie jedynie wmawiać: "na pewno tak", "na pewno nie". Skąd wiesz o tych warunkach? Zrzuciłeś wszystkie z nich gdzieś do loga? Upewnij się 10 razy, bo innej możliowści nie widzę.


Cytat(jagwie @ 23.01.2011, 09:53:24 ) *
A jeśli chodzi o
  1. '; DELETE * FROM oferty; '
to po wpisaniu otrzymasz zapis '; DELETE * FROM oferty; ' jako nazwę obiektu
Porzytaj po prostu o SQL Injection.
Kod
UPDATE `oferty` SET `nazwa_obiektu` = '$nazwa_obiektu'

Kod
UPDATE `oferty` SET `nazwa_obiektu` = ''; DELETE * FROM oferty; ''

Kod
UPDATE `oferty` SET `nazwa_obiektu` = '';
DELETE * FROM oferty;
''
Go to the top of the page
+Quote Post
jagwie
post 25.01.2011, 20:21:07
Post #5





Grupa: Zarejestrowani
Postów: 71
Pomógł: 0
Dołączył: 6.01.2008

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


Zmienną $aktywna jest ustawiona 100 dni czyli oferta jest aktywna przypadek by wystąpił gdyby ilość dni była 0 dni lecz na razie cron jest wyłączony i 100 dni jest przy wszystkich ofertach.
Zauważyłem jedynie że jeśli występuje zerowanie zmiennej $aktywna to zawsze zmienne
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$zom = $_POST['zom'];
Są zerami i myślę że ma to coś wspólnego właśnie z zmienną $aktywna
A jeśli chodzi o SQL Injection.
To podpowiedz jeśli widzisz w tym skrypcie możliwość przesłania będe wdzięczny
  1. UPDATE `oferty` SET `nazwa_obiektu` = '$nazwa_obiektu'
  2.  
  3.  
  4. UPDATE `oferty` SET `nazwa_obiektu` = ''; DELETE * FROM oferty; ''
  5.  
  6.  
  7. UPDATE `oferty` SET `nazwa_obiektu` = '';
  8. DELETE * FROM oferty;
  9. ''
Go to the top of the page
+Quote Post
nospor
post 25.01.2011, 20:30:24
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Zauważyłem jedynie że jeśli występuje zerowanie zmiennej $aktywna to zawsze zmienne
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$zom = $_POST['zom'];
Są zerami i myślę że ma to coś wspólnego właśnie z zmienną $aktywna
No bez jaj....
Masz warunek:
if(!empty($nazwa_obiektu) && $typ_dzialalnosci!=0 && $kraj!=0 && $wojewodztwo!=0 && !empty($miasto) && !empty($telefon) && !empty($adres) && !empty($lat) && !empty($lng) && !empty($zom) && !empty($wszystkich_pokoi) && !empty($wolnych_pokoi) && !empty($cena_od) && !empty($cena_do))
$aktywna = 1;
else
$aktywna = 0;
ktory mowi, ze jesli wszystkie dane są niepuste to $aktywna = 1, a jesli choc jedna jest pusta to aktywna=0. I ty teraz z takim tekstem? No nie widzisz co piszesz?

Tak, jesli lat,lng lub zom jest zerem, to empty() da true czyli aktywna=0
0 to dla empty puste coś.
empty(0) da zawsze true. Może dlatego, ze myslales ze jest inaczej, to nie zauwazyles bledu

Problem nie ma zadnego związku z bazą danych - przenosze


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jagwie
post 25.01.2011, 21:00:29
Post #7





Grupa: Zarejestrowani
Postów: 71
Pomógł: 0
Dołączył: 6.01.2008

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


Dzięki za podpowiedz myślałem że empty(0) zostanie ztychzmiennych czyta jako liczba zero Bo to są współrzędne.
Dzięki wielki już zrozumiałem.
Pozdrawiam
Go to the top of the page
+Quote Post
ciekawskiii
post 26.01.2011, 04:27:48
Post #8





Grupa: Zarejestrowani
Postów: 467
Pomógł: 39
Dołączył: 7.11.2010
Skąd: Raz tu, raz tam

Ostrzeżenie: (30%)
XX---


Hehehe filtrowanie danych masz porazajace


--------------------
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: 3.07.2025 - 11:34