6. Článek – 2. část: Pokročilé zpracování formulářu prostřednictvím php.

 2011-12-08 00:00:00
 Dmitry Burobin

V této části vytvoříme formulář vhodný pro použití i na Vašem webu, ošetřeme všechna pole tagu form, přidame pole e-mail a udělame, aby při špatném zadáni dat se nam ta data nesmazala.

Co rozebereme:

1) Ošetření vstupních dat.
2) Vracení špatně zadaných dat, aby člověk nemusel všechno zadávat znovu, ale aby jenom změnil to co je špatně.

Ošetření vstupních dat.

Formulář vezmeme z minulého cvičení, akorat smažeme pole radio a přidáme pole e-mail. Takže vytvořte soubor index.php ve složce www nebo taky můžete vytvořit složku třeba my_web ve složce www a v ní uložit soubor index.php akorat v browseru budete zadávat http://localhost/my_web. Formulář bude vypadat následovně:


<html
  <
head
  <
meta http-equiv="content-type" content="text/html; charset=utf-8"
  <
meta name="generator" content="PSPad editor, www.pspad.com"
  <
title></title
  </
head
  <
body
   <
form action="" method="POST"
   <
table style="250px; border:3px solid black;"
    <
tr><td style="width:100px;">Jméno:</td
        <
td style="width:150px;"> <input type="text"  
name="jmeno" value=""></td></tr
      <
tr><td style="width:100px;">Príjmení:</td
        <
td style="width:150px;"> <input type="text"  
name="prijmeni" value=""></td></tr
        <
tr><td style="width:100px;">E-mail:</td>
        <
td style="width:150px;"> <input type="text"  
name="email"></td></tr>
      <
tr><td style="width:100px;">heslo:</td
        <
td style="width:150px;"> <input type="password"  
name="pass"></td></tr>               
      <
tr><td style="width:100px;">Zprava:</td
        <
td style="width:150px;"><textarea rows="5" cols="25" wrap="soft"  
name="text"></textarea></td></tr
      <
tr><td colspan="2" style="width:250px; text-align:right;"><input type="submit" name="go" value="Odeslat"></td></tr
      </
table
    </
form
  </
body
</
html
Takže uložíme ho do souboru index.php, formulář vypada takto.

Teď budeme pracovat jenom se souborem index.php a nebudeme se nikam odkazovat v atributu action. Pro ošetření vstupních dat použijeme funkce(najdete jejích popis u mě v databázi): htmlspecialchars, trim a strip_tags. Zase začneme tím, že ověříme, zda je tlačítko odeslat zmačknute nebo ne, pak vytvořime několik prázdných proměnných pomocí, kterých budeme vypisovat chyby na obrazovku a ošetřime vstupní data.
<?php
/*-------NOVE----------*/
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';     
$name htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$prijmeni htmlspecialchars(strip_tags(trim($_POST['prijmeni']))); 
$email htmlspecialchars(strip_tags($_POST['email']));
$pass htmlspecialchars(strip_tags(trim($_POST['pass'])));
$text htmlspecialchars(strip_tags(trim($_POST['text'])));
}
/*------KONEC----------*/
?>
<html
  <
head
  <
meta http-equiv="content-type" content="text/html; charset=utf-8"
  <
meta name="generator" content="PSPad editor, www.pspad.com"
  <
title></title
  </
head
  <
body
   <
form action="" method="POST">
.
.
.     
První řádek jenom ověři, zda je tlačítko odeslat zmačknute. Do proměnné $_ERR se budou zapisovat chyby jestli člověk zadal něco špatně, pak pomocí proměnné $_print budeme tyto chyby vypisovat. Poslední je to, že si vytvořime proměnné, kterým přiřadime hodnoty jednotlivých poli formuláře. Dal ověřime, zda jsou jednotlivá pole vyplněná a jestli ne tak do proměnné $_ERR zapišeme chybné hlašení.
<?php
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';     
$name htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$prijmeni htmlspecialchars(strip_tags(trim($_POST['prijmeni']))); 
$email htmlspecialchars(strip_tags($_POST['email']));
$pass htmlspecialchars(strip_tags(trim($_POST['pass'])));
$text htmlspecialchars(strip_tags(trim($_POST['text'])));
/*------NOVE----------*/
if(!isset($name) OR $name == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste jméno!</span>';   
      }
      elseif(!isset(
$prijmeni) OR $prijmeni == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste příjmeni!</span>';
      }
      elseif(
checkmail($email) === 0)
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste email 
nebo byl zadán špatně!</span>'

      }
      elseif(!isset(
$pass) OR $pass == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Zadejte heslo!</span>'
      }
      elseif(empty(
$text))
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Napište zpravu!</span>'
      }
}
/*------KONEC----------*/
?>
<html
  <
