• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed PHP - raz działa a raz nie

Object Storage Arubacloud
+1 głos
410 wizyt
pytanie zadane 8 lutego 2018 w PHP przez Patryk L Bywalec (2,000 p.)
zamknięte 9 lutego 2018 przez Patryk L

Witam, mam taki dziwny a jednocześnie wkurzający problem. Otóż stworzyłem skrypt w PHP, który będzie dodawał itemy do eq. W zależności od tego czy już jest dany item w eq czy jeszcze go nie ma, skrypt dodaje pole do tabeli lub aktualizuje ilość posiadanego itemu (Nie umiem tłumaczyć). Skrypt czasem działa, a czasem nie. Tak jakby miał zły humor ;). Nie wiem czy pojawia się błąd, ponieważ przesyłam dane przez AJAX i nie widzę docelowej strony. Spróbujecie powiedzieć o co chodzi? Mam dość

include("db.php");
    $nazwa = $_POST['item'];
    $ilosc = $_POST['ilosc'];
    $pyt_id = $baza->query("SELECT * FROM itemy WHERE nazwa='$nazwa'");
    $row_id = $pyt_id->fetch_assoc();
    $item_id = $row_id['id'];
    $wytrzymalosc = $row_id['wytrzymalosc'];
    $user = 1;
    $pyt_ile = $baza->query("SELECT * FROM eq WHERE p_id='$user' AND item_id='$item_id'");
    $row_ile = $pyt_ile->fetch_assoc();
    $ilosc+=$row_ile['ilosc'];
    if($pyt_ile->num_rows==0) $baza->query("INSERT INTO eq VALUES('NULL','$user','$item_id','$ilosc','$wytrzymalosc')");
    else $baza->query("UPDATE eq SET `ilosc`='$ilosc' WHERE `item_id`='$item_id' AND `p_id`='$user'");

 

Myślę że kod jest zrozumiały

 

EDIT: zrobiłem test i wysyłałem dane w czystym PHP więc to musi być wina js i AJAX.
Tu jest kawałek kodu js:
 

 $.ajax({
            type:"POST",
            url:"config/dodaj_item.php",
            data: {
                item:item,
                ilosc:ilosc
            },
        });

 

Widzicie jakiś głupi błąd?

komentarz zamknięcia: Zrobiłem tak jak poradził mi Artek czyli nauczyłem się obietnic i wszystko działa. Dzięki wszystkim :D
komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)

Dodałem

error: function(error){

alert(error);

},

success: function(){

alert("Ok")

}

I wyświetla się "Ok" :x

3 odpowiedzi

0 głosów
odpowiedź 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
Na potrzeby wyśledzenia błędu można np. pominąć AJAX i "ręcznie" wstawić dane wejściowe.
komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Tak zrobiłem i wstawiałem dane za pomocą formularza $_POST i działało wszystko dobrze.
Myślę, że to komunikacja ajax-php jest winna
komentarz 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)

Ja bym dokładnie sprawdził dane w kodzie JS przed wysłaniem 

data: {
               item:item,
               ilosc:ilosc
           }

Wątpię aby dane zmieniały się bezpośrednio w podróży AJAX'owej. Może jakieś niechciane spacje albo coś w tym stylu. Sprawdź bardzo dokładnie w JS dane przed wysłaniem. Np. niech wyświetli długość łańcucha i sam łańcuch. Ten kod JS co wkleiłeś to cały kod JS jaki używasz?

komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)

Niecały ale dam te najważniejsze:

var item = $(this).attr("value");
        var ilosc = $("#wynik").attr("ilosc");
        $("#pole_wynik").html('');
        $.ajax({
            type:"GET",
            url:"config/dodaj_item.php",
            data: {
                item:item
                //Tutaj usunąłem ilosc bo myślałem że coś pomoże ale nic to nie dało :/
            }, 
//            error: function(blad) {
//                    alert( "Wystąpił błąd");
//                    console.log(blad);
//            },
//            success: function()
//            {
//                alert("ok");
//            }
        });

 

