Portál AbcLinuxu, 26. dubna 2024 06:28


Dotaz: Jak kontrolovat pole

12.3.2012 16:33 Host ABCLinuxu
Jak kontrolovat pole
Přečteno: 393×
Odpovědět | Admin
Ahoj, poradil by někdo jak správně definovat pole s následnou kontrolou?

Kontroluji formulář pokud se vyskytne chyba dám třeba $error['mail'] = true;
$error = array(); // toto nevím jestli je dobře a jestli to tam má být
$error = false; // toto nevím jestli je dobře a jestli to tam má být

if(kontrola položky mail)
#Chyba, nastavíme
$error['mail'] = true;

if(kontrola položky name)
#Chyba, nastavíme
$error['name'] = true;

if(kontrola položky lastname)
#Chyba, nastavíme
$error['lastname'] = true;

if($error[] === false) // toto taky nevím jak přesně to pole kontrolovat ale potřebuji kontrolovat jestli to je opravdu === false
# Kontrola je OK
Díky za pomoc

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Tarmaq avatar 12.3.2012 17:48 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
$error = array();
$error = false;
ta prvni inicializace je zbytecna, tim prirazenim false se to prebije.. Resil bych to takto:
$errors = array();
if (!email_ok())
  array_push($errors, 'email');
if (!name_ok())
  array_push($errors, 'name');
if (!lastname_ok())
  array_push($errors, 'last_name');

if (!count($errors))
# Kontrola je OK
pripadne lze vypsat v kterych polozkach doslo k chybe, jsou vsechny v poli $errrors
Don't panic!
12.3.2012 17:49 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
$error = false; tam nedávej.

sizeof($error)==0 otestuje, zda je pole prázdné.

Dá se to udělat i bez toho pole $error:
try {
  if(kontrola položky mail)
    throw new Exception('mail');
  if(kontrola položky name)
    throw new Exception('name');
  if(kontrola položky lastname)
    throw new Exception('lastname');
  echo "Kontrola je OK";
} catch (Exception $e) {
  echo 'Chyba vstupu: ', $e->getMessage();
}
12.3.2012 18:21 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Chlapy to je sice hezký, ale oba případy se dají obejít. Já bych potřeboval kontrolovat i typ té proměnné, jelikož nechci uložit do mysql prázdná data, proto ta kontrola před samotný mysql_query(); Pokud by někdo spustil přímo ten script, tak by se provedl.

Tak že tohle
if (!count($errors))
# Kontrola je OK
i tohle
sizeof($error)==0
spustí mysql_query() a to aniž bych kontrolu formuáře udělal. Nevím, jestli se vyjadřuji k pochopení. Normálně bez použití pole bych to udělal asi takto takto a není způsob jak to prostřelit ;)
$error = true;

if(kontrola položky name)
$error = false;

if(kontrola položky email)
$error = false;

if(kontrola položky lastname)
$error = false;

