Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa input - jak wy to robicie
Forum PHP.pl > Forum > PHP > Object-oriented programming
tuner
Możecie mi opisać jak wy rozwiązujecie problem klasy z danymi wejściowymi? Ja mam wątpliwości jak trzymać dane, jak ustalać do nich dostęp, czy dzielić je na get, post, session przy wyciągniu z klasy itp.

Ktoś może podzielić się swoim doświadczeniem?
M4chu
Ja w klasie Http mam metody get, post, cookie, file, ktore zwracaja dane wejsciowe (przy inicjalizacji obiektu robie filtrowanie itp). Dla sesji mam osobna klase (patrz art na php.pl winksmiley.jpg ). A co do dostepu to tak samo jak tablice, ktore zawieraja ta dane - globalny.
tuner
A jak wygląda zapisywanie danych do sesji? Posługujesz się zwykłą tablicą $_SESSION[$var] czy masz jakąś metodę np. saveVar($var) ?
M4chu
Mozna i tak i tak, bo podmieniam session handlera, ale wole Session::set( 'name', value' ), bo gdy nie ma zmiennej sesyjnej to nie ma tez indeksu dla tablicy $_SESSION i wywala brzydki blad, a tak to ladnie sobie moge to obsluzyc w funkcji winksmiley.jpg
tuner
  1. <?php
  2. $this->vars=array_merge($_GET?array():$_GET,$_POST?array():$_POST,$_SESSION?$_SESSION:array(),$_COOKIE?$_COOKIE:array());
  3. ?>

Do klasy input wcisnąłem jeszcze
  1. <?php
  2. function saveVar($k,$v)
  3. {
  4. $_SESSION[$k]=$v;
  5. $this->vars[$k]=$v;
  6. }
  7. ?>

Co o tym myślisz?

Mógłbym to napisać od ręki, ale stwierdziłem, że przemyśle Session Handlera i klase Input by potem nie wprowadzać w całym skrypcie zmian.
M4chu
Hehe, Twoje $this->vars, to nic innego jak $_REQUEST smile.gif Zreszta moim zdaniem, Laczenie wszystkich danych wejsciowych w jedna tablice jest zle, i to bardzo: przeciez jakies $id z posta a z cooki to cos zupelnie innego. Wole trzymac odpowiednie dane w odpowiednich tablicach i robic do nich gettery i settery. A co do metody saveVar(), coz trudno tu wymyslic cos nowego smile.gif To samo co przy innych - oddzielenie $session od $get, $post itp.
pozdro
hawk
Ja bym tak nieśmiało zaczął od tego, w jakim celu w ogóle jest to robione... nie żebym uważał, że żadna nadbudowa nad $_GET itd jest niepotrzebna. Wręcz przeciwnie. Ale najpierw trzeba określić, co się chce dzięki temu uzyskać, a potem to zaimplementować. Bo rozwiązań może być tyle, co developerów. A większość z nich, jak to zwykle bywa, będzie bez sensu, bo większość developerów nie zastanowi się nawet, czemu to ma służyć, tylko zrobi na hurra sad.gif.
chfast
Cytat(hawk @ 2005-05-16 18:57:33)
najpierw trzeba określić, co się chce dzięki temu uzyskać

No właśnie. To co się chce przez to uzyskać? I co się da przez to uzyskać?
BugTomek
Cytat(chfast @ 2005-05-17 11:04:20)
Cytat(hawk @ 2005-05-16 18:57:33)
najpierw trzeba określić, co się chce dzięki temu uzyskać

No właśnie. To co się chce przez to uzyskać? I co się da przez to uzyskać?

Np. możemy się pozbyć problemu z niezainicjowanymi zmiennymi, np.
  1. <?php
  2. $foo = $_SESSION['foo'];
  3. ?>

Okazuje się, że nie ma w sesji takiej zmiennej i pojawia się błąd:
Kod
Notice: Undefined index: foo in ... on line ...

Jeśli zrobimy to w ten sposób:
  1. <?php
  2. $foo = $session->get('foo');
  3. ?>

To możemy wszystko ładnie załatwić w metodzie get():
  1. <?php
  2. function get($var) {
  3. if (!isset($_SESSION[$var]) 
  4. return NULL;
  5. else
  6. return stripslashes($_SESSION[$var]);
  7. }
  8. ?>

To tylko prosty przykład, pokazujący również kolejną zaletę tego rozwiązania, a mianowicie możliwość wprowadzenia łatwego filtrowania danych. To tylko początek: możliwości jest o wiele więcej.
hawk
@BugTomek: akurat twój przykład jest zły, bo zamienia jeden problem na drugi. Owszem, nie mam problemu z niezainicjowanymi zmiennymi, ale mam problem ze zmiennymi, które przyjęły wartość NULL, a ja o tym nie wiem. I tak trzeba sprawdzić wartość zmiennej w kodzie, żeby upewnić się, że ona w ogóle przyszła. Czyli: to co napisałeś nie daje żadnej korzyści.

Natomiast stripslashes to już dobre zastosowanie. Chociaż w złym miejscu. Nie powinno się znajdować w momencie, kiedy ktoś chce pobrać wartość z $_SESSION, ale powinno od razu wstawiać do $_SESSION poprawioną wartość. Inaczej nie tylko wywołujemy bez sensu stripslashes wielokrotnie, ale do tego ryzykujemy, że ktoś odwoła się bezpośrednio do $_SESSION i wszystko zmarnuje.
BugTomek
Co do pierwszego to zgadzam się w zupełności. Są co prawda przypadki, kiedy takie coś wystarcza, ale generalnie nie jest to idealne rozwiązanie - jak wobec tego zrobić to lepiej?
Co do drugiego, to faktycznie, do ideału temu rozwiązaniu wiele brakuje, ale chodziło jedynie o generalną zasadę co można z tym robić. Filtrowanie należałoby zrobić bardziej rozbudowane, przy wyciąganiu to w zasadzie bardziej logiczne byłoby addslashes (jeżeli dane z sesji umieszczamy w zapytaniach SQL), ale to również jedynie jako opcja. Możliwości jest tu mnóstwo, ale wiadomo, że chodzi o to, żeby te dane łatwo walidować.
Ociu
Ja mam zawsze byłem odmieńcem i poprzez input pobieram: ip, host, browser użytkownika, pobieranie danych z adresów, $_POST.

  1. <?php
  2. public function loadPost()
  3. {
  4. if(isset($_POST))
  5. {
  6.  foreach($_POST AS $key => $value )
  7.  {
  8. $this -> inputs[$key] = $value;
  9.  }
  10. }
  11. }
  12. ?>
matid
Ja osobiście wykorzystuje taką klasę nie tylko do filtrowania (strip_slashes, itp.), ale raczej do rzutowania typów, czyli implementuje sobie metody getInt, getString, itp.
bacca
A ja robię tak:

  1. <?php
  2.  
  3. abstract class input {
  4.  
  5. /* gdy potrzebuje liczby calkowitej */
  6. public static function getInt(&$source, $key) {
  7.   if ((is_numeric($source[$key]))&&($source[$key] == (int)$source[$key])) {
  8.    return (int)$source[$key];
  9.   } else {
  10.    return false;
  11.   }
  12. }
  13.  
  14. /* gdy potrzebuje liczby naturalnej (np. id rekordu w bazie) */
  15. public static function getNat(&$source, $key) {
  16.   if ((is_numeric($source[$key]))&&($source[$key] > 0)&&($source[$key] == (int)$source[$key])) {
  17.    return (int)$source[$key];
  18.   } else {
  19.    return false;
  20.   }
  21. }
  22.  
  23. public static function getFloat(&$source, $key) {
  24.   if (is_numeric($source[$key])) {
  25.    return (float)$source[$key];
  26.   } else {
  27.    return false;
  28.   }
  29. }
  30.  
  31. /* gdy potrzebuje pojedynczego slowa */
  32. public static function getWord(&$source, $key) {
  33.   if (preg_match('/^([a-zA-Z0-9_-]+)$/', $source[$key])) {
  34.    return $source[$key];
  35.   } else {
  36.    return false;
  37.   }
  38. }
  39.  
  40. /* gdy potrzebuje dowolnego tekstu ktory mam potem wyswietlic */
  41. public static function getText(&$source, $key) {
  42.   global $engine;
  43.   if (get_magic_quotes_gpc()) {
  44.    return htmlspecialchars($source[$key], ENT_NOQUOTES);
  45.   } else {
  46.    return addslashes(htmlspecialchars($source[$key], ENT_NOQUOTES));
  47.   }
  48. }
  49. }
  50. ?>


A potem uzywam np. tak:
  1. <?php
  2.  
  3. $login = input::getWord($_GET, 'login');
  4.  
  5. ?>


Dodam jeszcze, że używam tego tylko do GET, POST i ciastek, bo niby jak user ma sie dobrać do sesji.
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.