gde je ovde problem

Nisi primerio "elseif"
elseif (empty($_POST['username']) || empty($_POST['password'])) {
echo "Polja za Lozinku i korisnicko ime su prazna<br/>\nVratite se nazad"

Znaci ako je sa ISSET() sve ok, proverava i EMPTY()
Ako ISSET() ne prodje test do testa na prazno ni ne dolazi..
 
Znaci oko prvog smo se dogovorili :-) moze samo empty() provera i potpuno ce isto da radi sa ili bez onog gornjeg dela.

Sto se drugog dela tice mislim da nisi pazljivo pogledao ... stavio sam:

if ((!$_POST['username']) | (!$_POST['password']))

i nema dalje potrebe za elseif empty() posto ovo vraca false ako nije nista uneto u polje.
pazi nema u ovom slucaju !isset kapiras razliku :-)
 
Prvo da me ne razumes pogresno. Sve ovo sto pokusavam da rascistimo, ne cinim to da bih dokazao tebi da gresis, vec samom sebi da objasnim u cemu je nase razmimoilazenje. To mi moze samo koristiti, pogotovo kod PHP u kom zaista nisam strucnjak, vec primenjujem analogiju iz drugih jezika, sto se tice logickih postavki. verovatno cu i ja iz svega ovog nesto nauiciti, sto mi je i cilj. Cisto da me ne shvati spogresno, ne bih to zeleo.

Dakle, NISMO se dogovorili oko prvog.
ISSET() treba da se cekira zajedno sa EMPTY() jer prvo cekira da li uopste postoji red u formi:
<input type="text" name="username" blabla... >
i
<input type="text" name="password" blabla... >

Drugi (EMPTY() cekira da nije slucajno PRAZNA jedna od varijabli, mada postoje ali nista nije uneto. Za mene te dve stvari nisu iste i treba OBE testirati, pre nastavka rada. testiranje na ISSET() je za savimn drugu vrstu testiranja u idnosu na EMPTY(), oba testiranja se MORAJU izvesti...
Jedino nisam siguran a mrzi me da ciram na internetu (ti ces mi reci) je da li EMPTY() i if ((!$_POST['username']) testiraju istu stvar (da li je varijabla prisutna ali praznog szdrzaja)

To sto ne treba cekirati "submit" button je ok ako je forma izvan PHP fajla, ali sama cinjenica da je "submit" pritisnut" ne znaci da u formi postoje oba INPUT dela za dve varijable, kao sto ne znaci da ako INPUT kod postoji za obe varijable, jedna od njih nije prazna.

Da uprostim moju tvrdnju u vezi redosleda tesiranja (pseudo kod naravno):
FORMA JE UNUTAR PHP FAJLA
1. Proveri da li je "submit" pritisnut (setovan)
2. ako nije idi na 8
3. proveri da li su obe varijable setovane (postoje uopste) ISSET()
4. ako nisu - povratak
5. Proveri da nije jedna od njih prazna EMPTY()
6. ako jedna jeste prazna ili obe - povratak
7. odradi sta treba i zavrsavaj ili id na neku definisanu stranu
8. otvaraj formu itd...


FORMA JE U NEKOM DRUGOM FAJLU
1. proveri da li su obe varijable setovane (postoje uopste) ISSET()
2. ako nisu - povratak
3. Proveri da nije jedna od njih prazna EMPTY()
4. ako jedna jeste prazna ili obe - povratak
5. odradi sta treba i zavrsavaj ili id na neku stranu definisanu

To je sustinska razlika, izmedju onoga sto ti kazes i sto ja misim o tome.
Daj da vidimo zasto se ne slazemo, jer mi se ne svidja cinjenica da problem ne vidim isto kao ti pa ne znam da li ja gresim ikli ti gresis, u svakom slucaju korist je za obojicu ;)
 
Vidim da se mimoilazimo oko toga treba li proveravati da li su obe varijable setovane (postoje uopste) ISSET() ....

Ja tvrdim da ne treba ta provera, vec je dovoljno samo empty() posto ako je greska u formi ponovo ce taj empty() biti prazan i dobicemo poruku o gresci.

Druga stvar, ja sam malo traljavo napisao u prvom postu da obe provere rade istu stvar, ne rade. Trebao sam reci preciznije, ili samo koristi empty() ili cisto proveri da li postoji sadrzaj za slanje !$_POST['username'] .
Mislim da sam i napisao u poruci da sam pogledao kod na brzinu pa je i odgovor bio takav.

Da li je kod na istoj strani gde i forma (odnosno dugme) potpuno je nebitno, razlika je u nekim sitnicama odnosno koja ce se od te dve greske ispisati.

Code ti imas server i php pa isprobaj to na delu:
Kod:
Napravi obicnu formu
<form method="post" action="login.php"> 
    <input type="text" name="password"> 
    <input type="text" name="username">
  <input type="submit" name="submit" value="Submit">
</form>
Napravi login.php
Kod:
<?
if (!isset($_POST['username']) || !isset($_POST['password']) ) {   
        echo"Niste uneli potrebno podakte<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad"; 
} 
elseif (empty($_POST['username']) || empty($_POST['password'])) {   
    echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad"; 
} 
else echo "OK";
?>
Isprobaj ovo, pa zatim obrisi onaj prvi deo i ostavi samo if(empty..., videces da je potpuno isto, zatim defektuj polja u formi...ponovo isto

ili probaj onaj drugi kod za proveru koji sam napisao:
Kod:
<?
if ((!$_POST['username']) || (!$_POST['password'])) 
{  
        echo"Niste uneli potrebno podakte<br/>";  
        echo"<a href='prijava.php'>Vratite se nazad</a>"; 
}  
else echo "OK";
?>
Videces da i to isto radi kao i prethodni itd...

Probaj to ako hoces pa se cujemo kasnije da saberemo utiske i zavrsimo ovo :-)

Ja ne mislim za sebe da sve znam o php-u , imam jos dosta toga da ucim. Mozda i gresim u svemu ovome i voleo bih da znam ako je tako.
Eto sad kad sam procitao onaj prvi svoj post vidim da sam izvalio jednu gresku :-), odnosno nisam dobro objasnio ono sto sam hteo...