if($error === true)
mysql_query(...............);
else
echo "existuje nejaka chyba ale nevim jaka jelikoz jsem to neulozil do pole";
12.3.2012 18:39 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
A tohle jsi nezkoušel? To funguje.
try {
  if(kontrola položky mail)
    throw new Exception('mail');
  if(kontrola položky name)
    throw new Exception('name');
  if(kontrola položky lastname)
    throw new Exception('lastname');
  mysql_query(...............);
} catch (Exception $e) {
  echo 'Chyba vstupu: ', $e->getMessage();
}
12.3.2012 18:46 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
To jsem nezkousel, objektové programování jde absolutne mimo mne, nemám v kódu ani čárku :-( Jiná moznost te nenapada?
Josef Kufner avatar 12.3.2012 19:09 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Tak si objektové programování napiš na TODO list hned za procedurální. Bez něj si totiž v současné době ani neuprdneš.
Hello world ! Segmentation fault (core dumped)
12.3.2012 19:35 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Napadá. Zabalit programování a jít dělat něco jiného. Dobře udělané objekty dokáží zkrátit aplikaci na třetinu a několikanásobně ji zrychlit, i když hlavním posláním je zvýšení přehlednosti.
Tarmaq avatar 12.3.2012 18:47 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
oba případy se dají obejít
Mohl bys nejak priblizit co tim myslis? Nevim kam tim miris.

Jinak moje varianta predpokladala, ze chces nejak treba vypsat uzivateli seznam spatne vyplnenych poli. Kitova varianta s vyhazovanim vyjimek je nejhezci, ale lze tak oznacit jen prvni chybne vyplneny vstup. Pokud ti jde ale jen o to udelat kontrolu, ze je vse ok, abys vedel ze muzes ukladat do db, tak je to nejlepsi varianta.
Don't panic!
12.3.2012 18:59 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
NN, pochopil jsi to zprávně, potřebuji opravdu vypsat každou chybu zvlášť, jelikož měním barvu inputu ve formu. Jinak jedná se mi o tohle, pokud by někdo zjistil název souboru a spustil by script přímo přes prohlížeč, tak nechci aby se ten kód zpracoval a uložil tak prázdná data z formuláře, jelikož ten soubor ve kterém je mysql_query je includován...
Příklad:
soubor kontrola_formulare.php
include('uloz_data.php');

soubor uloz_data.php //když tento soubor pustím přímo(obehdu soubor kontrola_formulare.php), tak se celý kód zpracuje (to nechci)
mysql_query(.............);

chci dát před mysql_query(); nějakou podmínku, která zajistí, že fyzicky kontrola formuláže opravdu proběhla a že žádná chyba neexistuje
12.3.2012 19:11 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
//když tento soubor pustím přímo(obehdu soubor kontrola_formulare.php), tak se celý kód zpracuje (to nechci)
Tak to udělej jako funkci a budeš mít klid.
Tarmaq avatar 12.3.2012 19:15 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Tento zpusob je dost vachrlaty a byt tebou tak bych se naucil programovat v PHP objektove, includovat soubor ktery rovnou neco dela vede k chybam - nejlepsi je si jen includovat/requirovat soubory obsahujici nejake tridy a ty si nainstancovat potom s nejakejma datama - nechci to moc rozebirat dopodrobna.
Jinak v te tvoji situaci by stacilo mit v souboru uloz_data.php toto:
if (isset($errors) && !count($errors)) {
  #insert_do_databaze..
}
PS: doufam, ze nemusim upozornovat ze si musis osetrit vstupy kvuli SQL Injection a ze bys mel mit vypnute register_globals
Don't panic!
Josef Kufner avatar 12.3.2012 19:20 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Jdeš na to špatně už na začátku.

Soubor uloz_data.php nesmí obsahovat nic, než definice funkcí. Tedy něco jako toto:
<?php
/*
 * uloz_data.php - Ulozi data do databaze
 * (c) 2012, Host ABCLinuxu
 * License: MIT
 */

function uloz_data($data)
{
  // místo tohoto doporučuju použít něco jako třeba dibi
  mysql_query("
    INSERT INTO tabulka
    SET x = '".mysql_real_escape($data)."'
  ");
  // vrátíme, kolik řádek se povedlo vložit
  return mysql_affected_rows();
}
No a potom v index.php uděláš něco takovéhoto:
<?php
/*
 * index.php
 * (c) 2012, Host ABCLinuxu
 * License: MIT
 */

require 'uloz_data.php';

$error = false;

if (/* policko neni vyplneno */) {
  $error = true;
}

if (!$error) {
  uloz_data($data);
} else {
  /* nastala chyba, zobrazit chybovou hlasku */
}
Uzavírací značky tam nejsou záměrně, aby se ti nedostávay různé nežádoucí bílé znaky do výstupu.

uloz_data.php by se mel jmenovat spis data.php a mel by obsahovat funkce uloz_data(), nacti_data(), a tak podobne.

Az se začneš zabývat objektově orientovaným programováním, tak to bude velmi podobné, jen to nebudou funkce, ale metody uvnitř třídy.
Hello world ! Segmentation fault (core dumped)
12.3.2012 19:09 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Díky. Myslím si, že stačí označit jen první nevyplněný vstup, protože všechna vstupní pole se obvykle testují už na klientské straně Javascriptem. To znamená, že na tento filtr narazí pouze uživatelé s vypnutým Javascriptem a injektoři. S těmi se zas tak mazlit nemusíme.

Těch testů by tam samozřejmě mělo být víc na nejrůznější paznaky ve vstupu, protože použití archaického mysql_query() je poněkud riskantní.
12.3.2012 19:53 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Díky moc za nakopnutí a příklad, funkce mě opravdu nenapadla, je to jednoduché a zcela bezpečné, ještě jednou díky..
12.3.2012 21:26 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
ještě mi není jasná jedna věc ;) Co přesně dělá tato podmínka?
if(!count($errors)){
...
}

Nemá tam být tohle?
if(count($errors) == 0){
...
}
Díky
pavlix avatar 12.3.2012 21:29 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
A rozdíl?
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
12.3.2012 21:44 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
To právě nevím, vím co dělá ta druhá podmínka, ale nevím co dělá ta první...
12.3.2012 21:46 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Malá nápověda: To samé.
12.3.2012 21:53 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
No to jsem vydedukoval ;) ale nechápu to zadání, pokud count() vrácí počet prvků v argumentu, kterým je typicky pole... co pak dělá !cout()? u klasického isset či empty je vykřičník pro otočení funkce ale tohle fakt nechápu
12.3.2012 21:57 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Jukněte na logické operátory a pak co je true a co false (chce-li někdo tak pravdivostní typ).
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.3.2012 22:19 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Hm, nevím co mi tím chcete říct ;-)
12.3.2012 22:33 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Místo dohadů si to vyzkoušej. Třeba takto:
echo 20,"--",!20,"\n";
echo 0,"--",!0,"\n";
13.3.2012 09:09 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Chtěl jsem říct aby jste se na to juknul, bo to když pochopíte, tak znáte odpovědi.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.3.2012 23:05 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Jak kontrolovat pole

