Autor Zpráva
Jcas
Profil *
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 *
Proč tak složitě?
Rellik
Profil
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 *
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;
		}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0