Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> projektowanie kontrolera
pikornecki
post 15.07.2011, 16:28:24
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 0
Dołączył: 27.07.2010

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


Witam,

Chciałbym zaprojektować wydajny kontroler. Znalazłem taki artykół na stronie http://php.pl/Wortal/Artykuly/Proces-tworz...anie-Kontrolera, w którym switch pełni rolę takiego kontrolera:
  1. switch ( @$_GET['action'] ) {
  2. case 'edit':
  3. include ('actions/edit.php');
  4. break;
  5. case 'post':
  6. include ('actions/post.php');
  7. break;
  8. case 'delete':
  9. include ('actions/delete.php');
  10. break;
  11. case 'default':
  12. include ('actions/view.php');
  13. break;
  14. }


I teraz moje pytanie, chciałbym tak jak w tym przykładzie użyć switcha do obsługi menu złożonego z takich imputów:

  1. <input class="menuButtons" type="submit" value="Załaduj obrazki" name="addImagesButton"/>


Teraz pytanie, nawet jeśli zastosuję takiego samego name(a) dla 10 przycisków jak zastosować to w switchu? Co dla mnie będzie casem?


EDIT: chciałbym dodać że chce operować POST a nie GET

Ten post edytował pikornecki 15.07.2011, 16:36:39
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
tabbi
post 15.07.2011, 16:52:29
Post #2





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 30.10.2010

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


a nie można w:

