Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Przekazanie tablicy z JQuery do PHP
Forum PHP.pl > Forum > Przedszkole
KRISPI
Witam mam problem z przekazaniem tablicy do kodu PHP. Napiasałem skrypt JQUERY:
  1. <script type="text/javascript">
  2.  
  3.  
  4. $(document).ready(function(){
  5. $("td.komorka").click(function() {
  6. if($(this).css('background-color')== 'white')
  7. {
  8. $(this).css('background-color','red');
  9. }
  10. else if($(this).css('background-color')== 'red')
  11. {
  12. $(this).css('background-color','orange');
  13. }
  14. else
  15. {
  16. $(this).css('background-color','white');
  17.  
  18. }
  19. })
  20. $('td.komorka').each(function(){
  21. var tablica = [];
  22. var id,nr;
  23. if($(this).css('background-color')== 'white')
  24. {
  25. id=$(this).attr('id');
  26. nr=parseInt(id);
  27. tablica[nr]== 0;
  28. }
  29. else if($(this).css('background-color')== 'red')
  30. {
  31. id=$(this).attr('id');
  32. nr=parseInt(id);
  33. tablica[nr]== 1;
  34.  
  35. }
  36. else if($(this).css('background-color')== 'orange')
  37. {
  38. id=$(this).attr('id');
  39. nr=parseInt(id);
  40. tablica[nr]== 2;
  41.  
  42. }
  43.  
  44. $.post('rezultat.php',{tab:tablica},function(data){})
  45.  
  46. )
  47.  
  48. })
  49. });
  50.  

I teraz chciałbym odebrać zmienną tablica[] w PHP.Robię to w ten sposób ale nie działa:
  1. $tab=$_POST['tab[]'];
  2. for($i=0;$i<230;$i++)
  3. {
  4. echo "$tab[i]";
  5. }
mortus
A czy to tak trudno sprawdzić?
  1. echo '<pre>';
  2. print_r($_POST);

I zobaczysz, gdzie co masz.
KRISPI
Cytat(mortus @ 9.01.2012, 11:44:06 ) *
A czy to tak trudno sprawdzić?
  1. echo '<pre>';
  2. print_r($_POST);

I zobaczysz, gdzie co masz.

Nie odnajduje zmiennej tab zamiast tego wywala mi komunikat:
Notice: Undefined index: tab in C:\xampp\htdocs\php\rezultat.php on line 139
mortus
Cytat(KRISPI @ 9.01.2012, 11:52:12 ) *
Nie odnajduje zmiennej tab zamiast tego wywala mi komunikat:
Notice: Undefined index: tab in C:\xampp\htdocs\php\rezultat.php on line 139

A czy ja gdzieś wpisywałem nazwę indeksu w tablicy $_POST? Zobacz całą tablicę $_POST (kod podałem wyżej).
KRISPI
Cytat(mortus @ 9.01.2012, 11:58:33 ) *
A czy ja gdzieś wpisywałem nazwę indeksu w tablicy $_POST? Zobacz całą tablicę $_POST (kod podałem wyżej).

Jedyne co wyświetla to:
Array
(
[miesiac] => styczeń
[submit] => Dodaj
)
Naprawdę jestem początkującym i niewiele mi to mówi
mortus
Popraw skrypt jQuery, bo zdaje się, że nie tak (np. tablica[nr]== 2;) ma być. Jeśli wszystko będzie po stronie JS dobrze, to w pliku PHP, JS-ową tablicę znajdziesz w $_POST['tab'].

Swoją drogą nie pisałem wcześniej o bezpośrednim wywołaniu skryptu rezultat.php, a o wywołaniu go właśnie poprzez jQuery. Radzę zainstalować Firebug-a i włączyć zakładkę 'Sieć'. Ułatwi Ci to pracę ze wszystkimi AJAX-owymi żądaniami.
XP'ek
  1. $tab=$_POST['tab[]'];


nie powinno być
  1. $tab = $_POST['tab'];