Poz @code stvarno bih voleo da isprobas to .
 
Evo, probao na mom serveru i rezultati su sledeci:

PHP:
 <?
if (!isset($_POST['username']) || !isset($_POST['password']) ) {   
        echo"Provera uz ISSET() nije uspela, nedostaje barem jedno polje za INPUT<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad"; 
} 
if (empty($_POST['username']) || empty($_POST['password'])) {   
    echo "Polja postoje ali provera EMPTY() nasla da je barem jedno polje PRAZNO<br/>\nVratite se nazad"; 
} 
else echo "OK";
?>
Jedno polje jednostavno ne psotoji u formi:
jednopoljefaliissetpostoji-1.jpg





---------------
PHP:
 <?
if (!isset($_POST['username']) || !isset($_POST['password']) ) {   
        echo"Provera uz ISSET() nije uspela, nedostaje barem jedno polje za INPUT<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad"; 
} 
if (empty($_POST['username']) || empty($_POST['password'])) {   
    echo "Polja postoje ali provera EMPTY() nasla da je barem jedno polje PRAZNO<br/>\nVratite se nazad"; 
} 
else echo "OK";
?>
Jedno od polja je prazno, a jedno ima neki sadrzaj:
jednoodpoljaprazno-1.jpg



------------------
PHP:
 <?
if (empty($_POST['username']) || empty($_POST['password'])) {   
    echo "Polja postoje ali provera EMPTY() nasla da je barem jedno polje PRAZNO<br/>\nVratite se nazad"; 
} 
else echo "OK";
?>
Oba polja sam izbacio iz forme, evo sta prijavljuje ovaj kod, uopste ne prijavljuje da NEMA varijabli:
obapoljafalealinematestaisset-1.jpg




------------

PHP:
 <?
if (empty($_POST['username']) || empty($_POST['password'])) {   
    echo "Polja postoje ali provera EMPTY() nasla da je barem jedno polje PRAZNO<br/>\nVratite se nazad"; 
} 
else echo "OK";
?>
Ostavo samo jendo polje a jedno fali, rezltat je:
jednopoljefalialinematestaisset-1.jpg



----------

PHP:
 <?
if ((!$_POST['username']) || (!$_POST['password'])) 
{  
        echo"Niste uneli potrebno podakte<br/>";  
        echo"<a href='prijava.php'>Vratite se nazad"; 
}  
else echo "OK";
?>
jednog polja nema a drugom sam uneo sadrzaj, puca na jendom polju a oprijavljuje i da nema sadrzaja:
jednopoljefalialidrugoimasadrzajnem-1.jpg



--------------

PHP:
 <?
