Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][html] Przesyłanie tablic (checkboxów,fileformów) przez post
DiH
post 8.03.2010, 13:04:45
Post #1





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

Ostrzeżenie: (0%)
-----


Spędziłem ponad godzinę nad tym durnym błędem, więc dzielę się swoim rozwiązaniem. A więc, aby zabezpieczyc swój formularz używałem prostej pętli:
  1. foreach ($_POST as $key => $value) {
  2. $_POST[$key] = validateSyntax(dishtml($value));
  3. }

Niestety, kiedy próbowałem przekazac wartosci checkboxow, nie bylo żadnego rezultatu. Wpadłem więc na pomysł, jak rozwiązac ten problem z podobnymi formularzami, przy np. uploadzie plików, gdzie dane takze przekazywane sa jako tablica. Powyzsza petla powinna wygladac tak:
  1. foreach ($_POST as $key => $value) {
  2. if(is_array($_POST[$key]) == true) {
  3. for($i = 0; $i < count($_POST[$key]); $i++) {
  4. $_POST[$key][$i] = twoja_funkcja($_POST[$key][$i]);
  5. }
  6. }
  7. else {
  8. $_POST[$key] = twoja_funkcja($value);
  9. }
  10. }


Ten post edytował DiH 9.03.2010, 01:21:18
Go to the top of the page
+Quote Post
thek
post 8.03.2010, 13:14:05
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zauważ jednak prostą rzecz... Problemem nie jest tutaj przesyłanie danych POST, tylko Twoja funkcja walidująca. Gdybyś to ją przygotował do odbierania tablicy to nie miałbyś problemu i zapis numer 1 też byłby prawidłowy. Po prostu jesteś nastawiony w niej na to, że MUSI dostać konkretną wartość i nie może to być ani tablica, ani obiekt. Gdybyś to przewidział to mógłbyś nawet zrobić
  1. $_POST = validateSyntax( $_POST );

Tak więc po prostu logika zaszwankowała w Twoim kodzie i nie przewidziała takiej sytuacji.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
nospor
post 8.03.2010, 13:16:08
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




jest to dosc oczywiste rozwiązanie i raczej ogólnie stosowane. No ale skoro chciales sie tak bardzo podzielic to niech bedzie, szczegolnie ze lezy to na przedszkolu.

Zwracaj jednak uwagę na kod jaki dajesz.
nie:POST
a: $_POST

oraz funkcje validateSyntax() i dishtml(). Przedszkolak, ktory znajdzie ten temat zaraz przyleci z tekstem:
a mi nie dziala. Pisze ze nie znalazl funkcji validateSyntax() ...
Rozumiesz do czego zmierzam? Jak juz dajesz kod dla przyszlych pokolen to dawaj go w calosci, lub unikaj "zaawansowanych" funkcji, ktore wykorzystujesz u siebie i nie chcesz podac ich kodu.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
DiH
post 9.03.2010, 01:27:04
Post #4





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

Ostrzeżenie: (0%)
-----


@thek
Słuszna uwaga... skorzystam
@nospor
Poprawione. Nie "tak bardzo chciałem", a raczej nie znalazłem nic dziwnego z pomyśle, żeby podzielić się rozwiązaniem problemu, który jak chyba zaznaczyłem, nie należał do skomplikowanych. Szczególnie, że nie z takimi problemami ludzie przychodzą.

Pozdrawiam i dziękuję za komentarze.
Go to the top of the page
+Quote Post
thek
post 9.03.2010, 11:32:06
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A teraz poparz i pomyśl jak Twoja funkcja mogła by wyglądać gdyby obsługiwała obiekty i/lub tablice:
  1. function validate( $dane, $recursive = true ) {
  2. if( is_array( $dane ) ) {
  3. if( $recursive ) {
  4. //tutaj w pętli wywołamy validate($dane['klucz'] );
  5. } else
  6. return 'Error. Otrzymano tablicę. Wymagany skalar lub rekursywne ustawienie funkcji!';
  7. } elseif( is_object( $dane ) ) {
  8. if( $recursive ) {
  9. //tutaj w pętli wywołamy validate($dane->klucz );
  10. } else
  11. return 'Error. Otrzymano obiekt. Wymagany skalar lub rekursywne ustawienie funkcji!';
  12. } else {
  13. //tutaj sobie walidujesz wartość;
  14. }
  15. }
Pętli i działań wewnętrznych nie będę rozpisywał, bo byś miał gotowca winksmiley.jpg Zazwyczaj w przypadku błędów zwraca się false, ale chciałem byś wiedział, dlaczego i jaki błąd jest. Zwróć tylko uwagę na użycie rekurencji, bo ona tutaj robi dobrą robotę. To taki szkic na szybko, byś w przyszłości miał nad czym się zastanowić winksmiley.jpg Domyślnie mam ustawione przeszukiwanie rekursywne, ale możesz przy wywołaniu dać false i wtedy tylko pojedynczą wartość sprawdzi. Możesz także kombinować z wyciąganiem sprawdzenia $recursive jako pierwszego by nieco próbować przyspieszać funkcję w przypadku skalarów (masz wtedy 1 if zamiast czekać aż sprawdzi czy jest to tablica lub obiekt).


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:52