Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] [php]w polu zamiast 1 czasami zapisuje 0
Forum PHP.pl > Forum > Przedszkole
jagwie
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 */
Zajec
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ć.
jagwie
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
Zajec
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;
''
jagwie
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. ''
nospor
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
jagwie
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
ciekawskiii
Hehehe filtrowanie danych masz porazajace
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.