Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Opóźniona zmiana danych?
Forum PHP.pl > Forum > Po stronie przeglądarki
Vasquez21
Witam wszystkich czytających.

Tytułem wstępu... od mniej więcej 4 lat używałem bez problemu pewnego skryptu w swoim sklepiku do zwiększania i zmniejszania liczby produktów.
Ostatnio okazało się, że skrypt zachowuje się "dziwnie" na nowym laptopie.

O samym skrypcie należy chyba tylko powiedzieć, że nowy produkt dodaje się na zasadzie formularza, po zaakceptowaniu produkt pojawia się w bazie i liczbę produktów można zmieniać poprzez dwa przyciski (+ i -), które analogicznie zwiększają i zmniejszają liczbę produktów w bazie dzięki wykorzystaniu technologii ajax (po kliknięciu liczba zmniejsza/zwiększa się o 1).
W pewnym momencie jak dodane było już 5 nowych produktów i w sumie przez przypadek sprawdziliśmy liczbę produktów jednego z nowo wprowadzonych wyświetliło jakąś dziwną liczbę, jeśli dobrze pamiętam 4 (zamiast wprowadzonych 2). Co jednak dziwniejsza sprawdzając pozostałe wpisy okazało się, że pozostałe wpisy również mają dziwne wartości jak np. 3, -1, -2 itp. Dodatkowo jedna zmiana np. dodanie poprzez przycisk produktu powodowało, że w innych produktach również zachodziły zmiany, lecz zawsze działo się to po jakimś czasie (z reguły po kilkudziesięciu sekundach). Wszystko obserwowałem z drugiego komputera z poziomy mysqladmina, żeby przypadkiem nie generować żadnego ruchu na stronie, chciałem się upewnić, że nie jest to spowodowane przejściami/odświeżeniem strony czy czymś takim.

Zrobiliśmy pseudo eksperyment. Wyzerowaliśmy jeden z produktów bezpośrednio w bazie. Po czym dodaliśmy 1 produkt, a następnie po kilkunastu sekundach o kolejne 5. W sumie do 6. Następnie obserwowałem tylko zachowanie bazy na drugim komputerze odświeżając zawartość tego produktu. Przez jakiś czas się nic nie działo, po czym produkt wskoczył na 7... a następnie po kilkunastu sekundach na 12. Wygląda to tak jakby poza tym zwiększeniem które miało miejsce bezpośrednio po kliknięciu było wysyłane jakieś drugie opóźnione żądanie... które odpala się po jakimś czasie.

Przez jakiś czas myślałem, że coś się dzieje z bazą, ale przetestowałem to na swoim drugim komputerku i wszystko działa sprawnie, tak samo zmiany bezpośrednio z poziomy mysqladmina nie powodują, żadnych dziwnych zachowań.

Na nowym laptopie zainstalowany jest Windows 7.
Sprawdzaliśmy zachowanie na przeglądarkach IE, Firefox i Chrome. Na wszystkich to samo.

Będę bardzo wdzięczny za wszystkie uwagi, sugestie i podpowiedzi... Bo naprawdę nie bardzo wiem jak sobie poradzić z tym problemem.
szczeku
z twojego opisu wynika, że to coś z Ajax'em.

ważne pytanie to czy za każdym razem tak się dzieje?

bez kodu ciężko coś stwierdzić, umieść może przynajmniej sam kod ajax odpowiedzialny za łączenie się z PHP( chyba zę jakoś inaczej to robisz ), no i moze troche php który zwiększa/zmiejsza ilość produktów w bazie.
Vasquez21
dzięki za zainteresowanie.

fragment kodu w php odpowiedzialny za dodawanie i usuwanie:
  1. <div class="incDec">
  2. <div class="leftHint"><a href="#" onclick="addProduct(<?= $produkt['ID_produktu']; ?>); return false" ><img src="images/add.png" border="0" /></a></div>
  3. <div class="txtHint" id="txtHint<?= $produkt['ID_produktu']; ?>"><?= $produkt['Liczba_sztuk'];?></div>
  4. <div class="rightHint"><a href="#" onclick="rmvProduct(<?= $produkt['ID_produktu']; ?>); return false" ><img src="images/delete.png" border="0" /></a></div>
  5. </div>

fragmenty pliczku ajax...
  1. var xmlHttp
  2. var idWybranego
  3. function addProduct(idproduktu)
  4. {
  5. xmlHttp=GetXmlHttpObject()
  6. if (xmlHttp==null)
  7. {
  8. alert ("Browser does not support HTTP Request")
  9. return
  10. }
  11. idWybranego="txtHint"+idproduktu
  12. var url="ajax/ajaxAddProduct.php"
  13. url=url+"?id_p="+idproduktu
  14. url=url+"&sid="+Math.random()
  15. xmlHttp.onreadystatechange=stateChanged
  16. xmlHttp.open("GET",url,true)
  17. xmlHttp.send(null)
  18. }
  19.  
  20. function rmvProduct(idproduktu)
  21. {
  22. xmlHttp=GetXmlHttpObject()
  23. if (xmlHttp==null)
  24. {
  25. alert ("Browser does not support HTTP Request")
  26. return
  27. }
  28. idWybranego="txtHint"+idproduktu
  29. var url="ajax/ajaxRmvProduct.php"
  30. url=url+"?id_p="+idproduktu
  31. url=url+"&sid="+Math.random()
  32. xmlHttp.onreadystatechange=stateChanged
  33. xmlHttp.open("GET",url,true)
  34. xmlHttp.send(null)
  35. }
  36.  
  37. function stateChanged()
  38. {
  39. if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
  40. {
  41. document.getElementById(idWybranego).innerHTML=xmlHttp.responseText
  42. }
  43. }
  44.  
  45. function GetXmlHttpObject()
  46. {
  47. var xmlHttp=null;
  48. try
  49. {
  50. // Firefox, Opera 8.0+, Safari
  51. xmlHttp=new XMLHttpRequest();
  52. }
  53. catch (e)
  54. {
  55. //Internet Explorer
  56. try
  57. {
  58. xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  59. }
  60. catch (e)
  61. {
  62. xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  63. }
  64. }
  65. return xmlHttp;
  66. }


i na koniec pliczek ajaxAddProduct.php wywoływany z ajaxa:
  1. <?php include "../../sprses.php"; ?>
  2. <?php include "../../naglowek.php"; ?>
  3. <?php include "../../connect.php"; ?>
  4.  
  5. <?php
  6. if (isset($_GET["id_p"]))
  7. {
  8. $produkt = mysql_fetch_array(mysql_query("SELECT Liczba_sztuk FROM Produkty WHERE ID_produktu = '".$_GET["id_p"]."' ")) or die("Blad");
  9. $nowaLiczba = $produkt['Liczba_sztuk'] + 1;
  10. mysql_query("UPDATE Produkty SET Liczba_sztuk = '".$nowaLiczba."' WHERE ID_produktu = '".$_GET["id_p"]."' ") or die("Blad2");
  11. echo $nowaLiczba;
  12. }
  13. ?>


pliczek do usuwania jest analogiczny
thek
Pozostaje jeszcze jedno rozwiązanie... Monitorujesz ruch między przeglądarką, a serwerami. Przykładowe możliwości:

a) TamperData w Fx,
cool.gif serwer proxy monitorujący żądania między maszynami ( WebScarab, Burp Suite ) - przydaje się także do testów wink.gif

Zwłaszcza to drugie rozwiązanie jest ciekawe. Dowiesz się ciekawych rzeczy o aplikacji i ewentualnych furtkach bezpieczeństwa.
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.