Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z POST poprzez ajax
Forum PHP.pl > Forum > XML, AJAX
misty
Czesc, mam nastepujacy problem: Mam sobie menu - kazda opcja w menu to link do kolejnej str. W definicji linka dla kazcej strony istnieje metoda:

  1. "onClick = \"unsetSelectedValuesFromPreviousPage();\""


Menu jest tworzone po stronie php. Ta metoda w js ma nastepujaca postac:

  1. function unsetSelectedValuesFromPreviousPage(){
  2.  
  3.  
  4. $.ajax({
  5. url : 'ajax_unset_value_from_session.php',
  6. cache : false,
  7. type : "POST",
  8. data : {
  9. unsetSelectedValues : 'true'
  10. }
  11. });
  12. }


Jej zadaniem jest wyczyszczenie tego co bylo w sesji w poprzedniej stronie. (Nie moge czyscic sesji za kazdym razem gdy wyswietlam str, poniewaz jak bede odswiezac albo submitem wykonywac akcje na tej samej str - to bede tracic rzeczy z sesji. A sa one mi potrzebne "per strona"). Czyszczenie sesji ma sie odbywac na zmiane zakladki (strony). Ok, w skrypcie ajax_unset.. mam tak:

  1.  
  2. <?php
  3.  
  4.  
  5. if ($_POST['unsetSelectedValues'] == 'true') {
  6.  
  7. $_SESSION['field_1'] = '';
  8. $_SESSION['field_2'] = '';
  9. $_SESSION['field_3'] = '';
  10. $_SESSION['field_4'] = '';
  11.  
  12.  
  13. }
  14.  
  15. ?>


I teraz to co najgorsze - to sie raz wykonuje, a raz nie! Tzn przy wejsciu na zakladke nowa wypisuje sobie var_dump te wartosci ($_SESSION['field_1'], $_SESSION['field_2']..) i raz sa '' czyli tak jak powinno byc, a raz na pare razy zawieraja poprzednie wartosci! Wiem ze to wrozenie z fusow, ale totalnie nie przychodzi mi do glowy co ja moge miec zle. Robie session_start bo tego wymaga to by to zadzialalo, myslalam ze moze tworzy sie przez to jaka druga sesja i no jakos nie zawsze wspolgra z ta 1sza. Probowalam niszczyc sesje na koncu skryptu ajax_unset.. ale wtedy mnie wylogowywuje.. Czy ktos z Was ma moze jakis pomysl?

pzdr,
misty
cudny
Ja mam, zrób tak:
  1. $.ajax({
  2. url : 'ajax_unset_value_from_session.php',
  3. cache : false,
  4. type : "POST",
  5. data : {unsetSelectedValues : 'true'},
  6. success: function(data) {
  7. console.log(data);
  8. }
  9. });
  10.  

i tak:
  1. <?php
  2.  
  3. echo 'ajax sie wykonal, ponizej powinno pojawic sie, ze ok:<br />'."\n";
  4. if ($_POST['unsetSelectedValues'] == 'true') {
  5. echo 'tak - jest post i czysci nam sesje';
  6. $_SESSION['field_1'] = '';
  7. $_SESSION['field_2'] = '';
  8. $_SESSION['field_3'] = '';
  9. $_SESSION['field_4'] = '';
  10.  
  11.  
  12. }
  13.  
  14. ?>


Po wykonaniu ajax'a zobacz co masz w konsoli
misty
Czesc, dzieki za pokazanie jak wypisywac na konsole, nie znalam tego. Niestety z tego co widze to bug musi lezec gdzies indziej. Za kazdym razem dostaje info ze kod sie wykonal, czyli ze ok. Wyglada na to ze:

1. Albo $_SESSION['field_1'] = '' nie dziala i trzyma poprzednia wartosc, ale to chyba niemozliwe by to nie dzialalo smile.gif
2. Albo cos mi zaraz tam wstawia wartosc.


pzdr

Wiesz co, potestowalam troche wiecej i teraz mialam przypadek kiedy sie ten ajax nie wywolal. Ale na konsoli nic sie nie pojawilo.. wiec tropu brak :/
cudny
Podaj pełny kod "onClick = \"unsetSelectedValuesFromPreviousPage();\""

