Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Odbieranie danych
Forum PHP.pl > Forum > Przedszkole
cer98
1. Czy trudno napisać funkcję do odbierania i zwracania danych wysłanych z POST i GET ? Miałaby za zadanie odebrać wszystkie wysłane dane metodą POST i GET, przekazać w tablicy lub określoną, którą zadeklaruję. Potrzebuję tego do walidacji formularza.

2. Drugie pytanie w kontrolerze deklaruję metody, jak je zablokować, żeby po wejściu na stronę nie widzieć, że formularz jest sprawdzony i wysypało błędy, tylko pusty formularz ? Myślałem, żeby wstawić warunek dla wszystkich metod walidujących, jeśli dane zostały wysłane postem, to rozpocznij walidacje, jeśli nie nic nie rób, wyświetl formę. Ale jak to robi się profesjonalnie w MVC?
IceManSpy
Z taką wiedzą na zabieraj się za MVC. Poćwiczyć czyste PHP, a potem wróć do MVC itd. Bo pytając nas jak odebrać GET i POST, to nie połapiesz się w MVC.
Adikso
1.
Kod
<?php
printf($_POST);
printf($_GET);
?>

Wyświetla dane post i get w formie tablicy
cer98
  1. $validate->doValidate(@$_POST['opcja'] ,'', true);


Po prostu chce uniknąć takiej sytuacji, że mam syf w metodzie w pierwszym argumencie, mam błąd notice, którego mogę się pozbyć jedynie wstawiając null, a mogę opcję przekazać inaczej.

Jak tą metodę uruchomić po wysłaniu formularza ?
IceManSpy
Możesz też zrobić isset($_POST) to wtedy sprawdzisz czy zmienna $_POST jest ustawiona.
cer98
Czy ma to prawo działać ?

  1.  
  2. class klasa{
  3. public $getData= array();
  4.  
  5. public function getPost($var){
  6.  
  7. $this->getData= ($_POST);
  8.  
  9. return $this->getData[$var];
  10.  
  11.  
  12. }
  13. }
  14.  
  15. $get = new klasa;
  16. $get->getPost('opcja')
  17.  
  18.  
IceManSpy
Ile się uczysz PHP? Może coś tam by działało, ale mnóstwo błędów popełniasz:
1. W klasie używasz tablicy $_POST - takich rzeczy się nie robi. Możesz przekazać jako parametr tablicę POST do jakiejś metody.
2. Pola metod najczęściej są prywatne, aby nie było do nich dostępu bezpośrednio przez obiekt - do tego służą gettery i settery.
cer98
Czytam książki, piszę przykłady, może rok uczę się. Zmieniłem na private i też działa, zatem czy moja klasa nie nadaje się do powszechnego użytku ?

Czy powinienem wysyłać formularz do skryptu, czy na tą samą stronę ? Jeśli do skryptu, to z przekierowanie ? Jak to wygląda we wzorcach ?
IceManSpy
A wiesz chociaż czemu działa jak zmieniłeś na private?

Nie chcę tutaj nie doceniać Twojej pracy, ale zanim weźmiesz się za wzorce i w ogóle MVC (też wzorzec), to zajmij się podstawami. Jakoś nie wierzę, że rok się uczysz wink.gif Może miesiąc. Takie rzeczy widać, bo zadajesz pytania jak odebrać POST czy GET, co większość osób ogarnie po tygodniu nie siedząc nawet po kilka godzin.

Rozumiem, że możesz mieć pytanie odnośnie programowania obiektowego - sam uczę się jak go stosować. Ale takie podstawy jak odebrać POST czy GET to jeszcze za wcześnie na obiektówkę czy wzorce.
cer98
Zwracam to, co chcę, czyli odebrałem dane w metodzie, pole jest private, więc nie ma dostępu do niego spoza klasy. Nie będę mógł również go dziedziczyć, chyba że jest protected, ale nie będę mógł zmienić. To nie funkcja narzędziowa, tylko do odbierania danych, więc mam przekazać tablicę post do funkcji w metodzie i zwrócić element tablicy post ? Czyli metoda będzie miała 2 argumenty tablica globalna post i to co chcę zwrócić ? Chyba dobrze zrozumiałem to, co piszesz bo ja chcę stworzyć metodę do odbioru danych z tablicy post, a w klasie nie mogę użyć POST ?

Nie powinno być ważnym ile się uczę, tylko ilę potrafię.

Teraz pokaż mi na przykładzie __set i __get jak odebrać dane z tablicy globalnej POST

  1. public function __set($nazwa, $wartosc) {
  2. $this->data[$nazwa] = $wartosc;
  3. }
IceManSpy
Przypisywanie i odczytywanie (pisane na szybko, więc może być jakiś mały error wink.gif ):
  1. <?php
  2. class Klasa {
  3. private tablica = array();
  4.  
  5. public function set($array) {
  6. $this->tablica = $array;
  7. }
  8.  
  9. public function get($ktory) {
  10. //pomijam sprawdzanie, czy private tablica jest ustawiona
  11. return $this->tablica[$ktory];
  12. }
  13. }
  14. $obj = new Klasa();
  15. $obj->set($_POST);
  16. //odbior jakiegos elementu
  17. echo $obj->get('opcja');


