Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP][jQuery]Problem z przesyłaniem danych z formularza
Forum PHP.pl > Forum > Przedszkole
seeker
Chcę przesyłać dane z formularza, bez potrzeby odświerzania strony. Zrobiłem to, korzystając z funkcji jQuery.load(), niestety to nie do końca, to co chiałem, ponieważ funkcja ta ładuje zawartość jakiejś strony, zamiast tylko przesłać wartości z formularza. Czytając dokumentację jQuery znalazłem dwie funkcje .ajax() i .post(), niestety za nic nie chce mi działać. Albo działa, tylko efektów nie widać.

Tutaj podaję kod pliku "index.php"
  1. <?php include("skrypt.php"); ?>
  2. <script type="text/javascript" src="javascript/jquery-1.5.2.js"></script>
  3. <script type="text/javascript">
  4. $(document).ready(function(){
  5. $.post('index.php', {poziom: 10});
  6. });
  7.  
  8. $(document).ready(function(){
  9. $('#przycisk1').click(function(){
  10. $.post('index.php', $('#formularz').serializeArray());
  11. });
  12. });
  13. </script>
  14.  
  15. <div id="strona">
  16. <?php wypelnienie($_POST['poziom']) ?>
  17.  
  18. <form id="formularz">
  19. <input type="text" name="poziom" />
  20. <input type="button" name="przycisk1" value="Wyślij" />
  21. </form>
  22. </div>

Bardzo prosty kod, żeby nie zaśmiecać. A więc do rzeczy. Problem polega na tym, że po załadowaniu strony, serwer PHP wyrzuca błąd, iż nie ma pojęcia, co to takiego jest "poziom". Informację tę powinien przesłać mi ten fragment kodu
  1. $(document).ready(function(){
  2. $.post('index.php', {poziom: 10});
  3. });

A więc zaraz po załadowaniu DOM, powinien metodą POST przesłać do pliku index.php (a więc siebie samego) informację, że "poziom" w tablicy POST ma wartość 10. Jednak tego nie robi, próbowałem to samo zrobić funkcją .ajax(), ale efekt ten sam. Wie ktoś, co jest nie tak? A może po prostu nie można przesyłać danych tymi funkcjami do tego samego pliku? Gdy stosowało się zwykły formularz HTML i w action podało nazwę tego samego pliku, to to działało, ale może tu jest inaczej?
Sprawa tak samo ma się przy drugiej funkcji, a więc gdy wciskam przycisk, serwer PHP nadal twierdzi, że nie ma pojęcia, co to jest "poziom".
nospor
Cytat
Jednak tego nie robi,
Skad wiesz ze nie robi? W żaden sposób nie odbierasz informacji zwrotnej od ajaxa więc skad wiesz że nie działa?
seeker
Super. Załóżmy, że działa, że jest okej. Dlaczego w takim razie serwer PHP wciąż uparcie twierdzi, że nie wie, co to jest "poziom"? Skoro tamten kod działa, to powinien przesłać informację, że "poziom" ma wartość 10 i wszystko powinno pięknie chodzić, tak jednak nie jest.
nospor
Pytam się ponownie: skąd wiesz, że index.php tego nie wie? W żaden sposób nie odbierasz informacji zwrotnej więc skąd to wiesz?
seeker
A co robi funkcja wypełnienie? Pobiera wartość tego parametru. Tylko, że wtedy dostajemy błąd, że taki parametr nie został zdefioniowany. Bez obrazy, ale ja dopiero raczkuję, więc nie mów do mnie zagadkami, tylko postaraj się wyjaśnić łopatologicznie.
Javascript ustawia wartość parametru poziom na 10, następnie skrypt PHP chce pobrać tę wartość, ale okazuje się, że nie może, bo, jak twierdzi, nie istnieje. Dlatego napisałem, że index.php tego nie wie, bo sam mi to mówi. Ale ja tu alfą i omegą nie jestem, może wie, ale nie chce mi powiedzieć. Dlatego pytam się tutaj ludzi mądrzejszych ode mnie, żeby pomogli.

Żebyś mi po raz trzeci nie pisał tego samego, ustawiłem jako trzeci parametr "alert('Mam to gdzieś')" i podczas odświerzania strony wyskakuje okienko z tym napisem. Tak samo podczas klikania w przycisk. A więc funkcja twierdzi, że wszystko jest okej, ale efektu jakoś nie widać.
nospor
Po prostu nie rozumiesz co to jest php, kiedy się wykonuje oraz co to jest ajax i jak działa.

Jak odpalasz index.php to nie ma twojego parametry w post. Nie ma, bo ty go wysyłasz do index.php dopiero później, już po wykonaniu się strony. Wtedy index.php odpala się jakby po raz drugi ale ty to musisz odebrać już w jQuery.