head
  <
meta http-equiv="content-type" content="text/html; charset=utf-8"
  <
meta name="generator" content="PSPad editor, www.pspad.com"
  <
title></title
  </
head
  <
body
   <
form action="" method="POST">
.
.
.     

Takže projdeme všechná pole a ověřime, zda je pole vyplněno a jestli ne tak vyplnime proměnnou $_ERR. Pak vidíme, že pole $email je ošetřeno funkci checkmail, kterou teď napišeme a umístime ji na úplný začátek souboru index.php a zároveň jsem použil tři znaménka rovnosti, což znamená, že porovnávame data nejenom podle toho, zda maji stejnou hodnotu, ale i podle toho jaký maji typ např. integer(celé číslo), string(řádky) a td.:
<?php
/*-------NOVE----------*/
function checkmail($mail){
$mail trim($mail); //odstranime mezery
if(strlen($mail)==0) return 0//jestli email ma nulovou delku vratit nulu
if(!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,20}
+([a-z0-9_-]){0,20}@(([a-z0-9-]+\.)+(com|net|
org|mil|"
."edu|gov|arpa|info|biz|inc|name|[a-z]
{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-"
.
"9]{1,3}\.[0-9]{1,3})$/is",$mail)) //jestli email neodpovida  
return 0//uvedenemu vyrazu, pak vratit nulu
return $mail//jinak vrat osetreny email
}
/*------KONEC----------*/
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';     
$name htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$prijmeni htmlspecialchars(strip_tags(trim($_POST['prijmeni']))); 
$email htmlspecialchars(strip_tags($_POST['email']));
$pass htmlspecialchars(strip_tags(trim($_POST['pass'])));
$text htmlspecialchars(strip_tags(trim($_POST['text'])));

if(!isset(
$name) OR $name == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste jméno!</span>';   
      }
      elseif(!isset(
$prijmeni) OR $prijmeni == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste příjmeni!</span>';
      }
      elseif(
checkmail($email) === 0)
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste email 
nebo byl zadán špatně!</span>'

      }
      elseif(!isset(
$pass) OR $pass == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Zadejte heslo!</span>'
      }
      elseif(empty(
$text))
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Napište zpravu!</span>'
      }
}
?>
<html
  <
head
  <
meta http-equiv="content-type" content="text/html; charset=utf-8"
  <
meta name="generator" content="PSPad editor, www.pspad.com"
  <
title></title
  </
head
  <
body
   <
form action="" method="POST">
.
.
.     
zatím Vám nebudu vysvětlovat regulérní výraz použitý pro ošetření emailu, řeknu jenom, že se v něm udáva co může být použito při vyplňování pole email(písmena, číslice a td), kolik jich může následovat(množstvi), trochu pozdějí napišu článek o regulérních výrazech. Tuto funkci můžete určitě použit u sebe na webu, protože ověřuje emaily zatím bezchybně :-).

Teď ověřime jestli je proměnná $_ERR prázdna a když není, tak vypišeme chybné hlášení.
<?php

function checkmail($mail){
$mail trim($mail);
if(
strlen($mail)==0) return 0;
if(!
preg_match("/^[a-z0-9_-]{1,20}+(\.){0,20}+([a-z0-9_-]){0,20}@(([a-z0-9-]+\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
"9]{1,3}\.[0-9]{1,3})$/is",$mail))
return 
0;
return 
$mail;
}
if(isset(
$_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';     
$name htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$prijmeni htmlspecialchars(strip_tags(trim($_POST['prijmeni']))); 
$email htmlspecialchars(strip_tags($_POST['email']));
$pass htmlspecialchars(strip_tags(trim($_POST['pass'])));
$text htmlspecialchars(strip_tags(trim($_POST['text'])));
      if(!isset(
$name) OR $name == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste jméno!</span>';   
      }
      elseif(!isset(
$prijmeni) OR $prijmeni == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste příjmeni!</span>';
      }
      elseif(
checkmail($email) === 0)
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Nezadal jste email 
nebo byl zadán špatně!</span>'

      }
      elseif(!isset(
$pass) OR $pass == '')
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Zadejte heslo!</span>'
      }
      elseif(empty(
$text))
      {
        
$_ERR.='<span style="color:red">Chyba:&amp;nbsp;Napište zpravu!</span>'
      }
 