Do tego powiedz czy przypadkiem nie generujesz dynamicznie tych zdarzeń, bo jeśli tak to musisz użyć jQuery.live();
misty
Wiesz co, ja to menu mam tworzone po str php, poniewaz na podstawie typow i podtypow (co jest trzymane w bazie) to jest budowane. Czyli jest tam for i pare warunkow, ale dla kazdego elementu menu jest dodawane:

  1. $onClickPage = "onClick = \"unsetSelectedValuesFromPreviousPage();\"";
  2.  
  3. $navmenu .= "\n<li ".$style." ".$name." ".$id."><a href=\"".$page['full_page_name']."\" ".$onMouseDown."
  4. onmouseover=\"Tip('".$page['description']."');\" onmouseout=\"UnTip();\" ".$onClickPage.">".$prefix.$page['name']."</a></li>";
  5.  


w onClickPage jest ta metoda. A z tym live to o co chodzi?

A jesli chodzi o pelny kod tej metody, to podawalam w 1szym poscie:

  1. function unsetSelectedValuesFromPreviousPage(){
  2.  
  3.  
  4. $.ajax({
  5. url : 'ajax_unset_value_from_session.php',
  6. cache : false,
  7. type : "POST",
  8. data : {
  9. unsetSelectedValues : 'true'
  10. }
  11. });
  12. }
cudny
No to w takim wypadku błędem jest to, że jakaś zmienna może być nieprawidłowo generowana i wywala ci to on click (tak mi się wydaje).
Poczytaj: http://api.jquery.com/live/

Wywal w php to $onClickPage i na stronie gdzie znajduje się ten link daj na samym dole w sekcji body (tylko nadaj temu odnośnikowi klasę: unset - <a href="xxx" class="unset">...</a>):

<script>
$(a.unset).live('click',function() {
unsetSelectedValuesFromPreviousPage();
});
</script>

misty
Hej, ten kod:
Kod
$(a.unset).live('click',function() {
unsetSelectedValuesFromPreviousPage();
});


To mi wywalal w konsoli ze"a" jest undefinied, wiec zmienilam na:

Kod
$("a.unset").live('click',function() {
unsetSelectedValuesFromPreviousPage();
});


chociaz nie wiem czy to jest poprawnie - tak czy siak nie dziala :/ juz mam powoli dosc, totalnie nie kapuje co tu sie dzieje. Moze powinnam zmienic podejscie i jako str php czyscic te wartosci z sesji zamiast metody onClick i ajax'a..
cudny
Dobrze zrobiłeś, po prostu pisałem z palca, w normalnych warunkach poprawiło by mnie moje IDE tongue.gif

Musisz poczytać, w jaki sposób korzystać z jQuery, bo w ogóle go nie wykorzystujesz !
Nie generuj eventów dynamicznie w php - po co ? Od tego właśnie masz (moim zdaniem) najlepszy framework czyli jQuery smile.gif

Nie napisałeś jednak, co się dzieje w chwili, gdy nie czyści Ci sesji - czy ajax w ogóle się wykonuje ? Czy konsola wyrzuca cokolwiek ? Czy nic się nie dzieje po prostu ?
Czy ten link zmienia się w chwili kliknięcia w niego ?
Tak na prawdę nic nie wiem o twoim skrypcie smile.gif w ciemno nie pomogę niestety.

Porponuję mniej php więcej javascript (jQuery) i nie korzystanie z eventów (onClick, czy onMouseDown) wewnątrz tagów - lepiej tak jak Ci pokazałem, użyj jQuery - mniejsza możliwość pomyłki i wszystko na patelni smile.gif


Acha - zrób sobie jeszcze jeden test - wywal z tego linka wszytko oprócz onClick i zobacz czy wtedy wszytko jest ok, jeśli tak to znaczy, że inne eventy mają nieprawidłową składnie. Może gdzieś nie zamykasz " czy otwierasz ' i nie zamykasz go - musisz przepatrzeć wszystko
misty
Jestem Ona a nie On smile.gif

jesli chodzi o ajax'a - to wlasnie kiedy sie nie wykonuje to konsola nie rzuca mi zupelnie nic (wykorzystalam by to sprawdzic "always" zamiast "sucess").
Chyba sie po prostu z tym poddaje i na prawde zrobie to po str php tymbardziej ze mam odpowiednie miejsce na wywolanie "czyszczacej metody" - zadziala dla kazdej zakladki. A tutaj po prostu nie wiadomo co sie dzieje. Raz sie ten ajax wykonuje i jest ok, raz sie wykonuje ale nie jest ok (dane nie sa czyszczone albo cos je tam znow wrzuca), innym razem w ogole sie nie wykonuje ale konsola nic nie rzuca. Za duzo juz czasu mi na tym zeszlo. Odpuszczam ten sposob, ale dzieki za wszystkie rady i probe pomocy.

