Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrócenie sprawdzania if(isset($_POST['zmienna']) dla kilku zmiennych
Forum PHP.pl > Forum > PHP
Apocalyptiq
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
kantek
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
Crozin
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.
Kildyt
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.
pejott
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.
Kildyt
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.
#luq
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
   )
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.