Autor | Zpráva | ||
---|---|---|---|
virgo86 Profil |
#1 · Zasláno: 2. 1. 2011, 18:12:35
Zdravím, mám problém s ověřením vstupních dat z formuláře.
script $firma = $_POST['firma']; $email = $_POST['email']; $telefon = $_POST['telefon']; $material = $_POST['material']; $kus = $_POST['kus']; $dodaci_termin = $_POST['dodaci_termin']; if (!filled_out($_POST)) { echo 'Nevyplnily jste formulář správně.' .' Zkuste to znovu.'; formular($language); konec(); exit; } funkce filled_out function filled_out($form_vars) { // testovani jesli neni prazdn7 formular //radek194 foreach ($form_vars as $key => $value) { if (!isset($key) || ($value == '')) return false; } return true; } Takto script funguje ale zjistí zda jsou zadaný všechny vstupní data když místo if (!filled_out($_POST)) zadám if (!filled_out($firma)) abych se zeptal pouze na tohle vstupní pole hodí mi to chybu: Warning: Invalid argument supplied for foreach() in c:\apache\htdocs\\menu_formulare.php on line 194 potřebuji ověřit zda uživatel zadal jenom povinné údaje? omlouvám se pokud někde už je podobné vlákno hledal jsem jen 15minut. |
||
Keeehi Profil |
#2 · Zasláno: 2. 1. 2011, 18:21:37
Jako vstup potřebuje foreach pole. Jelikož v proměnné $firma není pole ale nejspíše řetězec, tak st to zlobí.
byla by možnost to udělat takto: if (!filled_out(array($firma))) |
||
virgo86 Profil |
#3 · Zasláno: 2. 1. 2011, 18:24:06
no v knize se které se učím php to tak bohužel je. Rád použiji Vaši radu jak jiným způsobem ověřit vstupní data?
ještě se zeptám v knize je psano že musím proměným určovat o jaky jde datový typ integer atd. musí se to používat? to samé s tyto řádky je to potřeba? $firma = $_POST['firma']; $email = $_POST['email']; díky |
||
Tori Profil |
#4 · Zasláno: 3. 1. 2011, 09:22:20
virgo86:
> to samé s tyto řádky je to potřeba? > $firma = $_POST['firma']; > $email = $_POST['email']; Tohle se vám hodí, když budete chtít data z formuláře před dalším použitím prohnat nějakým filtrem, který z nich vyháže nepovolené znaky. A pokud to teď nepoužíváte, ušetříte si práci do budoucna, kdybyste to chtěl později tak udělat (ale to už je jen můj názor, dá se to i jinak). Btw - ze které knížky se učíte? Asi bych si upravila tu validační funkci, třeba takhle: function nactiPole($klic, $vychozi='', &$chyby=false) { if (isset($_POST[$klic]) && $_POST[$klic] != '') return $_POST[$klic]; // pokud bylo zadane pole pro chyby (=vyplneni je povinne), ulozi se sem // nazev nevyplneneho policka. if ($chyby !== false) $chyby[] = $klic; // pokud je zadana vychozi hodnota, vrat ji; jinak vrat false. return (!empty($vychozi) ? $vychozi : false); } $chyby = array(); // nejdriv se musi vytvorit pole pro chyby $firma = nactiPole('firma', '', $chyby); // povinne pole $material = nactiPole('material', 'ocel'); // nepovinne pole + vychozi hodnota if (!empty($chyby)) { echo 'Nebyla vyplněna všechna povinná pole!'; //..... } |
||
virgo86 Profil |
#5 · Zasláno: 3. 1. 2011, 17:54:37
Tori:
kniha se jmenuje PHP a MySQL rozvoj webových aplikací. Luke Welling a Laura Thomson Jsem dlouhodobý začatečník a pro začátek je to dobrá kniha na pochopení. nejak mi nefunguje Váš script i když ve formuláři nezadám firmu pustí mě to dále a e-mail se odešle. formulář: <?php require_once('fce.php'); //proměnná language urcuje v jakém jazyce se stránky zobrazí //proměnná page určí jaká stránka se zobrazí //proměnná folder je pro fotogalerii je zde proto aby lišta z volbou jazyků //správně vratíla zpátky tam kde se jazyk změnil titulek($language,$page,$folder); ?> <form method=post enctype="multipart/form-data" action="Novy1.php"> <table bgcolor=#D7D7D7> <tr> <td><strong>kontaktní údaje:</strong></td></tr> <tr> <td>Firma (Příjmení):<br /></td> <td valign=top><input type=text name=firma size=16 maxlength=16></td></tr> <tr> <td>E-mail:</td> <td><input type=text name=email size=30 maxlength=100 value="@"></td></tr> <tr> <td>Telefon:</td> <td><input type=text name=telefon size=30 maxlength=100></td></tr> <tr> <td><strong>údaje o poptávce:</strong></td></tr> <tr> <td>materiál:<br /></td> <td valign=top><input type=text name=material size=16 maxlength=16></td></tr> <tr> <td>počet kusů:</td> <td><input type=text name=kus size=30 maxlength=100></td></tr> <tr> <td>termín dodaní:</td> <td><input type=text name=dodaci_termin size=30 maxlength=100></td></tr> <tr> <td colspan=2 align=right> <input type=submit value="Odeslat poptávku"></td></tr> </table></form> <?php konec(); ?> <?php require_once('fce.php'); //proměnná language urcuje v jakém jazyce se stránky zobrazí //proměnná page určí jaká stránka se zobrazí //proměnná folder je pro fotogalerii je zde proto aby lišta z volbou jazyků //správně vratíla spátky tam kde se jazyk změnil titulek($language,$page,$folder); $firma = $_POST['firma']; $email = $_POST['email']; $telefon = $_POST['telefon']; $material = $_POST['material']; $kus = $_POST['kus']; $dodaci_termin = $_POST['dodaci_termin']; function nactiPole($klic, $vychozi='', $chyby=false) { if (isset($_POST[$klic]) && $_POST[$klic] != '') //podmínka je splněna je li isset($_POST[$klic]) a zaroveň $_POST[$klic] != '' pravdivá jinak false? //isset($_POST[$klic]) kotrola zda existuje proměnná pokud ano vrací true // $_POST[$klic] != '' testuje zda se nerovná proměnná prazdné hodnotě return $_POST[$klic]; // pokud bylo zadane pole pro chyby (=vyplneni je povinne), ulozi se sem // nazev nevyplneneho policka. if ($chyby !== false) $chyby[] = $klic; // pokud je zadana vychozi hodnota, vrat ji; jinak vrat false. return (!empty($vychozi) ? $vychozi : false); } $chyby = array(); // nejdriv se musi vytvorit pole pro chyby $firma = nactiPole('firma', '', $chyby); // povinne pole $material = nactiPole('material', 'ocel'); // nepovinne pole + vychozi hodnota if (!empty($chyby)) { echo 'Nebyla vyplněna všechna povinná pole!'; //..... } echo 'v pořádku'; konec(); ?> Prosím kde muže být chyba? funkci nactiPole() jsem popsál podmínku popsal jsem ji správně? díky za trpělivost. Neřiká Vám něco SPŠ elektrotechniky a informatiky v OV? |
||
Tori Profil |
#6 · Zasláno: 3. 1. 2011, 18:23:38
Chyba je v definici funkce:
function nactiPole($klic, $vychozi='', &$chyby=false) Co se týče konce skriptu, asi to mělo být takto: if (!empty($chyby)) { echo 'Nebyla vyplněna všechna povinná pole!'; formular($language); konec(); exit; } echo 'v pořádku'; „Neřiká Vám něco SPŠ elektrotechniky a informatiky v OV?“ Bohužel, studovala jsem jiný obor a mimo ČR, tohle je jen můj koníček a velmi sporadická brigáda. |
||
virgo86 Profil |
#7 · Zasláno: 3. 1. 2011, 18:43:43
Tori:
„Bohužel, studovala jsem jiný obor a mimo ČR, tohle je jen můj koníček a velmi sporadická brigáda“ to ja jenom že málo žen se zabyvá programovaním. > echo 'Nebyla vyplněna všechna povinná pole!'; > formular($language); > konec(); o tomhle vím stejně i tak by mi to nejprve vypsalo echo 'Nebyla vyplněna všechna povinná pole!'; „&$chyby=false“ když tam zadam ampersand tak mi to hodí chybu: Parse error: parse error, expecting `')'' in c:\apache\htdocs\nolkovo.cz\novy1.php on line 14 takže někde uvozovky ale nevím kde? pravě proto jsem myslel že jste omylem napsala &. |
||
Tori Profil |
#8 · Zasláno: 3. 1. 2011, 19:35:51
Ještě zpětně odpovídám:
"funkci nactiPole() jsem popsál podmínku popsal jsem ji správně?" ano, s tím, že druhá část podmínky (not empty) se testuje pouze v případě, že první část je splněna, čímž se zabrání chybové hlášce "Notice: Undefined index..." Ad chyba: netuším čím to je, mě to chybu nevyhazuje (použila jsem kopii z [#5] + ampersand). Nechte tam ampersand a zkuste vyhodit výchozí hodnoty od parametrů - mění se hláška? A když vše od začátku skriptu až před definici funkce zavřete do komentáře a budete od začátku postupně pouštět po kouskách - vyhodí chybu na stejném řádku? |
||
virgo86 Profil |
#9 · Zasláno: 4. 1. 2011, 17:05:27
Tori:
i když necham pouze řádek function nactiPole stejna chyba: /*titulek($language,$page,$folder); $firma = $_POST['firma']; $email = $_POST['email']; $telefon = $_POST['telefon']; $material = $_POST['material']; $kus = $_POST['kus']; $dodaci_termin = $_POST['dodaci_termin']; */ function nactiPole(&$chyby=false) { /* if (isset($_POST[$klic]) && $_POST[$klic] != '') //podmínka je splněna je li isset($_POST[$klic]) a zaroveň $_POST[$klic] != '' pravdivá jinak false? //isset($_POST[$klic]) kotrola zda existuje proměnná pokud ano vrací true // $_POST[$klic] != '' testuje zda není proměnná prazdná hodnota return $_POST[$klic]; // pokud bylo zadane pole pro chyby (=vyplneni je povinne), ulozi se sem // nazev nevyplneneho policka. if ($chyby !== false) $chyby[] = $klic; // pokud je zadana vychozi hodnota, vrat ji; jinak vrat false. return (!empty($vychozi) ? $vychozi : false);*/ } /* $chyby = array(); // nejdriv se musi vytvorit pole pro chyby $firma = nactiPole($chyby); // povinne pole //$material = nactiPole('material', 'ocel'); // nepovinne pole + vychozi hodnota if (!empty($chyby)) { echo 'Nebyla vyplněna všechna povinná pole!'; //..... } echo 'zadane hodnoty'; je možné že mi ten ampersand moje php nepodporuje? jdu zjistit jakou mám verzi php |
||
virgo86 Profil |
#10 · Zasláno: 4. 1. 2011, 17:09:37
tak verze PHP(4.1.1).
ale nevím jak zjistím zda tohle php podporuje ten & |
||
Časová prodleva: 3 dny
|
|||
Tori Profil |
#11 · Zasláno: 7. 1. 2011, 13:09:25
virgo86:
Omlouvám se, nevšimla jsem si odpovědi. Nevím, od které verze předávání odkazem funguje, každopádně jsou rozdíly v přiřazování výchozí hodnoty takovým parametrům. Druhá varianta je function nactiPole() { global $chyby; ... } |
||
virgo86 Profil |
#12 · Zasláno: 7. 1. 2011, 17:15:48 · Upravil/a: virgo86
Tori:
kouknu na to ale bohužel jsem si přeinstaloval php a dělá to jiné problémy. až budu mít tuto funkci hotovou hodim ji sem. |
||
virgo86 Profil |
#13 · Zasláno: 7. 1. 2011, 19:14:25 · Upravil/a: virgo86
Tori:
Tak problém byl opravdu ve verzi PHP ale na serveru je starší verze která to nepodporuje. „Druhá varianta je“ 1. Můžeš mi to více upřesnit nevím si rady. funkci zavolam jako minule? $firma = nactiPole('firma', '', $chyby); // povinne pole $material = nactiPole('material', 'ocel'); // nepovinne pole + vychozi hodnota a funkce bude vypadat jak? 2. Předešlý script jsem prostudoval co jsem nevěděl našel v knize a netu, ale pořád nechapu ten odkaz místo paramettru. Chápu to spravně že to pouze předá do funkce proměnnou $chyby=false ale jen pokud ji ve volaní funkce zadám: nactiPole('firma', '', $chyby); pokud tam nezadám $chyby tak podminka nebude splněna vně funkce. Mám v tom guláš:) můžeš mi to nejak vysvětlit ale pokud myslíš že je to semnou marné tak se na to vyprdni. |
||
Tori Profil |
#14 · Zasláno: 7. 1. 2011, 20:04:03 · Upravil/a: Tori
Var. 1 (předání odkazem):
Pokud při volání funkce zadáte jako 3.parametr proměnnou (s jakýmkoli názvem, třeba $allErrors), vytvoří se uvnitř funkce proměnná $chyby, která bude odkazovat na vnější proměnnou $allErrors. Tj. jakékoli změny proměnné $chyby se projeví i v $allErrors a naopak; různé názvy pro stejnou věc. Pokud ten parametr nezadáte, vytvoří se nová proměnná $chyby s hodnotou false a platností pouze uvnitř funkce. Podmínka tam je proto, že by bylo zbytečné ukládat chybovou hlášku do proměnné, která zanikne při ukončení funkce. (Ale podívejte se na ten odkaz v [#11], zadávání výchozí hodnoty v těchto případech funguje odlišně u PHP 5.0.4 a 5.2.4!). Var. 2 (global): K proměnným vně funkce lze přistupovat buď přes pole $GLOBALS (např. $GLOBALS['allErrors'] ), anebo klíčovým slovem global určit, že zadaná proměnná je odkazem na vnější/globální proměnnou stejného jména. Takže ta funkce nactiPole() by s global měla jen 2 parametry. Začátek její definice: function nactiPole($klic, $vychozi='') { global $chyby; ...atd. |
||
virgo86 Profil |
#15 · Zasláno: 8. 1. 2011, 15:07:40
Tori:
function nactiPole($klic, $vychozi='') { if (isset($_POST[$klic]) && $_POST[$klic] != '') //podmínka je splněna je li isset($_POST[$klic]) a zaroveň $_POST[$klic] != '' pravdivá jinak false? //isset($_POST[$klic]) kotrola zda existuje proměnná pokud ano vrací true // $_POST[$klic] != '' testuje zda není proměnná prazdná hodnota return $_POST[$klic]; $GLOBALS ['chyby']; // pokud bylo zadane pole pro chyby (=vyplneni je povinne), ulozi se sem // nazev nevyplneneho policka. if ($chyby !== false) $chyby[] = $klic; // pokud je zadana vychozi hodnota, vrat ji; jinak vrat false. return (!empty($vychozi) ? $vychozi : false); } $chyby = array(); // nejdriv se musi vytvorit pole pro chyby $firma = nactiPole('firma', '', $chyby); // povinne pole $material = nactiPole('material', 'ocel'); // nepovinne pole + vychozi hodnota if (!empty($chyby)) { echo 'Nebyla vyplněna všechna povinná pole!'; exit; //..... } echo 'zadane hodnoty '; echo $material; bohužel nepřijdu na to sám:( |
||
Tori Profil |
#16 · Zasláno: 8. 1. 2011, 15:57:00
oki,... tak teda:
function nactiPole($klic, $vychozi='', $povinne=false) { global $chyby; if (isset($_POST[$klic]) && $_POST[$klic] != '') return $_POST[$klic]; // pokud je vyplneni povinne (3.parametr je true), ulozi se sem nazev nevyplneneho policka. if ($povinne !== false) $chyby[] = $klic; return (!empty($vychozi) ? $vychozi : false); } Původně vlastně zadání/nezadání 3.param. určovalo, jestli je pole povinné, takže jsem tam doplnila něco podobného. Když kliknete na slovo "global" v kódu, pošle vás to rovnou do manuálu na příklady použití. |
||
virgo86 Profil |
#17 · Zasláno: 8. 1. 2011, 16:26:20
Tori:
díky docela lehke mohlo mě to napadnout. nezadal jsem ten třetí paramatr zmatlo mě: Začátek její definice: function nactiPole($klic, $vychozi='') { global $chyby; díky za trpělivost |
||
Časová prodleva: 13 let
|
0