if ((!$_POST['username']) || (!$_POST['password'])) 
{  
        echo"Niste uneli potrebno podakte<br/>";  
        echo"<a href='prijava.php'>Vratite se nazad"; 
}  
else echo "OK";
?>
Nisam ni jednu varijablu ostavio u formi, izvestaj je konfuzan a i program puca...
alternativnikodnijednavarijablanepo-1.jpg


Zakljucak po meni:
Veoma je bitno iz razloga kompletnog testa sta forma salje, da se koristi ISSET() u kombinaciji sa EMPTY() To iz razloga sto ISSET() i EMPTY() nikako ne testiraju istu stvar i nikako ne mogu da se koriste za iste namene.
ISSET() se koristi iskljucivo za testiranje POSTOJANJA varijable iz forme
EMPTY() se testira da li varijabla uopste ima sadrzaj (a ne da li postoji ako nema vec sadrzaj)

Drugi primer koda i bez ISSET() i EMPTY() (zadnja dva primera) pokazuju da je takvo testiranje tek nepravilno, jer pre svega ako nema varijable, program puca a i ne testira to sto hocemo i kako hocemo.

Tvrdnja da i ako funkcija EMPTY() prijavi da nema sadrzaja, to pokriva i slucaj ako uopste nema varijable, ne moze se u programerskom smislu smatrati korektnom. U dva razlicita slucaja moramo kontrolisati stvarno stanje:
- Postoje li sve potrebne varijable u formi (ili da li su im imena identicna u PHP i u formi)
- Ako postoje, da li imaju sadrzaj

U ta dva slucaja, koristimo razlicite funkcije, da bi tacno ustanovili sta je problem i dali odgovorajucu poruku korisnku. Ako ne koristimo ISSET(), nego samo EMPTY() na primer ( a nijedna varijabla u formi na primer nije definisana) i funkcija vrati poruku da fale podaci a ne kaze da nema zapravo varijabli, velika je greska.

Potrebno je dakle testirati DVE stvari, jedna bez druge ne vrede mnogo u programerskom smislu a i u smislu upotrebljivosti koda sa strane korisnika:
1. Da li varijable uopste postoje (jedna vrsta poruke se salje korisniku ake ne postoje)
2. Ako postoje, da li imaju sadrzaj (ako nemaju saje se druga vrsta poruke korisniku)
 
Au @code ti k'o da pricas na spanskom, a ja na kineskom... :-)

1.Cilj tog dela koda nije da proverava da li polja postoje u formi, vec da li su popunjena. To se moze zakljuciti iz poruka koje su spremne:
echo"Niste uneli potrebno podakte<br/>";
echo"<a href='prijava.php'>Vratite se nazad</a>";
i
echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad";

Na programeru je da kroz kod obezbedi sve potrebne podatke u formi koje treba da se proslede i ako njih nema obicna poruka o tome da tih podataka nema korisniku ama bas nista ne znaci... Taj kod je neupotrebljiv i ne zavrsen, korisnik takve informacije i ne treba da dobija

Korisnik treba da dobije poruku da li je zaboravio da upise neki podatak u formi i nista vise!

2. Kao sto se vidi iz tvojih primera nijednom nije proslo ono else echo "OK!" odnosno deo koda koji treba da se izvrsi ako su oba polja popunjena. To je poenta! Zabraniti da se ostatak koda izvrsi sve dok se ne popune sva polja iz forme :-) Bilo da si izostavio polje iz forme ili namerno poslao prazno polje uvek se kod tu zavrsava i onaj deo ispod se ne izvrsava, a to se i htelo tom proverom :-) razumes?




