Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][PHP]podwójne wpisy do bazy
Forum PHP.pl > Forum > Przedszkole
neo1986kk
Witam, irytuje mnie pewna rzecz na mojej stronce, zrobilem sobie ajaxowy system komentarzy i po kliknieciu przesyla ajaxem na taki kod:

  1. //srawdz czy juz jest
  2. $sql=mysql_query("select id from komentarze where komentarz='$komentarz' and data='$date'");
  3. $numsql=mysql_num_rows($sql);
  4. if($numsql==0)
  5. {
  6. //jesli nie ma to zapisuje
  7. $sql=mysql_query("insert into komentarze (`id`,`komentarz`) values ('','$komentarz');
  8. }
  9. else exit;
  10.  


mimo że sprawdza czy juz istnieje, czasami dzieje się tak, że za jednym razem dodaje 2 te same komentarze, nawet się nie zmienia czas o sekundę.
Czy można temu jakoś zapobiec?
Wydaje mi się że tu problem jest po stronie ajaxa a nie php, ale nawet jesli wysyla 2 razy to za pierwszym razem już istnieje
wiiir
przedebuguj dobrze kod... zobacz czy wysylasz jednego ajaxa np firebugiem, zobacz czy nie masz jakies petli... itd o ciezko z gory okreslic co nie nie tak
Fifi209
Cytat(neo1986kk @ 13.06.2011, 21:46:27 ) *
Wydaje mi się że tu problem jest po stronie ajaxa a nie php, ale nawet jesli wysyla 2 razy to za pierwszym razem już istnieje

Dlaczego więc nie dałeś formularza i kodu ajax'a?
Co do samego PHP pokaż więcej kodu.
neo1986kk
kod php jest cały on ma tylko dodawać do bazy.
a ajax to jquery

  1. $('#dodajkomentarz').live("click",function(){
  2. $.ajax({
  3. 'url':'dodajkoment.php',
  4. 'data': {"param": komentarz},
  5. 'type':'POST',
  6.  
  7. 'success': function(msg) {
  8. $('#komentarze').html(msg);
  9. },
  10. 'error' :function(){alert('erroe');}
  11. })
  12. });



co do php to tylko pobieram dane i ustawiam date na początku

  1. $date=date('Y-m-d H:i:s');
  2. $komentarz=$_POST['komentarz'];
Fifi209
Podepnij tam zamiast ajax'a alert(1) i zobacz ile razy się wykona.
shikamaru88
Jak ktoś ma syndrom lewego przycisku myszy to po jakiejś serii wielokliku uda mu się w czas zanim twój skrypt się zdąży ogarnąć.( chociażby połączenie z bazą danych). Możesz zrobić w sumie naiwne, ale działające zabezpieczenie w postaci wyłączenie przycisku do momentu odpowiedzi z serwera. Czyli:

[JAVASCRIPT] pobierz, plaintext
  1. $('#dodajkomentarz').live("click",function(){
  2. if(!$(this).hasClass('clicked')){ //sprawdzasz czy przycisk ma klase clicked zabezpieczenie przed cisnieciem myszy
  3. $(this).addClass('clicked'); // jesli nie mial to mu ja dajesz
  4. var obj = $(this);
  5. $.ajax({
  6. url:'dodajkoment.php',
  7. data: {"param": komentarz},
  8. type:'POST',
  9.  
  10. success: function(msg) {
  11. $('#komentarze').html(msg);
  12. obj.removeClass('clicked'); //po wykonaniu zapytania zdejmujesz klase i mozna ponownie klikac
  13. },
  14. error :function(){alert('erroe');}
  15. });
  16. }
  17. });
  18.  
[JAVASCRIPT] pobierz, plaintext


Takie proste ostudzenie nadpobudliwych biggrin.gif
neo1986kk
no w sumie mogę to niby tak zabezpieczyć, tylko dziwi mnie to że dodają się 2 komenty a nawet sekundy róznicy nie ma, srawdzę jeszcze z tym alertem, ale mi się tak raczej nie zdarza, tylko czasami poprostu się dodają 2 nie cały czas.

nie no teraz to już jest przeginka, jedno kliknięcie w button:

  1.  
  2. $('button.target').live("click",function(){
  3. $id=$(this).attr('id'),
  4. $.ajax({
  5. 'url':'inc/pages.php',
  6. 'data': {"id": $id},
  7. 'type': 'POST',
  8. 'success': function(msg) {
  9. $('.container').html(msg);
  10. }
  11. })
  12. });
  13.  


wyskakuje mi średnio od 20 do 30 razy w firebugu. ustawilem alert na success i 20 razy wyskoczyl mi alert, cala aplikacja dziala poprawnie, tylko ten jeden button nie, może być tego przyczyną że jest to już kolejne wywołanie ajaxowe? czyli

jest sobie strona główna
wywoluje następną ajaxem
i z tej wywołanej ajaxem chce jeszcze wywołać następną tym buttonem.

Edit: zauważyłem , że po odświeżeniu strony jak kliknę poraz pierwszy to idzie raz, jeśli kliknę w to ponownie to idzie już 3 razy
później coraz więcej i więcej
Sephirus
Słuchaj a może to się jakoś zapętliło? Może ładujesz tym ajaxem stronę, która w sobie też ma link do tego skryptu i on to zdarzenie przypisuje jeszcze raz itd...?
Przez co za każdym razem miałbyś coraz więcej wysyłań po jednym kliknięciu im dłużej byś klikał ;P

Zupełnie nie używam żadnych frameworków pod JS ale może spróbuj tak:

[JAVASCRIPT] pobierz, plaintext
  1. $('button.target').onclick=function(){
  2. $id=$(this).attr('id'),
  3. $.ajax({
  4. 'url':'inc/pages.php',
  5. 'data': {"id": $id},
  6. 'type': 'POST',
  7. 'success': function(msg) {
  8. $('.container').html(msg);
  9. }
  10. })
  11. };
[JAVASCRIPT] pobierz, plaintext


Kod powyżej zapewnić Ci powinien nadpisywanie eventu onclick, nie wiem czy metoda live czasem nie dodaje kolejnych nie usuwając starych (czyli działa na zasadzie addEventListener)

HTH wink.gif

Poza tematem - na przyszłość zapoznaj się też z unikalnymi kluczami - jakbyś to tutaj zastosował na polu id i komentarz to zamiast tego całego kodu wystarczył by sam insert bo nie duplikowałby wartości, kwestie czy dodało do bazy czy nie wyciągasz z mysql_insert_id() wink.gif
neo1986kk
masz rację , metoda live dziala jak addEventListener, co kliknięcie miałem o 1 wywowałanie więcej, ale bylem pewny że bez live to mi w ogole nie bedzie działało, jednak wszystko śmiga jak należy, dzięki wielkie... pozdrawiam.
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.