| Autor | Zpráva | ||
|---|---|---|---|
| Jcas Profil * |
#1 · Zasláno: 16. 10. 2011, 11:11:13
Už ani nevím, jestli jsem tento styl kontroly formuláře někde odkoukal, nebo si ho vymyslel.
Každopádně jsem se teď docela potrápil s funkčností. Nicméně tento příspěvek vkládám jako návod a upozornění, aby se ostatní netrápili jako já. ps. Jsem absolutní amatér, tak to berte na vědomí. Zkušení programátoři mě asi ukamenují Struktura scriptu: Odešleme formulář, takže na str. např. index.php přijdou nějaké $_POST a ty potřebujeme zkontrolovat. A to udělám následovně. $formular=false; include './kontrola.php'; //prikazy v kontrola.php se provedou pouze, pokud byl form odeslan Jak vidíte, kontrolu mám v samotné souboru a její princip spočívá v tom, že při úspěšné kontrole přepíšu $formular=true. foreach($kontrola as $spravne) { //pokud neprosel kontrolou zobrazí se formulář
$spravne == false ? $formular = false : $formular = true;
}Také si všimněte komentáře. Komplet celý soubor kontrola.php mám v podmínce. if (isset($_POST['enter'])) Ve formuláři mám potom <input type="hidden" name="enter" /> Takže nyní v souboru index.php mohu jednoduše pokračovat s provedením určitých operací. Např: if($formular==true) {
mysql_query("UPDATE `uzivatele` SET `user` = '{$_POST['user']}', atd, atd);Tak dále. Proč používám pole? Je to z toho důvodu, abych odchytil, kde uživatel chybu a mohl mu násedně vypsat. V souboru kontrola.php zpracovávám jednotlivé $_POST if(empty($_POST['jmeno'])) { //kontrola vyplněnosti
$kontrola[1]=false;
}Nyní mám položu $kontrola[1] a mohu s ní pracovat na příslušném místě. if($kontrola[1]==false) {echo '<p style="color: red">Nebylo vyplněno jméno</p>';}A nyní se dostáváme k samotnému problému-prázdné pole. Když se podíváte na soubor kontrola.php, tak to teoriticky nemá chybu, ale nebude to fungovat. <?php
$kontrola=array();
//---------------KONTROLA FORMULARE-----------------------
if (isset($_POST['enter'])) {
$_POST['pohlavi'] = db_escape(trim($_POST['pohlavi'])); //odstranim bile znaky na zacatku a na konci
$_POST['plemeno'] = db_escape(trim($_POST['plemeno']));
$_POST['barva'] = db_escape(trim($_POST['barva']));
$_POST['kolekce'] = db_escape(trim($_POST['kolekce']));
$_POST['tetovani'] = db_escape(trim($_POST['tetovani']));
$_POST['cena'] = db_escape(trim($_POST['cena']));
if(empty($_POST['pohlavi'])) { //kontrola vyplněnosti
$kontrola[1]=false;
}
if(empty($_POST['plemeno'])) {
$kontrola[2]=false;
}
if(empty($_POST['barva'])) {
$kontrola[3]=false;
}
if(empty($_POST['tetovani'])) {
$kontrola[4]=false;
}
foreach($kontrola as $spravne) { //pokud neprosel kontrolou zobrazí se formulář
$spravne==false ? $formular=false : $formular=true;
}
}
?>Ta pointa je v tom, že pokud uživatel vyplní vše, tak není deklarován ani jeden prvek pole $kontrola (nenaplní se ani jedna hodnota) a díky tomu, že je pole prázdné, nedojde k přepsánní $formular. Takže script se bude chovat, jako by jsme kontrolou neprošli. Řešení je prosté. Stačí naplnit aspoň jeden prvek hodnotou. empty($_POST['plemeno'])==true ? $kontrola[1]=false : $kontrola[1]=true;
if(empty($_POST['plemeno'])) { //kontrola vyplněnosti
$kontrola[2]=false;
}
if(empty($_POST['barva'])) { //kontrola vyplněnosti
$kontrola[3]=false;
}
if(empty($_POST['tetovani'])) {
$kontrola[4]=false;
}Nyní to bude fungovat, protože $kontrola[1] vždy získá nějakou hodnotu. Buď true, nebo false. Takže při úspěchu vždy dojde k přepsání $formular. Závěr: Zaskočilo mě to z prostého důvodu. Tento styl používám už dlouho a vždy to perfektně fungovalo. Najednou to nefungovalo a nemohl jsem přijít na to proč. 1. includoval jsem soubor kontrola $formular=false; include './kontrola.php'; 2. provedl jsem kontrolu formuláře <?php
$kontrola=array();
//---------------KONTROLA FORMULARE-----------------------
if (isset($_POST['enter'])) {
$_POST['jmeno'] = db_escape(trim($_POST['jmeno'])); //odstranim bile znaky na zacatku a na konci
$_POST['prijmeni'] = db_escape(trim($_POST['prijmeni']));
$_POST['adresa'] = db_escape(trim($_POST['adresa']));
$_POST['email'] = db_escape(trim($_POST['email']));
$_POST['tel'] = db_escape(trim($_POST['tel']));
$_POST['user'] = db_escape(trim($_POST['user']));
$_POST['heslo'] = db_escape(trim($_POST['heslo']));
$_POST['heslo2'] = db_escape(trim($_POST['heslo2']));
if(empty($_POST['jmeno'])) { //kontrola vyplněnosti
$kontrola[1]=false;
}
if(empty($_POST['prijmeni'])) { //kontrola vyplněnosti
$kontrola[2]=false;
}
if(empty($_POST['adresa'])) { //kontrola vyplněnosti
$kontrola[3]=false;
}
if(empty($_POST['user'])) { //kontrola vyplněnosti
$kontrola[7]=false;
}
if(!empty($_POST['tel'])) { //kontrola formatu tel. xxx xxx xxx
$kontrola[4]=(!ereg("^[0-9]{3} [0-9]{3} [0-9]{3}$", $_POST['tel'])?false:true);
}
else {$kontrola[4]=false;}
if(!empty($_POST['email'])) { //kontrola emilu
$kontrola[5]=(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))?false:true;
}
else {$kontrola[5]=false;}
if(empty($_POST['heslo']) || empty($_POST['heslo2']) || $_POST['heslo']!=$_POST['heslo2']) { //kontrola hesla
$kontrola[6]=false;
}
//---------KONTROLA EXISTENCE UZIVATELE-------
//----------neprovede se pri uprave dat--------
if(!isset($_GET['upravit'])) {
//---SELECT COUNT(*) vrací počet řádků při splnění podmínky
$result = mysql_query("SELECT COUNT(*) FROM uzivatele WHERE user = '{$_POST['user']}'");
if (mysql_result($result, 0)) {// vrátí true, pokud user existuje. Jinak vrátí false
$kontrola[7] = false;
}
}
foreach($kontrola as $spravne) { //pokud neprosel kontrolou zobrazí se formulář
$spravne == false ? $formular = false : $formular = true;
}
}
?>3. měl jsem $formular, která říkala, jestli jsme prošli kontrolou, nebo ne. 4. měl jsem $kontrola[něco], která my řekla, kde uživatel udělal chybu. Ale všiměte si, že vždy se naplní nějaký prvek pole. if(!empty($_POST['email'])) { //kontrola emilu
$kontrola[5]=(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))?false:true;
}- správný email => true -špatný email => false Nyní mě opravdu zaskočila situace, kdy uživatel vyplni vše správně a přesto kontrola neprošla. |
||
| Unknow Profil * |
#2 · Zasláno: 16. 10. 2011, 11:36:53
Proč tak složitě?
|
||
| Rellik Profil |
#3 · Zasláno: 16. 10. 2011, 12:25:57
Unknow:
„Proč tak složitě?“ Souhlasím.. kontrola, která je obvykle na pár řádků je tady na pár souborů... A jako třešnička je ten skrytý input... |
||
| Jcas Profil * |
#4 · Zasláno: 16. 10. 2011, 15:21:38
Ano skrytý input je zbytečný, ale když se dívám na svůj soubor, tak na mě působí přehledně.
Proč tak složitě: Absolutně nemám tušení jak ubrat řádky v kontrola.php kontrola, která je obvykle na pár řádků je tady na pár souborů Pouze jsem tu kontrolu odsunul bokem, aby mi nepřekážela v index.php. Jo a jinak tam mám strašnou chybu: foreach($kontrola as $spravne) { //pokud neprosel kontrolou zobrazí se formulář
$spravne==false ? $formular=false : $formular=true;
}Takhle to nebude fungovat. Musí to být následovně. foreach($kontrola as $spravne) { //pokud neprosel kontrolou zobrazí se formulář
if($spravne==false) {
$formular=false;
} |
||
|
Časová prodleva: 14 let
|
|||
0