Nic proti, ale takovehle !count() a pod. jsou akorat zdrojem neprehlednosti a omylu, ktere vedou k chybam. Podminka bud splnena je nebo neni, z cehoz vyplyva logicka hodnota true nebo false. A jestli nekde vidim nejake rozhodovani (if), ocekavam logickou hodnotu, protoze rozhodovani pochopitelne probiha na zaklade splneni nebo nesplneni podminky. Takze bud mam logickou hodnotu (v promenne nebo mi ji vraci fce), nebo musim porovnavat. A to bez vyjimek. A nemuzu se splest, jestli " " nebo "" nebo 0 nebo 1 nebo neco jineho je true nebo false (nebo neco jineho).

Mimochodem, kdyz 0 i 0.0 jsou false, proc "0" je false, ale "0.0" neni...

Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
12.3.2012 23:26 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Je dobré o tom vědět a také je dobré to použít jen tam, kde to má skutečně smysl. Asi nikde...

Sám mívám velké dilema například před použitím takového výrazu:
if($f=fopen('xx','r')){ ... };
Znalému programátorovi je to jasné, ale na první pohled si někdo může myslet, že jsem jen zapomněl jedno "=".
Josef Kufner avatar 12.3.2012 23:29 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Tohle se řeší kulatýma závorkama kolem přiřazení. gcc dkonce hází warning, že prej tam chybí buď '()' nebo '='.
Hello world ! Segmentation fault (core dumped)
13.3.2012 09:04 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Nechtěl jsem se k tomu vyjadřovat, bo se setkávám s tím, že je to považováno za kratší a přehlednější. Osobně tento zápis nepoužívám, protože se mi to nelibí, raději to explicitně vyjádřím, než se spolehnu na implicitní konverzi, nicméně ji člověk musí znát u daného jazyka, pokud chce porozumět cizím kódům.

