Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML]Walidacja formularza
Forum PHP.pl > Forum > Przedszkole
nergla
Mam taki formularz:
  1. <?php
  2. if (count($_POST))
  3. {
  4.        $_POST['nazw'];
  5.        $_POST['imie'];
  6.        $_POST['miasto'];
  7.        $_POST['kod'];
  8.        $_POST['ul'];
  9.        $_POST['nr1'];
  10.        $_POST['nr2'];
  11.        $_POST['tel'];
  12.        $_POST['x1'];
  13.        $_POST['x2'];
  14.        $_POST['wys'];
  15.        $body='';
  16.        
  17.        
  18.  
  19.    $email = 'mail@gmail.com';
  20.    $subject = 'temat';
  21.    $message = 'Dziękujemy za wysłanie formularza';
  22.    $error = 'Wystąpił błąd podczas wysyłania formularza';
  23.    $charset = 'iso-8859-2';
  24.    
  25.    $head =
  26.        "MIME-Version: 1.0r\n" .
  27.        "Content-Type: text/plain; charset=$charsetr\n" .
  28.        "Content-Transfer-Encoding: 8bit";
  29.  
  30.    echo mail($email, $subject , $body, $head) ? $message : $error;
  31. }
  32. else
  33. {
  34. ?>
  35. <form action="?" method="post"><div id="info">Zamówienie dotyczy
  36. tylko czarnej folii o standardowej grubości 1,1mm, pozostałe rodzaje
  37. folii oraz usługi wykonywane na miejscu u klienta dostępne są na
  38. zamówienie telefoniczne.</div>
  39. <div id="subheader">Dane adresowe</div>
  40. Nazwisko: <input maxlength="60" size="18" name="nazw" /><br />
  41. Imię: <input maxlength="40" size="16" name="imie" /><br /><br />
  42. Miejscowość: <input maxlength="60" size="18" name="miasto" /><br />
  43. Kod pocztowy: <input maxlength="6" size="6" name="kod" /><br />
  44. Ulica: <input maxlength="60" size="16" name="ul" /><br />
  45. Numer domu: <input maxlength="4" size="2" name="nr1" /><br />
  46. Numer mieszkania: <input maxlength="3" size="1" name="nr2" /><br /><br />
  47. Telefon kontaktowy: <input maxlength="16" size="10" name="tel" />
  48. <div id="subheader">Wymiary folii</div>Wymiary: <input maxlength="3" size="2" name="x1" />x<input maxlength="3" size="2" name="x2" />
  49. <div id="subheader">Wysyłka<br /></div>
  50. <input name="wys" value="pobr" type="radio" />Kurier "OPEK" za pobraniem<br />
  51. <input name="wys" value="prze" type="radio" />Kurier "OPEK" przelew (przedpłata)<br />
  52. <input name="wys" value="osob" type="radio" />Odbiór osobisty
  53. <div id="info">Składając zamówienie oświadczają Państwo że zapoznali się z
  54. <a class="tex" href="regulamin.html">regulaminem</a>
  55. i akceptują jego warunki.<br /><input value="Zamów" type="submit" /> <input value="Wyczyść" type="reset" />
  56. </div></form>
  57. <?php
  58. }
  59. ?>


Chcę aby przed jego wysłaniem został on dokładnie sprawdzony pod względem poprawności tj. minimalna ilość znaków, czy są cyfry bądź litery lub inne znaki. Jeżeli formularz jest poprawnie wypełniony powinna pojawiać się stosowna informacja np. dane które podał klient i to czy potwierdza ich wysłanie bądź anuluje, jeśli natomiast są błędy powinno wyświetlić się okienko że wystąpił błąd. Chciałbym aby okienko było takie jak to przy użyciu onsubmit="alert()" aby nie kasować tego co wpisał klient.
Oczywiście zależy mi na wykożystaniu php a nie js.

Każda najmniejsza pomoc bardzo mile widziana smile.gif
peter13135
no skoro chcesz w php, to długość możesz sprawdzić przez strlen, poprawność maila to
  1. <?php
  2. function check_email($email)
  3.  {
  4.  if(!preg_match("/^([a-zA-Z0-9]+)([a-zA-Z0-9._-]*)@([a-zA-Z0-9_-]+)([a-zA-Z0-9._-]+)([a-zA-Z]+)$/" , $email))
  5.  return false;
  6.  return true;
  7.  }
  8. ?>


ale jak chcesz żeby było bez przeładowania strony to musisz to robić przez js
nergla
Cytat
ale jak chcesz żeby było bez przeładowania strony to musisz to robić przez js


No to niech będzie js. Tylko czy jak ktoś ma obsługe js wyłączoną to nie sprawdzi formularza i go wyśle czy poprostu nie będzie można go wysłać?
Zyx
Niestety - nie wolno robić kontroli danych wyłącznie po stronie klienta, chyba że lubisz kłopoty. Wyłącznie po stronie serwera może być, tu i tu też może, ale wyłącznie po stronie klienta - nigdy.