codemaker:
Zakljucak po meni:
Veoma je bitno iz razloga kompletnog testa sta forma salje, da se koristi ISSET() u kombinaciji sa EMPTY() To iz razloga sto ISSET() i EMPTY() nikako ne testiraju istu stvar i nikako ne mogu da se koriste za iste namene.
ISSET() se koristi iskljucivo za testiranje POSTOJANJA varijable iz forme
EMPTY() se testira da li varijabla uopste ima sadrzaj (a ne da li postoji ako nema vec sadrzaj)
Slazem se da ne testiraju istu stvar, ali se ne slazem da je bitno da se koriste zajedno posto je isset u ovom slucaju suvisan.
codemaker:
Drugi primer koda i bez ISSET() i EMPTY() (zadnja dva primera) pokazuju da je takvo testiranje tek nepravilno, jer pre svega ako nema varijable, program puca a i ne testira to sto hocemo i kako hocemo.
Kako to mislis program puca? Nista ne puca, ponovo dobijas poruku o gresci da nisu popunjena polja i sve radi ok!
Ona Notice: poruka nikada nesme da dodje do korisnika, to sluzi tebi dok pises kod da vidis gde su greske i kada je kod zavrsen slicnih poruka kao sto je ta nesme da bude inace je kod pun bugova :-)
Znaci ne puca program vec ispravis tu gresku i onda ako se nista ne popuni u poljima forme dobijas poruku da se vratis i popunis to...
codemaker:
Tvrdnja da i ako funkcija EMPTY() prijavi da nema sadrzaja, to pokriva i slucaj ako uopste nema varijable, ne moze se u programerskom smislu smatrati korektnom. U dva razlicita slucaja moramo kontrolisati stvarno stanje:
- Postoje li sve potrebne varijable u formi (ili da li su im imena identicna u PHP i u formi)
- Ako postoje, da li imaju sadrzaj

U ta dva slucaja, koristimo razlicite funkcije, da bi tacno ustanovili sta je problem i dali odgovorajucu poruku korisnku. Ako ne koristimo ISSET(), nego samo EMPTY() na primer ( a nijedna varijabla u formi na primer nije definisana) i funkcija vrati poruku da fale podaci a ne kaze da nema zapravo varijabli, velika je greska.
O tome sam i malo pre govorio, koju gresku jedino treba da dobije korisnik i da kod sa npr. greskom u formi nikada nece stici na server posto se sve greske tipa onog notice: moraju resiti pre, a ne slati korisniku poruku o tome.
codemaker:
Potrebno je dakle testirati DVE stvari, jedna bez druge ne vrede mnogo u programerskom smislu a i u smislu upotrebljivosti koda sa strane korisnika:
1. Da li varijable uopste postoje (jedna vrsta poruke se salje korisniku ake ne postoje)
2. Ako postoje, da li imaju sadrzaj (ako nemaju saje se druga vrsta poruke korisniku)
Opet isto i isto i isto...
 
Prosto imam osecaj da se ti salis samnom kad odgovara na ono sto napisem. Ja pricam jedno a ti koristi druge argumente. Najpre si rekao da mora ISSET() za dugme submit pa posle pristao da ne treba. I tako u svakoj poruci neko totalno nerazumevanje, mozda se stvarno i salis ali smatram da veoma gresis u programskom pristupu problemu.

Bez namere da te vredjam, daleko od toga, na kraj mi pameti nije, postujem tvoj trud, ali moram ti reci, da kada bih ja programirao na tako nesiguran i nepotpun nacin, ne bih se bas nesto hleba programerskog najeo. Stvarno se nadam da me nisi pogresno razumeo. Bas zbog toga mislim da moramo prekinuti ovu diskusiju.

1. Bez ISSET() funkcije neces moci validno detektovati da li varijabla postoji pa da bezbedbno ides u dalji test
2. Bez EMPTY() funkcije neces znati da li je korisnik nesto uneo (to ti ISSET() nece reci, jer varijabla moze biti duzine 10 karaktera ali blankova)
3. Samo koriscenje !$_POST['username'] nacina detekcije ne vredi jer puca kad nema varijable
itd..
O cemu mi pricamo?

Pa kod "pucanja" ce doci od glupog ispisa ako ne uradim ISSET() Znaci onaj deo koda ne vredi nista. A ne mozes ga zahvatiti bez ISSET()

Na trecem primeru, korsitili samo EMPTY i nijedne varijable nema u formi, prijavljuje da su zapravo prazne a ne da ih NEMA. To nije programiranje!

Na cetvrtom primeru jedna varijable nema a druga je prazna, prijavljue samo da je prazna varjabla, ne kaze da jedne nema! Tako ne moze!

U petom primeru (!$_POST['username']) koristimo, prijavljuje gresku jer varijabla nije definisana. Ne mozes to tako uhvatiti i izdati odgovarujucu poruku jer ce vec samim dolaskom na !$_POST['username'] program pucati! Moras bas zbog toga korstiti ISSET() da mozes reci nema varijable i izdati poruku, ovako samo dobijes poruku o gresci u kodu

Ista stvar za sesti primer

Ne vidim nacina da ti objasnim gde je problem.
Naravno da ni u jednom slucaju ne stignemo do "OK" jer smo namernno pravili greske.

Slazes se da ISSET() i EMPTY() ne testiraju istu stvar ali ipak smatras da ISSET() ne treba koristiti. A kada onda treba?