/*------NOVE----------*/     
      
if($_ERR != '')
      {
        
$_print $_ERR;
      }
      else
      {
      echo
'
      <script>
      alert("Data jsou odeslána")
      </script>
      '
;
      }
 
/*-------KONEC--------*/     
}
?>
<html
  <
head
  <
meta http-equiv="content-type" content="text/html; charset=utf-8"
  <
meta name="generator" content="PSPad editor, www.pspad.com"
  <
title></title
  </
head
  <
body
/*------NOVE----------*/
<?php
echo $_print;
?>
/*-------KONEC--------*/
 <form action="" method="POST">
.
.
.     
Když se $_ERR nerovna ničemu, tzn že došlo k chybě, pak přiřadime proměnnou $_print k $_ERR, abysme následně vypsali chybné hlášení, proto použijeme operátor echo a před začátkem formuláře přidame echo $_print;. Jinak naskoči hláška o úspěšném vyplnění formuláře, pro kterou jsem použil funkci JavaScript alert.

Vracení špatně zadaných dat, aby člověk nemusel všechno zadávat znovu, ale aby změnil jen to co je špatně.

Proto, aby člověk nemusel vyploňovat všechna pole znovu, když chyboval při vyplňování jednoho, použijeme atribut value, do kterého, zase pomocí operátoru echo, vepišeme odpovídající proměnnou a to tak, že v atributu value ji zavoláme. V případě textu uděláme to samé mezi tagy textarea:

<html
  <
head
  <
meta http-equiv="content-type" content="text/html; charset=utf-8"
  <
meta name="generator" content="PSPad editor, www.pspad.com"
  <
title></title
  </
head
  <
body
Vypsat chybu jestli nastala:
<?php
echo $_print;
?>
 <form action="" method="POST"
   <
table style="250px; border:3px solid black;"
    <
tr><td style="width:100px;">Jméno:</td
        <
td style="width:150px;"> <input type="text"  
name="jmeno" value="
Vrátit jméno do formuláře:
<?php
echo $name;
?>
"></td></tr> 
      <tr><td style="
width:100px;">Príjmení:</td> 
        <td style="
width:150px;"> <input type="text"  
name="
prijmeni" value="
Vrátit příjmení do formuláře:
<?php
echo $prijmeni;
?>
"></td></tr> 
        <tr><td style="
width:100px;">E-mail:</td>
        <td style="
width:150px;"> <input type="text"  
name="
email" value="
Vrátit email do formuláře:
<?php
echo $email;
?>
"></td></tr>
      <tr><td style="
width:100px;">heslo:</td> 
        <td style="
width:150px;"> <input type="password"  
name="
pass"></td></tr>               
      <tr><td style="
width:100px;">Zprava:</td> 
        <td style="
width:150px;"><textarea rows="5" cols="25" wrap="soft"  
name="
text">
Vrátit zpravu do formuláře:
<?php
echo $text;
?>
</textarea></td></tr
      <
tr><td colspan="2" style="width:250px; text-align:right;">
<
input type="submit" name="go" value="Odeslat"></td></tr
      </
table
    </
form
  </
body
</
html>
Místo této konstrukci:
<?php
echo $neco;
?>
můžete použit:
<?php
<?=$neco?>
?> to je to samé, akorat musíte zapnou funkci short_open_tags v konfiguračním souboru php.ini, jen změnit její hodnotu z off na on a restartovat server. Hotový formulář by měl vypadat takto.

Tady mate hotový zdrojak k tomuto článku skript.

Závěr

Takže už umíme ošetřovat data, dále už budeme pracovat s databázemi. Omlouvam se za dlouhou neaktivitu, blíží se zkouškový období, tak se pořad učím, ale teď už doufam, že budu mít víc času. Mějte se krásně.