questionmark.gif
KRISPI
Cytat(XP'ek @ 9.01.2012, 15:33:26 ) *
  1. $tab=$_POST['tab[]'];


nie powinno być
  1. $tab = $_POST['tab'];
questionmark.gif

Zmieniłem ale też nie działa
nospor
Ale czytaj dokładnie co ci ludzie piszą...

zwrócono ci uwagę na: tablica[nr]== 2
To jest porównanie. Jak chcesz coś przypisać to ma byc:
tablica[nr]= 2
KRISPI
Cytat(nospor @ 9.01.2012, 16:20:33 ) *
Ale czytaj dokładnie co ci ludzie piszą...

zwrócono ci uwagę na: tablica[nr]== 2
To jest porównanie. Jak chcesz coś przypisać to ma byc:
tablica[nr]= 2

Dziękuję za uwagę ale ten błąd poprawiłem jakiś czas temu bez rezultatu.
vokiel
Akcje/działania wykonuje się w kilku przypadkach, poprzez wykonanie kodu w trakcie wczytywania, poprzez bezpośrednie wywołanie funkcji lub poprzez wywołanie funkcji na podstawie zdarzeń.

Prześledź swój kod krok po kroku i pomyśl co tam się dzieje.
1. Po załadowaniu się dokumentu uruchamia się Twój kod
2. $("td.komorka").click(function() {} dodaje obsługę na zdarzenie kliknięcia w komórkę tabeli z klasą .komorka
3. Dla każdej komórki tabeli z klasą .komorka wykonywany jest kolejny blok kodu. Czyli sprawdzenie koloru komórki, stworzenie tablicy z id komórki i wartością w przedziale 0-2, następnie dla każdej(!) komórki wykonywane jest zapytanie POST.
4. Koniec

Teraz pomyśl co chciałeś osiągnąć. Bo Twój kod wysyła do serwera stan początkowy, ten po załadowaniu się strony. Klikanie po komórkach nic nie zmienia poza kolorem tła, zmiany wprowadzone w ten sposób nie trafiają na serwer. Nawet nie podejmuję już tu kwestii optymalności kodu, a jest co poprawiać...

Na początek, napisz co chcesz osiągnąć.
KRISPI
Cytat(vokiel @ 9.01.2012, 18:15:46 ) *
Akcje/działania wykonuje się w kilku przypadkach, poprzez wykonanie kodu w trakcie wczytywania, poprzez bezpośrednie wywołanie funkcji lub poprzez wywołanie funkcji na podstawie zdarzeń.

Prześledź swój kod krok po kroku i pomyśl co tam się dzieje.
1. Po załadowaniu się dokumentu uruchamia się Twój kod
2. $("td.komorka").click(function() {} dodaje obsługę na zdarzenie kliknięcia w komórkę tabeli z klasą .komorka
3. Dla każdej komórki tabeli z klasą .komorka wykonywany jest kolejny blok kodu. Czyli sprawdzenie koloru komórki, stworzenie tablicy z id komórki i wartością w przedziale 0-2, następnie dla każdej(!) komórki wykonywane jest zapytanie POST.
4. Koniec

Teraz pomyśl co chciałeś osiągnąć. Bo Twój kod wysyła do serwera stan początkowy, ten po załadowaniu się strony. Klikanie po komórkach nic nie zmienia poza kolorem tła, zmiany wprowadzone w ten sposób nie trafiają na serwer. Nawet nie podejmuję już tu kwestii optymalności kodu, a jest co poprawiać...

Na początek, napisz co chcesz osiągnąć.

Więc fakt nie wiem czy dobrze myślę ale gdybym umieścił zapytanie POST poza blokiem funkcji, a tablicę jako zmienną globalną to uzyskałbym efekt pojedyńczego wykonania zapytania POST?
A chciałem uzyskać efekt który pozwoliłby mi zapamiętanie stanów poszczególnych komórek, następnie w formie tablicy przekazanie go do php w celu odpowiedniego uaktualnienia tabeli mysql. Naprawdę nie umiem z tym ruszyć naprzód.

Cytat(vokiel @ 9.01.2012, 18:15:46 ) *
Akcje/działania wykonuje się w kilku przypadkach, poprzez wykonanie kodu w trakcie wczytywania, poprzez bezpośrednie wywołanie funkcji lub poprzez wywołanie funkcji na podstawie zdarzeń.

Prześledź swój kod krok po kroku i pomyśl co tam się dzieje.
1. Po załadowaniu się dokumentu uruchamia się Twój kod
2. $("td.komorka").click(function() {} dodaje obsługę na zdarzenie kliknięcia w komórkę tabeli z klasą .komorka
3. Dla każdej komórki tabeli z klasą .komorka wykonywany jest kolejny blok kodu. Czyli sprawdzenie koloru komórki, stworzenie tablicy z id komórki i wartością w przedziale 0-2, następnie dla każdej(!) komórki wykonywane jest zapytanie POST.
4. Koniec

Teraz pomyśl co chciałeś osiągnąć. Bo Twój kod wysyła do serwera stan początkowy, ten po załadowaniu się strony. Klikanie po komórkach nic nie zmienia poza kolorem tła, zmiany wprowadzone w ten sposób nie trafiają na serwer. Nawet nie podejmuję już tu kwestii optymalności kodu, a jest co poprawiać...

Na początek, napisz co chcesz osiągnąć.

Więc fakt nie wiem czy dobrze myślę ale gdybym umieścił zapytanie POST poza blokiem funkcji, a tablicę jako zmienną globalną to uzyskałbym efekt pojedyńczego wykonania zapytania POST?
A chciałem uzyskać efekt który pozwoliłby mi zapamiętanie stanów poszczególnych komórek, następnie w formie tablicy przekazanie go do php w celu odpowiedniego uaktualnienia tabeli mysql. Naprawdę nie umiem z tym ruszyć naprzód.
vokiel
I tak i nie :-)

Jeśli chcesz wysłać tablicę pól raz - zamiast tyle razy ile masz komórek - to tak, poza pętlą.
Jeśli chcesz przekazać aktualny stan pól, to musisz wybrać kiedy to ma nastąpić, czy po zmianie jakiegokolwiek pola, czy po kliknięciu na przycisk, czy po jakimś innym zdarzeniu na stronie.

Jak już będziesz wiedział kiedy masz to zrobić, to napisanie kodu sprowadza się do:
1. Funkcja pobierająca aktualne stany komórek
2. Funkcja zmieniająca stany po kliknięciu
3. Funkcja odpalana po wybranym zdarzeniu, która wywoła tą pierwszą i zdobyte stany przekaże do php
KRISPI
Cytat(vokiel @ 9.01.2012, 19:59:42 ) *
I tak i nie :-)

Jeśli chcesz wysłać tablicę pól raz - zamiast tyle razy ile masz komórek - to tak, poza pętlą.
Jeśli chcesz przekazać aktualny stan pól, to musisz wybrać kiedy to ma nastąpić, czy po zmianie jakiegokolwiek pola, czy po kliknięciu na przycisk, czy po jakimś innym zdarzeniu na stronie.

Jak już będziesz wiedział kiedy masz to zrobić, to napisanie kodu sprowadza się do:
1. Funkcja pobierająca aktualne stany komórek
2. Funkcja zmieniająca stany po kliknięciu
3. Funkcja odpalana po wybranym zdarzeniu, która wywoła tą pierwszą i zdobyte stany przekaże do php


Wiem że jestem męczący, ale ciągle nie potrafię przez to przebrnąć. Nie rozumiem mój kod wygląda teraz tak:
  1. $(document).ready(function(){
  2. var tablica = [];
  3. var id,nr;
  4. function pobierz()
  5. {
  6. $('td.komorka').each(function(){
  7.  
  8. if($(this).css('background-color')== 'white')
  9. {
  10. id=$(this).attr('id');
  11. nr=parseInt(id);
  12. tablica[nr]= 0;
  13. }
  14. else if($(this).css('background-color')== 'red')
  15. {
  16. id=$(this).attr('id');
  17. nr=parseInt(id);
  18. tablica[nr]= 1;
  19.  
  20. }
  21. else if($(this).css('background-color')== 'orange')
  22. {
  23. id=$(this).attr('id');
  24. nr=parseInt(id);
  25. tablica[nr]=2;
  26.  
  27. }
  28. });
  29. }
  30.  
  31.  
  32. $("td.komorka").click(function() {
  33. if($(this).css('background-color')== 'white')
  34. {
  35. $(this).css('background-color','red');
  36. id=$(this).attr('id');
  37. nr=parseInt(id);
  38. tablica[nr]= 1;
  39.  
  40. }
  41. else if($(this).css('background-color')== 'red')
  42. {
  43. $(this).css('background-color','orange');
  44. id=$(this).attr('id');
  45. nr=parseInt(id);
  46. tablica[nr]=2;
  47. }
  48. else
  49. {
  50. $(this).css('background-color','white');
  51. id=$(this).attr('id');
  52. nr=parseInt(id);
  53. tablica[nr]= 0;
  54.  
  55. }
  56. });
  57.  
  58. $("#zmiana").click(function() {
  59. pobierz();
  60.  
  61. $.post('rezultat.php',{tab:tablica},function(data){});
  62.  
  63.  
  64. });
  65.  
  66. });
  67.  

Dodałem zdażenie poprzedzające przesłanie tablicy oraz zmianę stanu po kliknięciu komórki tak jak sugerowałeś. Wiem kod jest strasznie rozległy ale chodzi mi narazie o sam rezultat. Nic się nie dzieje. Pozatym kiedy wczytuje się strona już na wstępie otrzymuję błąd w kodzie php że nie rozpoznaje indexu tab.
Nie wiem czy to problem że przesyłam zmienną do tego samego pliku bo kod JQUERY mam wtym samym co PHP?
#luq
Generalnie:

[JAVASCRIPT] pobierz, plaintext
  1. $.ajax({
  2. type: 'POST',
  3. url: 'example.php',
  4. data: {
  5. foo: ['ala ma kota']
  6. },
  7. dataType: 'json',
  8. onSuccess: function(data){
  9. console.log(data);
  10. }
  11. })
[JAVASCRIPT] pobierz, plaintext


  1. echo $_POST['foo'][0];


Powinno działać, więc zrób analogicznie.
KRISPI
Cytat(#luq @ 18.01.2012, 14:13:05 ) *
Generalnie:

[JAVASCRIPT] pobierz, plaintext
  1. $.ajax({
  2. type: 'POST',
  3. url: 'example.php',
  4. data: {
  5. foo: ['ala ma kota']
  6. },
  7. dataType: 'json',
  8. onSuccess: function(data){
  9. console.log(data);
  10. }
  11. })
[JAVASCRIPT] pobierz, plaintext


  1. echo $_POST['foo'][0];


Powinno działać, więc zrób analogicznie.

Zrobiłem analogicznie:
[JAVASCRIPT] pobierz, plaintext
  1. $("#zmiana").click(function() {
  2. pobierz();
  3. $.ajax({
  4. type: 'POST',
  5. url: 'index.php',
  6. data: { foo: ['ala ma kota'] },
  7. dataType: 'json',
  8. onSuccess: function(data){ console.log(data); }
  9. })
  10.  
  11. });
  12.  
[JAVASCRIPT] pobierz, plaintext

Odebrałem:
  1. <?php
  2. echo '<pre>';
  3. print_r($_POST);
  4. echo $_POST['foo'][0];
  5.  
  6. ?>

I dostałem komunikat:

Array
(
[submit] => Dodaj
)


Notice: Undefined index: foo in C:\xampp\htdocs\php\index.php on line 19

naprawdę nie wiem?questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif?
mortus
Przecież to ma być wysyłane asynchronicznie z pomocą AJAX, a Ty w tej chwili wysyłasz to normalnie tzn. po kliknięciu w przycisk przechodzisz do pliku/skryptu PHP. Jeśli koniecznie musisz użyć przycisku submit, do wykonania akcji, to spraw, żeby strona się nie przeładowywała. Na końcu skryptu obsługującego zdarzenie onclick dodaj:
[JAVASCRIPT] pobierz, plaintext
  1. return false;
[JAVASCRIPT] pobierz, plaintext

Jeśli nie rozumiesz "ideologii" AJAX-a, to wróć do podstaw - Google.
Pierwsza znaleziona strona doskonale się nadaje na dobry początek.

EDIT: Twoim problemem nie jest przekazywanie tablicy, a przekazanie czegokolwiek. Po prostu nie wiesz o co w ogóle chodzi.
KRISPI
Cytat(mortus @ 18.01.2012, 17:06:54 ) *
Przecież to ma być wysyłane asynchronicznie z pomocą AJAX, a Ty w tej chwili wysyłasz to normalnie tzn. po kliknięciu w przycisk przechodzisz do pliku/skryptu PHP. Jeśli koniecznie musisz użyć przycisku submit, do wykonania akcji, to spraw, żeby strona się nie przeładowywała. Na końcu skryptu obsługującego zdarzenie onclick dodaj:
[JAVASCRIPT] pobierz, plaintext
  1. return false;
[JAVASCRIPT] pobierz, plaintext

Jeśli nie rozumiesz "ideologii" AJAX-a, to wróć do podstaw - Google.
Pierwsza znaleziona strona doskonale się nadaje na dobry początek.

EDIT: Twoim problemem nie jest przekazywanie tablicy, a przekazanie czegokolwiek. Po prostu nie wiesz o co w ogóle chodzi.

Masz rację dopiero się uczę. Ale twój post pomógł. W firebug widzę obsłużenie żądania AJAX.
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.