switch ( @$_POST['action'] ) {

i odpowiednio zmieniać value w inputach

albo zrobić tablice np. name=mirrors[action][value]
Go to the top of the page
+Quote Post
CuteOne
post 15.07.2011, 17:59:54
Post #3





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Dla każdego guzika będziesz robił oddzielny <form action="xxx"></form>?? Podany przez Ciebie przykład z artykUłu dotyczy bardziej linków niż submitów. Poza tym zamiast switchów wygodniej jest zrobić sobie tablicę z danymi modułów.

  1.  
  2. $modules = array(
  3. 'main' => array('main.php', 1),
  4. 'logowanie' => array('login.php', 1),
  5. //itd...
  6. );
  7.  
  8. if(array_key_exists($_GET['action'], $modules)) {
  9.  
  10. if($modules[$_GET['action']][1] == 1) {
  11.  
  12. include $modules[$_GET['action']][0];
  13. }
  14. }


A jeszcze wygodniejszym rozwiązaniem jest zaangażowanie do tego celu bazy danych


EDIT: fakt zamiast in_array powinno być array_key_exists wink.gif dzięki fifi

Ten post edytował CuteOne 16.07.2011, 16:34:05
Go to the top of the page
+Quote Post
Sagnitor
post 16.07.2011, 12:00:20
Post #4





Grupa: Zarejestrowani
Postów: 34
Pomógł: 3
Dołączył: 29.05.2011

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


Hm, twojego switch'a da się zastąpić instrukcją if, else przy okazji filtrując dane.

  1. $sAction = $_GET['action']; // Tutaj należy dodać filtrowanie zmiennej.
  2.  
  3. if(file_exists('./actions/'.$sAction.'.php'))
  4. {
  5. include ('./actions/'.$sAction.'.php');
  6. } else {
  7. include ('./main.php'); // W tym miejscu includujemy lub przekierowujemy na stronę główną
  8. }
  9.  


To są najprostsze i najbardziej prymitywne przykłady wink.gif.

Pozdrawiam
Go to the top of the page
+Quote Post
AndyPSV
post 16.07.2011, 12:16:21
Post #5





Grupa: Zarejestrowani
Postów: 393
Pomógł: 5
Dołączył: 6.02.2003
Skąd: The.Luciferian.Doctrine.p
df

Ostrzeżenie: (30%)
XX---


uzywam czegos bardziej skomplikowanego - [SPAM]
  1. function loadMod($m) {
  2. $uri = explode(';',$m); if(!empty($uri[1])) $m = $uri[0]; $pth = DIR_MOD.strtolower($m).N.INX.PHP; $q = q('SELECT id FROM `'.PRFX.'c0'.LG.'` WHERE url = "'.$m.'" LIMIT 1'); if(n_r($q) == 0) {
  3. if(file_exists($pth)) include_once($pth); else { header(LOC.URL,true,301); exit; } } else include_once(DIR_MOD.strtolower('pg').N.INX.PHP);
  4. } if(empty($_GET[0]) or substr($_GET[0],0,1) == '?') loadMod(PG_H_MOD); else { if(ctype_digit($_GET[0])) loadMod('ad'); else { if(ctype_digit(end(explode(',',$_GET[0])))) loadMod('ad'); else {
  5. if(substr($_GET[0],0,3) == 'buy') loadMod(substr($_GET[0],0,3)); elseif(is_dir('m/'.$_GET[0])) loadMod($_GET[0]); else {
  6. $q = q('SELECT id,t FROM '.PRFX.'ads WHERE uri = "'.$_GET[0].'" LIMIT 1'); if(n_r($q) > 0) { $ad = f($q); exit(header(LOC.URL._url($ad['t']).','.$ad['id'])); } else exit(header(LOC.URL));
  7. }
  8. }}


kod umozliwia otworzenie wszystkiego.

Ten post edytował wookieb 16.07.2011, 16:40:05
Powód edycji: [wookieb]:
Go to the top of the page
+Quote Post
Fifi209
post 16.07.2011, 14:19:11
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(CuteOne @ 15.07.2011, 18:59:54 ) *
  1.  
  2. $modules = array(
  3. 'main' => array('main.php', 1),
  4. 'logowanie' => array('login.php', 1),
  5. //itd...
  6. );
  7.  
  8. if(in_array($_GET['action'], $modules)) {
  9.  
  10. if($modules[$_GET['action']][1] == 1) {
  11.  
  12. include $modules[$_GET['action']][0];
  13. }
  14. }

Jak dla mnie array_key_exists zamiast in_array

Cytat(Sagnitor @ 16.07.2011, 13:00:20 ) *
Hm, twojego switch'a da się zastąpić instrukcją if, else przy okazji filtrując dane.

  1. $sAction = $_GET['action']; // Tutaj należy dodać filtrowanie zmiennej.
  2.  
  3. if(file_exists('./actions/'.$sAction.'.php'))
  4. {
  5. include ('./actions/'.$sAction.'.php');
  6. } else {
  7. include ('./main.php'); // W tym miejscu includujemy lub przekierowujemy na stronę główną
  8. }
  9.  


To są najprostsze i najbardziej prymitywne przykłady wink.gif.

Gdzie w tym kodzie filtracja? Jakiś ctype_ czy preg_match ukryty? A może filter_var? Nawet brak podstawy jaką jest basename

Ten post edytował Fifi209 16.07.2011, 14:20:39


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Sagnitor
post 16.07.2011, 14:40:18
Post #7





Grupa: Zarejestrowani
Postów: 34
Pomógł: 3
Dołączył: 29.05.2011

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


@UP

Wstawiłem kod bez filtracji i pokazałem miejsca, w których powinna sie odbywać. Być może słabo sprecyzowałem swoją wypowiedź.
Go to the top of the page
+Quote Post
-=Peter=-
post 16.07.2011, 15:18:29
Post #8





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Cytat(AndyPSV @ 16.07.2011, 12:16:21 ) *
  1. function loadMod($m) {
  2. $uri = explode(';',$m); if(!empty($uri[1])) $m = $uri[0]; $pth = DIR_MOD.strtolower($m).N.INX.PHP; $q = q('SELECT id FROM `'.PRFX.'c0'.LG.'` WHERE url = "'.$m.'" LIMIT 1'); if(n_r($q) == 0) {
  3. if(file_exists($pth)) include_once($pth); else { header(LOC.URL,true,301); exit; } } else include_once(DIR_MOD.strtolower('pg').N.INX.PHP);
  4. } if(empty($_GET[0]) or substr($_GET[0],0,1) == '?') loadMod(PG_H_MOD); else { if(ctype_digit($_GET[0])) loadMod('ad'); else { if(ctype_digit(end(explode(',',$_GET[0])))) loadMod('ad'); else {
  5. if(substr($_GET[0],0,3) == 'buy') loadMod(substr($_GET[0],0,3)); elseif(is_dir('m/'.$_GET[0])) loadMod($_GET[0]); else {
  6. $q = q('SELECT id,t FROM '.PRFX.'ads WHERE uri = "'.$_GET[0].'" LIMIT 1'); if(n_r($q) > 0) { $ad = f($q); exit(header(LOC.URL._url($ad['t']).','.$ad['id'])); } else exit(header(LOC.URL));
  7. }
  8. }}


kod umozliwia otworzenie wszystkiego.


Nie zdziwię się jeśli to spaghetti otwiera też puszkę konserwową.


--------------------
Go to the top of the page
+Quote Post
Fifi209
post 16.07.2011, 16:44:34
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(Sagnitor @ 16.07.2011, 15:40:18 ) *
Wstawiłem kod bez filtracji i pokazałem miejsca, w których powinna sie odbywać.

Trzeba było podsunąć pomysł na filtrację skoro wiesz o co chodzi. smile.gif

Równie dobrze możesz dać kluczyki do auta 10-latkowi i powiedzieć, że może jechać gdzie chce.
Dałeś mu kod, jeszcze biedak użyje w takiej wersji bo może nie wie jak przefiltrować? 10 razy nic się nie stanie, za 11 ktoś wykorzysta brak filtracji.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
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: 25.06.2025 - 15:36