Zapewne ktoś inny wyjaśni ci to lepiej.
seeker
Innymi słowy. Wpierw wykona się PHP, dopiero później Javascript?
No dobrze. Najpierw załadował mi się PHP, potem javascript przesłał wartość, czyli teraz po odświerzeniu strony, powinno być okej, bo wartość już została przesłana, ale nadal ten sam błąd.
To oczywiste, że nie rozumiem, dopiero się uczę. Czytam dokumentacje i tutoriale, starając się pojąć to. Obecny kod też nie wyciągnąłem z głowy. Napisałem go bazując na informacjach z różnych tutoriali i dokumentacji, pewnie są tam błędy (jakby ich nie było, to by działało), ale o to właśnie się pytam, by ktoś mi je wskazał i wyjaśnił, co robię źle.
mat-bi
Wiesz, że HTTP to protokół bezstanowy?

Jezeli przesłałeś te rzeczy, to one nigdzie nie leżą(no chyba, że używasz cache,a le to inna sprawa), więc przy odświeżeniu serwer NIE MA tych danych.
nospor
Cytat
Innymi słowy. Wpierw wykona się PHP, dopiero później Javascript?
Tak. php wykona się po stronie serwera, js już u klienta w przeglądarce

Cytat
czyli teraz po odświerzeniu strony, powinno być okej, bo wartość już została przesłana, ale nadal ten sam błąd.
Nie, po odświeżeniu strony cała historia rozpoczyna się na nowo. php nie zapamiętuje wartości zmiennych po odświeżeniach. Co najwyżej sesja.

Napisz co ty tak w ogóle chcesz zrobić. Bo ten przykład jest totalnie bez sensu.

Cytat
Chcę przesyłać dane z formularza, bez potrzeby odświerzania strony. Zrobiłem to, korzystając z funkcji jQuery.load()
Chcesz przesłać formularz ajaxem? Ok. I co potem? Co ma się stać po przesłaniu?
seeker
Po przesłaniu dana ma zostać pobrana przez funkcję PHP, która to na jej podstawie odpowiednio wygeneruje kod strony.

Tutaj jest stronka:
http://www.wizualizator.cba.pl/

Wpisując wartość procentową zbiornik będzie się nam odpowiednio wypełniał, bez przeładowywania strony.
W kodzie strony mam pudełko, do którego wgrywam zawartość data.php <div id="zb" style="position:relative;"></div>
Ta metoda działa świetnie, tylko muszę sobie dzielić wszystko na wiele plików PHP, zamiast w jednym pliku zbiorczym mieć wszystkie funkcje. Do tego w przypadku fukncji load musi być jakiś div o unikalnym identyfikatorze, żeby funkcja wiedziała, gdzie ma to wgrać. Chciałem więc przesłać dane do POST, by stamtąd już sobie zwykła funkcja PHP zczytała dane, ale widać nie da się tak zrobić. Z tego co wyczytałem, możliwe jest przy funkcji .load() wczytywanie tylko fragmentów strony, podając po adresie selektor.

  1. <?php
  2.  
  3. function wypelnienie($ile)
  4. {
  5. $wartosc = 8000 * ($ile/100);
  6. echo $wartosc, '/8000';
  7. };
  8.  
  9. function zbiornik($ile)
  10. {
  11. $licznik = 46;
  12. $licznik2 = $ile;
  13.  
  14. if($ile < 0){$licznik2=0;}
  15. if($ile > 46) {$licznik2=46;}
  16.  
  17. while($licznik > 0)
  18. {
  19. if(($licznik-$licznik2)<=0)
  20. {
  21. echo '<tr><td style="height: 5px; background-color: blue; rules: none; padding: 0px;"></td></tr>';
  22. }
  23. else
  24. {
  25. echo '<tr><td style="height: 5px; background-color: white; rules: none; padding: 0px;"></td></tr>';
  26. }
  27. $licznik--;
  28. }
  29. }; ?>

Czy w takim wypadku należałoby każdą funkcję wpakować w jakieś pudełko z identyfikatorem? Ale to znowuż pozaciemniałoby mi kod tego pliku, a wcale nie pomogło przy pliku index.php, bo nadal musiałbym mieć jakieś pudełko o konkretnym identyfikatorze, do którego będę wgrywał (dużo zaczyna się ich już robić). Po prostu chciałem sobie uprościć kod, ale nie będzie tak działać. Myślałem, że php pracuje cały czas w tle, ale źle sobie myślałem i wykonuje się tylko raz na początku przy wczytywaniu dokumentu, po czym koniec. Tak więc muszę sobie ten fragment cały czas zaczytywać za każdym razem jak wpisywana jest nowa wartość. No trudno, przepraszam, że zawracałem głowę i dzięki za wyjaśnienie.
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.