Autor Zpráva
virgo86
Profil
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
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)))
ale vůbec se mi to nelíbí.
virgo86
Profil
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
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
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
Chyba je v definici funkce:
function nactiPole($klic, $vychozi='', &$chyby=false) 
- ampersand zajistí, že proměnná $chyby uvnitř funkce funguje jako odkaz či alias pro jinou proměnnou vně funkce, kterou předáte jako parametr. Vizte manuál.

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'; 
Nekopírovala jsem předtím úplně celý váš kód, šlo jen o ukázku principu.

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
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
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
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
tak verze PHP(4.1.1).
ale nevím jak zjistím zda tohle php podporuje ten &
Tori
Profil
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;
  ...
}
Ale používání global má nevýhodu, že když přejmenujete některou proměnnou, musíte zkontrolovat i všechny funkce, které by k ní mohly přistupovat pomocí global. V PHP4 by to nicméně fungovat mělo.
virgo86
Profil
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
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
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.
Ale musí se počítat s tím, že když přejmenujete proměnnou $chyby mimo funkci, musíte ji přejmenovat i uvnitř funkce.
virgo86
Profil
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
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
 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

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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