komentarz 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
No,a sprawdziłeś co dokładnie kryje się w zmiennej "item"? Sprawdź dokładnie co tam jest i przy okazji w razie czego niech wyświetli długość łańcucha
komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Sprawdziłem. Wszystko dobrze pokazuje ;)
0 głosów
odpowiedź 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Ogólnie są itemy, które się stackują po 16 sztuk a są takie które są pojedynczo i te które się NIE stakują działają za każdym razem. Problem pojawia się, gdy się stackują i dane muszą się zaktualizować
1
komentarz 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
No to wydaje mi się, że (jeśli dobrze Cię zrozumiałem) , że problem polega na tym, że AJAX'ujesz za szybko - walisz kolejny request zanim ten poprzedni zdąży się wykonać. Nie jestem aż tak bardzo obcykany w temacie ale według mnie to co Ty robisz dobrze byłoby wykonać w oparciu o obietnice JS'owe
komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Problem polega na czymś innym (tak mi się wydaje). Opiszę to w innym komentarzu żeby więcej osób to zobaczyło ;)
komentarz 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
Hmm....Wątpię, no ale próbuj :)

EDIT : Czy wiesz, że żądania AJAX są wykonywane w sposób asynchroniczny?
komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Co to znaczy?
1
komentarz 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)

To co napisałem w komentarzu do posta poniżej. 

JS nie czeka na to aż kod w PHP się wykona tylko ciśnie dalej - asynchroniczność.

JS ma w nosie to czy dane już zostały dodane do bazy czy też nie. On tylko wysyła request do serwera i nie zatrzymuje się tylko dalej wykonuje kod. Request jest tak jakby wykonywany "w tle" - oczywiście jak serwer zakończy pracę to JS poinformuje Cię o tym, ale w międzyczasie zdąży już wykonać dalszy kod(w tym wypadku wykona kolejne żądania). Wydaje mi się, że obietnice byłyby tu najlepsze. 

komentarz 9 lutego 2018 przez Patryk L Bywalec (2,000 p.)
o co chodzi z tymi obietnicami?
komentarz 9 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
No wyobraź sobie, że ja też je zgłębiam właśnie. No a poza tym wystarczy wygooglować :p
komentarz 9 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Dzięki poczytam i jutro dam znać jak mi poszło ;)
0 głosów
odpowiedź 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Po wysłaniu na ekranie wyświetla się na ekranie id_przedmiotu oraz ilosc jaka powinna być po zaktualizowaniu (dane z PHP) i dane te są dobre ale niestety nie trafiają do bazy
komentarz 8 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
No pewnie dlatego, że nie zdążą - kolejny AJAX request zmiata ten aktualny. Pamiętaj, że JS nie czeka na to aż kod w PHP się wykona tylko ciśnie dalej - asynchroniczność.
komentarz 8 lutego 2018 przez Patryk L Bywalec (2,000 p.)
Dowiedziałem się kolejnej przydatnej rzeczy ;). Dzięki. Zauważyłem też, że dane przez AJAX przesyłane są dobrze. Trafiają do tego else w PHP (Wiem bo dałem tam echo, które wyświetla id itemu i ilość) ale do bazy nie trafia :(. "Złośliwość rzeczy martwych"
komentarz 9 lutego 2018 przez Artek Stary wyjadacz (11,800 p.)
Ja też się kiedyś na to nadziałem. Tak to jest niestety jak się używa języka a nie zna szczegółów. Bynajmniej masz nauczkę i będziesz pamiętał :p

Podobne pytania

0 głosów
3 odpowiedzi 245 wizyt
pytanie zadane 23 września 2018 w Sprzęt komputerowy przez komuna55 Nowicjusz (160 p.)
+1 głos
1 odpowiedź 176 wizyt
pytanie zadane 27 marca 2022 w PHP przez jamie80 Początkujący (320 p.)
0 głosów
1 odpowiedź 670 wizyt
pytanie zadane 3 kwietnia 2017 w PHP przez Gaspar Nowicjusz (240 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...