Systém Orphus
Napište komentář.
Celkem komenrářů(33)
Jeffpoonia - 2017-11-16  18:25:17
 Cialis Rezeptfrei Einkaufen Chewable Viagra Generic [url=http://cialtobuy.com ]cialis[/url] Terazoxin 2mg Buy Antibiotics Online Legal Amoxicillin And Doxycycline Together
Jeffpoonia - 2017-11-16  18:25:15
 Cialis Rezeptfrei Einkaufen Chewable Viagra Generic [url=http://cialtobuy.com ]cialis[/url] Terazoxin 2mg Buy Antibiotics Online Legal Amoxicillin And Doxycycline Together
Jeffpoonia - 2017-11-16  18:25:14
 Cialis Rezeptfrei Einkaufen Chewable Viagra Generic [url=http://cialtobuy.com ]cialis[/url] Terazoxin 2mg Buy Antibiotics Online Legal Amoxicillin And Doxycycline Together
Jeffpoonia - 2017-11-16  18:25:12
 Cialis Rezeptfrei Einkaufen Chewable Viagra Generic [url=http://cialtobuy.com ]cialis[/url] Terazoxin 2mg Buy Antibiotics Online Legal Amoxicillin And Doxycycline Together
HeadmassagerWeine - 2017-11-08  02:35:43
 scalp massager [url=http://hairmassager26.weebly.com] electric massager[/url]
HeadmassagerWeine - 2017-11-08  02:08:02
 electric massager [url=http://headmassager71.webpaper.co/] head massager[/url]
Ronweix - 2017-10-30  20:27:46
 Acheter Dapoxetine Usa [url=http://leviinusa.com]generic levitra professional[/url] Discount Clobetasol Best Website Sildenafil Citrate 100mg Prices Acheter Baclofene En France
Ronweix - 2017-10-27  15:34:49
 Comparaison Prix Viagra Cialis Levitra [url=http://cheapcheapvia.com]viagra[/url] Finasteride Precio Espana Propecia
Ronweix - 2017-10-27  15:34:48
 Comparaison Prix Viagra Cialis Levitra [url=http://cheapcheapvia.com]viagra[/url] Finasteride Precio Espana Propecia
Ronweix - 2017-10-27  15:34:46
 Comparaison Prix Viagra Cialis Levitra [url=http://cheapcheapvia.com]viagra[/url] Finasteride Precio Espana Propecia
Ronweix - 2017-10-27  15:34:45
 Comparaison Prix Viagra Cialis Levitra [url=http://cheapcheapvia.com]viagra[/url] Finasteride Precio Espana Propecia
Ronweix - 2017-10-21  18:31:18
 Compra Levitra Originale Dosificacion Kamagra Acheter Kamagra 100mg [url=http://costofcial.com]generic cialis[/url] Secure Tabs Viagra Viagra 4 Filmtbl 100 Mg Baclofene Nancy
Ronweix - 2017-10-16  13:08:32
 Comprar Cialis Albacete [url=http://levitrial.com]buy vardenafil 40 mg online[/url] Cialis O Levitra Que Es Online Valtrex Prescription
Ronweix - 2017-10-16  13:08:31
 Comprar Cialis Albacete [url=http://levitrial.com]buy vardenafil 40 mg online[/url] Cialis O Levitra Que Es Online Valtrex Prescription
Ronweix - 2017-10-16  13:08:30
 Comprar Cialis Albacete [url=http://levitrial.com]buy vardenafil 40 mg online[/url] Cialis O Levitra Que Es Online Valtrex Prescription
Ronweix - 2017-10-16  13:08:28
 Comprar Cialis Albacete [url=http://levitrial.com]buy vardenafil 40 mg online[/url] Cialis O Levitra Que Es Online Valtrex Prescription
Ronweix - 2017-10-13  12:02:03
 Viagra 100 Mg Pulmonary Hypertension Predisone Pills For Sale From Canada [url=http://cheaplevi.com]levitra canada[/url] Cialis In Svizzera
Ronweix - 2017-10-13  12:02:01
 Viagra 100 Mg Pulmonary Hypertension Predisone Pills For Sale From Canada [url=http://cheaplevi.com]levitra canada[/url] Cialis In Svizzera
Ronweix - 2017-10-13  12:02:00
 Viagra 100 Mg Pulmonary Hypertension Predisone Pills For Sale From Canada [url=http://cheaplevi.com]levitra canada[/url] Cialis In Svizzera
Ronweix - 2017-10-13  12:01:59
 Viagra 100 Mg Pulmonary Hypertension Predisone Pills For Sale From Canada [url=http://cheaplevi.com]levitra canada[/url] Cialis In Svizzera
[1] [2] 
*v komentářich nesmíte používat sprostá slova a odkazy!!!Děkuji za pochopeni.