Funkcjonalność, o jakiej piszesz, oferują rozmaite systemy obsługi/budowania formularzy, które automatycznie wykonują odpowiednie operacje dla każdego pola na podstawie określonych przez programistę reguł. Znajdziesz je w każdym poważniejszym frameworku. Oczywiście ręcznie też można coś takiego pisać, lecz ilość pracy w stosunku do efektów jest zbyt duża. Nie wiem, na jakim poziomie stoisz z PHP, by Ci coś konkretnego dokładniej polecić.

PS. Od sprawdzania poprawności adresu e-mail to jest funkcja filter_var() z flagą FILTER_VALIDATE_EMAIL:

  1. <?php
  2. if(filter_var($email, FILTER_VALIDATE_EMAIL))
  3. {
  4.  echo 'OK';
  5. }
  6. ?>
peter13135
jak ktoś wyłączy js, to ci nie przefiltruje
najpierw zrób filtracje w php, potem ewentualnie w js

a ja bym polecał to zrobić tylko w php, z tym że aby nie tracić wpisanych danych, zrobić formularz w ten sposób
  1. <?php
  2. Imię: <input maxlength=\"40\" size=\"16\" name=\"imie\" value=\"$_POST['imie']\" />";
  3. ?>
nergla
Cytat
Niestety - nie wolno robić kontroli danych wyłącznie po stronie klienta, chyba że lubisz kłopoty. Wyłącznie po stronie serwera może być, tu i tu też może, ale wyłącznie po stronie klienta - nigdy.

Właśnie dlatego zależy mi na php a nie js.
Cytat
Funkcjonalność, o jakiej piszesz, oferują rozmaite systemy obsługi/budowania formularzy, które automatycznie wykonują odpowiednie operacje dla każdego pola na podstawie określonych przez programistę reguł. Znajdziesz je w każdym poważniejszym frameworku. Oczywiście ręcznie też można coś takiego pisać, lecz ilość pracy w stosunku do efektów jest zbyt duża. Nie wiem, na jakim poziomie stoisz z PHP, by Ci coś konkretnego dokładniej polecić.

Hmm... jak by to ująść, z php dopiero zaczynam tak samo jak z js ale duża znajomość c++ znacznie ułatwia mi sprawę.
Cytat
PS. Od sprawdzania poprawności adresu e-mail to jest funkcja filter_var() z flagą FILTER_VALIDATE_EMAIL:

  1. <?php
  2. if(filter_var($email, FILTER_VALIDATE_EMAIL))
  3. {
  4.  echo 'OK';
  5. }
  6. ?>

W tej chwili nie przyda się gdyż klient nie potrzebuje posiadać maila do wysłania formularza, ale napewno przyda się przy kolejnych stronach smile.gif
kantek
Prosze.

Daj sobie jedna wartość z form wysylek checked - coś będzie domyślne.

Przyklad okrojony (wywaliłem kilka pol aby nie było za długie - poradzisz sobie) czytaj komentarze

  1. <?php
  2. function sprawdz($tablica)
  3. {
  4.    foreach($tablica as $var){
  5.        //czy wypelniono wszystkie  pola
  6.        if(trim($var)==''){
  7.            echo 'Wszystkie pola musza byc wypelnione';
  8.            return false;
  9.        }
  10.    }
  11.    
  12.    //czy wymiary sa liczbami - jak ujemne to zamieniamy na dodatnie
  13.    $a = abs((int)$tablica['x1']);
  14.    $b = abs((int)$tablica['x2']);
  15.    
  16.    if($a * $b <= 0){
  17.        echo 'Wymiary musza byc liczbami calkowitymi, niezerowymi';
  18.        return false;
  19.    }    
  20.    
  21.    return true;
  22. }
  23.  
  24. if(isset($_POST['zamow'])){    
  25.    if(sprawdz($_POST)){
  26.        echo 'ok - wyslano i tu wysylasz sobie';
  27.    }
  28.    else{
  29.        //wypisz formularz z danym podanymi przez usera czyli np. gdzie
  30.        // name="nazw" wstawiasz value="$_POST['nazw']"; itd
  31.    }
  32. }
  33. ?>
  34. <form action="index.php" method="post"><div id="info">
  35.  
  36. Nazwisko: <input maxlength="60" size="18" name="nazw" /><br />
  37.  
  38. Wymiary: <input maxlength="3" size="2" name="x1" type="text" /> x <input maxlength="3" size="2" name="x2" type="text" /><br />
  39.  
  40.  
  41. <input name="wys" value="pobr" type="radio" checked />Kurier "OPEK" za pobraniem<br />
  42. <input name="wys" value="prze" type="radio" />Kurier "OPEK" przelew (przedpłata)<br />
  43. <input name="wys" value="osob" type="radio" />Odbiór osobisty<br />
  44.  
  45. <div id="info">Składając zamówienie oświadczają Państwo że zapoznali się z
  46. <a class="tex" href="regulamin.html" target="_blank">regulaminem</a>
  47. i akceptują jego warunki.<br /><br />
  48.  
  49. <input value="Zamów" type="submit" name="zamow" /> <input value="Wyczyść" type="reset" />
  50. </div></form>


a żeby sobie posprawdzać dlugości to strlen

Pozdrawiam
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.