I na kraju, nije bila diskusija o tome kakve poruke korisnik treba ili ne treba da vidi (jer to je sasvim jasno) vec je bila diskusija da li treba obezbediti kvalitetnije i preciznije pracenje ili ne. Kako si ti predlozio, ISSET() je ispalo nepotreban a samim tim i veoma vazna stavka testiranje nepotrebna. Pa naravno da korisnik nece videti tu gresku ako NEMA varijable jer je neko zaboravio da izmeni kod kako valja, dobice neku poruku koja ce mu omoguciti da nastavi negde drugde ili slicno. Ali MORA postojati i ta ISSET() provera da bi tu gresku zahvatio, i to je sustina onoga sto pricam.

Hipoteticka situacija je kad NEMA vairijabli na primer, mora se ipak korisniku nesto reci i ne samo to nego ga ne mozemo vratiti na istu stranu da ponovi istu gresku! Da bi to mogli tacno znati sta je u pitanju (a ne samo uosteno nakon EMPTY() testa), moramo koristiti ISSET()!! Zatim ga vracamonegde drugde da ne ide ponovo na formu koja je falicna. A gde da vratim korisnika ako mi program samo prijavi da "nedostaju podaci" koristeci samo EMPTY(), a u stvari jedna varijabla uopste nije dfinisana u formi a jedna je prazna?

Posle si rekao da je dovoljno EMPTY() samo, sto sam ti pokazao da nije.

Pa si predlozio i !$_POST['username'] nacin sto sam ti opet na tvojim primerima pokazao kako radi a ne valja tako jer treba i ISSET().

Ocigledno ne ide..

Ok, ne razumemo se, ti radi kako mislis da treba ja cu kako mislim da treba jer ovde govorimo vec o logici programiranja a tu imam jako mnogo godina iskustva tako da ne mogu prihvatiti falicna i nepotpuna kodiranja o kojima ti govoris.

Stvarno nemam vremena da rastezemo ovo. Testirao sam ono sto si rekao, pokazao gde i sta se desava ali se i dalje ne razumemo.

Ti idi bez ISSET() ja cu sa njime i sve ok, dzaba diskutujemo kad se ne razumemo.
Mislim da smo diskusiju o ovom zavrsili
Pozdrav, idemo dalje
 
Ok @code posto ne mogu da te uverim u ono o cemu pricam jedino da pogledas , ako hoces , neke primere na internetu pa da se sam uveris. Pogledaj npr http://php.about.com/od/finishedphp1/ss/php_login_code_4.htm imas primer login forme i da ja nebi duzio izdvojicu ti nacin na koji se ovde proverava da li su polja popunjena:
Kod:
// makes sure they filled it in
if(!$_POST['username'] | !$_POST['pass']) {
die('You did not fill in a required field.');
}
Kao sto vidis to je jedan od nacina koji sam ti objasnjavao , ali ti uporno tvrdis da to ne moze tako i da tu kod puca...
Pronacicu ti ako hoces i primere za empty() jer sigurno i on radi isto sto i ovo gore itd..
Pogledaj i sam neke skripte za login pa ces se valjda uveriti da je ono gore nepotrebno . To ne znaci da nece raditi sa tim, ali je nepotrebno (oko toga je i pocela ova diskusija...)

Sa ovim i ja zavrsavam diskusiju o ovome...
Poz :-)
 
Da, zavrsavamo samo da kazem da ovaj kod ne puca samo ako su obe varijable PRISUTNE u formi, sto he slucaj u 99.999% formi. Ako se iz nekog razloga desi da pri renoviranju forme izostane jedno polje greskom, ili u PHP prilikom nekih izmena se pogresno otkuca "usrname" umesto "username" - program veselo puca sa porukom o indexu neodgovarajucem itd.. puca jer ne moze naci varijablu da je testira. Nema sanse da zaobidjes osim ako koristis ISSET().

Dakle gornji kod se moze koristiti bezbedno ako nikad ne bude problema sa postojanjem varijabli.
Napravi primer i ostavi onakvo testiranje a izostavi jednu varijablu. Probaj sa zahvatis gresku a da se ne pojavi ono "Undefined index: username in c:\blablabla..." Neces izbeci tu liniju greske, osim ako ISSET() ne odradi koretnu kontrolu postojanja.

Ajmo da jurimo nove probleme, yebes ovaj vec je prezvakan..
 

Back
Top