W tej klasie może być dowolna tablica - POST, GET, coś z bazy danych, z XML, co chcesz.
cer98
Chciałbym rozwinąć klasę o metodę, która przypisze mi wszystkie zmienne, jest sens (albo przekazać tablicę POST przez konstruktor do klasy Validate i w __construct przypisać zmienne) ?

  1. class Klasa {
  2. private tablica = array();
  3.  
  4. public $nick;
  5.  
  6. public function set($array) {
  7. $this->tablica = $array;
  8. }
  9.  
  10. public function get($ktory) {
  11. //pomijam sprawdzanie, czy private tablica jest ustawiona
  12. return $this->tablica[$ktory];
  13. }
  14.  
  15. public function setData(){
  16. $nick = $this->get('nick');
  17. // ... itd. //
  18. return $nick;
  19. }
  20. }
  21. $obj = new Klasa();
  22. $obj->set($_POST);
  23. //odbior jakiegos elementu
  24. echo $obj->get('opcja');
  25. echo $validate->setData();
  26.  
  27. echo $validate->nick;



To błąd:
  1. $validate->doValidate($validate->get('opcja') ,'', true);


Mam jeszcze jedno pytanie, ale to później. Pomocy exclamation.gif
bastard13
Nie za bardzo mogę się w tym wszystkim połapać. Chodzi ci o to, że jeżeli twoja tablica $_POST wygląda tak:
  1. $_POST = array('a' => 1, 'b' =>2);

to chcesz uzyskać coś takiego:
  1. $a = 1;
  2. $b = 2;


Jeżeli tak, to użyj http://www.php.net/manual/en/function.extract.php
No i wsadź to sobie w jakąś metodę.
cer98
Myślę, że to wina podziału, walidacja powinna odbywać się w kontrolerze.

Ta klasa to model, do walidacji więc myślę, że kontroler, czyli wywołane metody powinny być wszyte w model.
Ponieważ kontroler odbiera wszystkie akcje użytkownika i uruchamia metody z modelu oraz odpala widok.
Błędy to zwykła tablica, więc mogę przesłać do widoku.

W widoku miałbym tylko formę i błędy z wypełniania. Błędy wysłałbym przez GET, potem serialize i unserialize ?

Dobrze rozumiem ?

p.s. Ta funkcja jest kompatybilna z PHP5, więc powinna działać.
gac3k
dude, źle się za to zabierasz, poza tym mam nadzieję że to 98 to nie jest twoja data urodzenia smile.gif

Cytat
Myślę, że to wina podziału, walidacja powinna odbywać się w kontrolerze.


nie wiem czy dobrze Cię rozumiem, ale cała walidacja powinna być w modelu nie w kontrolerze, w kontrolerze tylko sprawdzasz czy walidacja przeszła czyli np.

  1. if($model->validate($_POST))
  2. {
  3. //save this bitch
  4. }
  5. else
  6. {
  7. //pokazujesz form
  8. }


a już pomijając wszystko, to ja Ci proponuje ściągnij sobie jakieś frameworki oparte na MVC ja Ci polecam Kohane, osobiście m.i.n jego używam i jest w sam raz do nauki tego akurat wzorca. Generalnie powinieneś całą logikę trzymać w modelu, chociaż fakt że to nie zawsze wychodzi.
cer98
Kto mi może powiedzieć, czy ta serializacja to dobry pomysł ?
Możesz mi powiedzieć Kohana to jaki wzorzec ?

Do sprawdzenia, czy wszystko gra użyję allClear();
IceManSpy
Dalej masz publiczny $nick, którego nawet nie wykorzystujesz.

Nie bierz się za wzorce jak nawet nie wiesz co jest czym. Zabierasz się za to jak do strzelania z CKMu, nie potrafiąc nawet strzelić z pistoletu (nawet takim na kulki - bo pytasz o proste operacje na GET i POST).

Poćwicz sobie trochę obiektówkę. Zrób sobie klasę do walidacji, gdzie będziesz np walidował imię, maila czy datę (przy okazji możesz poćwiczyć wyrażenia regularne). A potem wykorzystaj to w innych metodach. Dzięki temu poznasz działanie programowania obiektowego i będzie Ci dużo łatwiej wskoczyć w MVC.

Ogólnie rzecz biorąc modele służą do operacji na danych. Widok tylko wyświetla coś tam, a kontroler łączy widok z modelem. To tak w maksymalnym skrócie.

Frameworki MVC: Koahana, Symfony, Zend, Code Igniter, Yii.
cer98
proxy będzie tu dobrym wzorcem
http://www.oodesign.com/proxy-pattern.html
gac3k
pytasz się nas czy stwierdzasz, mam wrażenie że ty nie szukasz pomocy tylko poparcia twojego myślenia. To nie jest problem wzorców tylko tego że ty chcesz ich używać nie znając nawet logiki ich działania. Napisałem Ci wyżej co ja sądzę.
IceManSpy
A znasz wzorzec Inheritance ?
cer98
Teraz już tak, link http://www.php.net/manual/pl/language.oop5.inheritance.php
To czyste OOP 5.
Dzięki za rady, czas na naukę
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.