Je to přece jenom netypový jazyk, takže implicitní konverze tam probíhají neustále.
K tomu proč není "0.0", odpovím obráceně:
Myslím si, že "0" je false proto, že 0 je false (což je obvyklé). Pokud například na 32bit PHP vytáhnete z DB hodnotu 64bit, tak je vrácena textově, takže pak by mělo nabývat 0 a "0" stejné logické hodnoty. Při případném i celočíselném výpočtu je tato text hodnota zkonvertována na double (což je super, když se to neví bo double má méně platných číslic než může mít 64bit int) a pak zpětné implicitní převedení tohoto čísla 0.0 na text generuje "0",ne "0.0". No a u čísel s plovoucí des. čárkou, nemusela "0.0" vzniknou s opravdu 0.0, ale s hodnoty jí silně podobné taky by to muselo být i třeba "0.00" apod. - není to prostě už hodnota, která implicitně vznikne.

PS: kdysi jsem dělal jeden specializovaný skriptovací jazyk, kde jsem měl definováno jako false , FALSE,0,0.0,'','0','0.0' , protože prostředí bylo hybridní, na vstupu se typy zadávaly a na výstupu ne, a toto mělo konzistentní chování (na rozdíl od PHP se hodnota 0.0 implicitně převáděla na "0.0"), nicméně testovat „plovoucí číslo“ na pravdivostní hodnotu je ujeté.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
12.3.2012 23:17 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Jak kontrolovat pole

IMHO velky - v prehlednosti, pochopitelnosti a logicnosti.

Vykricnik znamena negaci. Co je negaci integer hodnoty 20? Spravne, integer -20. Ale stale nikde nevidim tu logickou hodnotu, ktera by vyjadrovala pravdivost nebo nepravdivost podminky.

Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
Tarmaq avatar 13.3.2012 01:54 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
To je dost subjektivni, pro me je prehlednejsi a citelnejsi varianta s negaci.. predpokladam ze si nemyslis ze !20 == -20 a byl to spis nejakej matematickej rejp. Bezne pouzivam i dva vykricniky kdyz chci mit jistotu ze mi tam pristane boolean.. a nemyslim si ze by to byla nejaka programatorska uchylka :)
Don't panic!
pavlix avatar 13.3.2012 11:39 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
a nemyslim si ze by to byla nejaka programatorska uchylka :)
Je to programátorská úchylka. A dělám to taky.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
12.3.2012 23:16 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak teď už jsem úplně v pr**li :-( Tak jak to má tedy být správně?
12.3.2012 23:22 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Z toho si nic nedelej. Nekteri jedinci jsou lini napsat par znaku, proto radeji spolehaji na nejake automaticke konverze, ktere jim misto integer 0 vrati (radeji bych rekl mozna vrati) boolean false.
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
12.3.2012 23:26 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Tak každý píše jak se v tom vyzná nejlíp sám ;)

U mě je pravděpodobné, že to bude předělávat nějaký programátor tak asi bude lepší použít tohle, ne?
if(count($errors) == 0){
...
}
Josef Kufner avatar 12.3.2012 23:31 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Jo. Další, víceméně stejná a stejně čitelná možnost je:
if (!empty($errors)) { ...
Chová se to maličko jinak, viz dokumentace.
Hello world ! Segmentation fault (core dumped)
12.3.2012 23:30 Kit
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Správně je obojí, ale raději používej přehlednější zápis
if(count($errors) == 0) { ... }
Ušetříš si tím pár bezesných nocí při hledání chyby.
13.3.2012 11:49 Host ABCLinuxu
Rozbalit Rozbalit vše Re: Jak kontrolovat pole
Odpovědět | | Sbalit | Link | Blokovat | Admin
OK, ještě jednou všem moc děkuji ;)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.