Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skrócenie sprawdzania if(isset($_POST['zmienna']) dla kilku zmiennych, Optymalizacja kodu pod względem czytelności i objętności :)
Apocalyptiq
post
Post #1





Grupa: Zarejestrowani
Postów: 230
Pomógł: 3
Dołączył: 8.01.2008

Ostrzeżenie: (10%)
X----


Dosyć uciążliwe jest sprawdzanie wszystkich potrzebnych zmiennych dla obsługi każdego formularza danego serwisu w php (szczególnie dotkneło mnie to podczas pisania gry via www, gdzie jest pełno formularzy):
  1. <?php
  2. if(empty($_POST['login']) || empty($_POST['pwd']) || empty($_POST['pwd2']) || empty($_POST['email']) || empty($_POST['teamName']) || empty($_POST['teamColor']) || empty($_POST['teamSubColor']))
  3.        $_SESSION['mesg']='Wypełnij wszystkie wymagane pola!';
  4.    else{...}
  5. ?>

I tego typu fragmentów kodu mam tam sporo, ale to pytam ogólnie, co do wszelkich projektów smile.gif Narazie wymyśliłem coś takiego:
  1. <?php
  2. # isset dla określonych zmiennych w tablicy
  3. function isset_array_vars($array,$vars){
  4.    $notset_vars=array();
  5.    foreach($vars as $key => $var)
  6.        if(!isset($array[$key])) $notset_vars[]=$var;
  7.    if($notset_vars) return implode(', ',$notset_vars);
  8.    else return true;
  9. }
  10.  
  11. # zastosowanie:
  12.    $check_isset=isset_array_vars($_POST,array('login'=>'login','pwd'=>'hasło','pwd_repeat'=>'powtórzone hasło'));
  13.    if($check_isset!==true)
  14.        $_SESSION['mesg']='Nie podałeś wszystkich wymaganych danych ('.$check_isset.')';
  15.    else{...}
  16. ?>

Jeżeli wszystkie podane zmienne są ustawione w danej tablicy, funkcja zwraca true, w przeciwnym wypadku - wyprzcinkowane nazwy (spolszczone, zrozumiałe dla człowieka) niepodanych zmiennych. No ale jest to jakoś mi sie wydaje na siłe zrobione, mam przeczucie że można to zrobić lepiej :-)
Macie jakieś pomysły albo patenty ze swoich projektów? smile.gif

Ten post edytował Apocalyptiq 19.04.2009, 10:27:46


--------------------
http://estender.net - profesjonalne strony i aplikacje internetowe (Ruby on Rails, Kohana PHP)
Go to the top of the page
+Quote Post
kantek
post
Post #2





Grupa: Zarejestrowani
Postów: 73
Pomógł: 15
Dołączył: 2.04.2009
Skąd: koszalin

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


Czy na pewno to działa??

Bo tam masz sprawdzanie isset($tablica['klucz']) np. $_POST['login'],
a jak zatwierdzisz submitem formularz i pola są niewypełnione
to i tak te zmienne z tablicy post 'są set' smile.gif tyle ze są empty.

Pozdrawiam


--------------------
kantek.com.pl
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Yyy...
  1. <?php
  2.  
  3. if(!isset($_POST['username'], $_POST['password'], $_POST['abc'])){
  4.  
  5. }
  6. ?>
A co do tego by to automatycznie zwracało jakieś komunikaty... zainteresuj się pojęciem walidatora bo żadko kiedy będziesz ograniczął się do sprawdzenia podano/nie podano.
Go to the top of the page
+Quote Post
Kildyt
post
Post #4





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

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


Po co foreach? Ja bym to zrobił na pętli. For będzie najlepsze.
Jak już kantek napisał: rozróżnij isset i empty.

  1. <?php
  2. $check_isset=isset_array_vars($_POST,array('login'=>'login','pwd'=>'hasło','pwd_repeat'=>'powtórzone hasło'));
  3.   if($check_isset!==true)
  4.       $_SESSION['mesg']='Nie podałeś wszystkich wymaganych danych ('.$check_isset.')';
  5. ?>

Zmieniłbym na:
  1. <?php
  2. if($check_isset=isset_array_vars($_POST,array('login'=>'login','pwd'=>'hasło','pwd_repeat'=>'powtórzone hasło')))
  3.       $_SESSION['mesg']='Nie podałeś wszystkich wymaganych danych ('.$check_isset.')';
  4. ?>

TRUE powinno zwracać, jeżeli któreś pole zostało niewypełnione, a FALSE gdy wszystko jest dobrze.


--------------------
Go to the top of the page
+Quote Post
pejott
post
Post #5





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Cytat(Kildyt @ 19.04.2009, 14:02:46 ) *
TRUE powinno zwracać, jeżeli któreś pole zostało niewypełnione, a FALSE gdy wszystko jest dobrze.


Trochę to nielogiczne, zważywszy na nazwę funkcji.
Poza tym, foreach to też pętla.
Już ktoś napisał, abyś zainteresował się walidatorami, bo zazwyczaj sprawdzasz kilka rzeczy na raz.

Na przykład, http://framework.zend.com/manual/en/zend.validate.html.

Pozdrawiam.
Go to the top of the page
+Quote Post
Kildyt
post
Post #6





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

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


Cytat(pejott @ 19.04.2009, 15:24:55 ) *
Trochę to nielogiczne, zważywszy na nazwę funkcji.
Poza tym, foreach to też pętla.
No tak, to już zależy od programisty jak sobie wszystko ustali, jednak napisałem tak, gdyż moim zdaniem prościej jest najpierw podawać komunikaty o błędzie nie "wykrzykując" warunku.
Wiem, że forach to pętla. Trochę nielogicznie napisałem posta. Przepraszam. Chodzi mi o to, że IMHO lepiej i łatwiej można by to zrobić na pętli for.


--------------------
Go to the top of the page
+Quote Post
#luq
post
Post #7





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Ja bym napisał tak:

  1. <?php
  2. function validArray( $arr, $value, &$error ){
  3.    $cntValue = count( $value );
  4.    for( $i = 0; $i < $cntValue; $i++ ){
  5.       if( !array_key_exists( $value[$i], $arr ) ){
  6.           $error[] = $value[$i];    
  7.       }
  8.       elseif( empty( $arr[ $value[$i] ] ) ){
  9.           $error[] = $value[$i];
  10.       }
  11.    }
  12.  
  13.    // return
  14.    if( count( $error ) == 0 ){
  15.        return true;
  16.    }
  17.    else{
  18.        return false;
  19.    }
  20. }
  21. ?>


Przykład:
  1. <?php
  2. $table = array(
  3.    'login' => 'luq',
  4.    'pass' => 'asdf',
  5.    'data' => ''      
  6. );
  7.  
  8. $mustBe = array(
  9.    'login', 'pass', 'data', 'id'
  10. );
  11.  
  12. if( !validArray( $table, $mustBe, $err ) ){
  13.    echo '<pre>';
  14.    print_r( $err );
  15.    echo '</pre>';
  16. }
  17. ?>


Zwróci false i wyświetli:
Kod
   Array
   (
       [0] => data
       [1] => id
   )


--------------------
Moja gra - scraby.io
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 Aktualny czas: 20.08.2025 - 20:29