pzdr,
misty
cudny
To znaczy, że masz błędy w składni i event się nie wykonuje. Poczytaj o events jQuery i zrób to poprawnie, a będziesz używać ajax'a z uśmiechem wink.gif
A co do ON a nie ONA to z przyzwyczajenia wink.gif sorki tongue.gif
mortus
Problem w tym, że żadanie AJAX-owe po prostu nie zdąży się wykonać zanim nastąpi przejście do określonej strony. Tzn. kliknięcie w odnośnik uruchamia AJAX-owego requesta, ale powoduje również prawie natychmiastowe przejście do wybranej strony. W momencie przejścia do tej wybranej strony żadanie AJAX-owe zostaje przerwane. Rozwiązaniem może być zmuszenie AJAX-a do pracy synchronicznej (opcja async). Może to jednak spowodować skutki uboczne (przejście z jednej strony na inną może trwać zbyt długo i użytkownik nie będzie mógł nic w tym czasie zrobić).
Nie znam założeń całego systemu, ale używanie AJAX-a tylko do czyszczenia sesji (i to jeszcze tuż przed opuszczeniem danej strony) to chyba lekkie nadużycie i być może trzeba się zastanowić nad innym rowiązaniem.
celbarowicz
To jeden ze sposobów w jaki wykorzystyję JQ i Ajax.
  1. function notatnik_szukaj2(){ $(document).ready(function(){ var zm1=$('#sel_szukaj_k').val();
  2. var zm2=$('#rok_szukaj').val();
  3. var zm3=$('#miesiac_szukaj').val();
  4. var zm4=$('#dzien_szukaj').val();
  5. var data = 'a1='+zm1+'&'+'a2='+zm2+'&'+'a3='+zm3+'&'+'a4='+zm4;
  6.  
  7.  
  8.  
  9. $.ajax({type:"POST",
  10. url:"notatnik_szukaj2x.php",
  11. data: data,
  12. success: function(){ $('#okno_konsultanta1').load('notatnik_szukaj2.php');
  13. }
  14. });
  15. });
  16.  
  17. }
  18.  
  19.  

notatnik_szukaj2x.php
  1. <?php
  2. $_SESSION['sel_szukaj_k']=$_POST['a1'];
  3. $_SESSION['rok_szukaj']=$_POST['a2'];
  4. $_SESSION['miesiac_szukaj']=$_POST['a3'];
  5. $_SESSION['dzien_szukaj']=$_POST['a4'];
  6. ?>


notatnik_szukaj2.php
  1.  
  2. $u=$_SESSION['sel_szukaj_k'];
  3. $r=$_SESSION['rok_szukaj'];
  4. $m=$_SESSION['miesiac_szukaj'];
  5. $d=$_SESSION['dzien_szukaj'];
  6. $_SESSION['wybrana_data']=$r1=$r.'-'.$m.'-'.$d;
  7. $rw=strtotime($r1)+1;
  8.  
  9. $cp=date("Y-m-d H:i:s",strtotime($r1));
  10.  
  11. $r2=strtotime($r1)+24*60*60-1;
  12. $ck=date("Y-m-d H:i:s",$r2);
  13.  
  14. $pcz_dnia = strtotime($cp);
  15. $koniec_dnia = strtotime(($ck));
  16. require_once ('do_bazy.php');
  17.  
  18. $sql="SELECT * FROM notes WHERE uzytkownik_notes='$u' AND'$pcz_dnia'<poczatek_notes AND poczatek_notes<'$koniec_dnia' ORDER BY poczatek_notes asc";
  19. $result=mysql_query($sql) or die(mysql_error());
  20.  
  21. $n = mysql_num_rows($result);
  22.  
  23. if(mysql_num_rows($result)==0){echo 'WYBRANA DATA='.date("Y-m-d",strtotime($r1));
  24. echo'<br>';
  25. echo 'wolne od'.date("H:i:s",$rw).'do godziny'.date("H:i:s",$r2);
  26. echo '<br>';
  27. require_once "pierwszy_wpis.php";
  28.  
  29.  
  30. }else{
  31. echo 'WYBRANA DATA='.date("Y-m-d",strtotime($r1));
  32. echo'<br>';
  33. require_once "druk.php";
  34. }
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41. ?>

Może to jest kiepski sposób ,ale działa.
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.