gde je ovde problem

YuOnline

Početnik
Poruka
17
PHP:
<?php 
if (!isset($_POST['username']) || !isset($_POST['password']) ) {
		echo"Niste uneli potrebno podakte<br/>";
		echo"<a href='prijava.php'>Vratite se nazad</a>";
}
elseif (empty($_POST['username']) || empty($_POST['password'])) {
	echo "Polja za Lozinku i korisnicko ime su prazna<br/>\nVratite se nazad";
}
else {
		$username = $_POST['username'];
		$lozinka =  $_POST['password'];
		
		
		$veza = mysql_connect("localhost", "root", "") or die("Ne mogu se konektovati sa bazom");
		$izaberi = mysql_select_db("baza", $veza) or die("izaberite drugu bazu");
		$upit = mysql_query("SELECT * FROM user WHERE username='$username' AND userpass='$lozinka'", $veza);
		if (!$upit) die("<h1><center>Nemogu izvsiti upit</center></h1>");
		$redoj = mysql_num_rows($upit);
		if ($broj >0 ) {
			session_start();
			session_register('username');
			echo "Uspsno ste se prijavili";
			
} 
else {
	"Uneli ste pogresno ime ili lozinku";
}
}
?>

Uvek dobijam
Ne mogu izvrisi upit.
gde je problem
 
Problem je u tome što MySQL bazi šalješ sledeći upit:
Kod:
"SELECT * FROM user WHERE username='$username' AND userpass='$lozinka'"
i onda to parser isparisira tako da lozinka "postane" kolona koje verovatno nema u table.. Moraš drugačije da napišeš upit, ovako na primer
Kod:
"SELECT * FROM user WHERE username='". $username . "' AND userpass='" . $lozinka "'"
 
Kod:
if (!$upit) die("<h1><center>Nemogu izvsiti upit</center></h1>");

if(!$upit) zameni sa:

Kod:
while($info = mysql_fetch_array( $upit ))

pa onda u ovom delu nisi dobro napisao variable i sesion_start() mora ici na pocetak strane:

Kod:
 $[COLOR=Red]redoj[/COLOR] = mysql_num_rows($upit); 
        if ($[COLOR=Red]broj[/COLOR] >0 ) { 
           [COLOR=Red] session_start(); [/COLOR]

takodje:
Kod:
if (!isset($_POST['username']) || !isset($_POST['password']) ) { 
        echo"Niste uneli potrebno podakte<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad</a>"; 
} 
elseif (empty($_POST['username']) || empty($_POST['password'])) { 
    echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad"; 
}
(!isset($_POST['username']) i (empty($_POST['username']) rade potpuno istu stvar tako da nema potrebe za if i elseif vec jedno od ta dva izbaci...

Ovo je na prvi pogled , mozda ima jos gresaka, videces :-)
 
taksistaZR:
takodje:
Kod:
if (!isset($_POST['username']) || !isset($_POST['password']) ) { 
        echo"Niste uneli potrebno podakte<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad</a>"; 
} 
elseif (empty($_POST['username']) || empty($_POST['password'])) { 
    echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad"; 
}
(!isset($_POST['username']) i (empty($_POST['username']) rade potpuno istu stvar tako da nema potrebe za if i elseif vec jedno od ta dva izbaci...

Ovo je na prvi pogled , mozda ima jos gresaka, videces :-)
Milsim da gresis, mada kao sto rekoh, nisam strucnjak za PHP ali imam iskustva u drugim programskim jezicima:
- isset() testira da li je na primer u gornjem slcaju varijabla "username" uopste definisana, nije NULL, dakle njeno ime je navedeno u formi. Rezultat ce biti TRUE iako nije nista uneseno u varijablu, samo ako je postojala u formi.
- empty() testira da li je uopste uneseno nesto ili je varijabla PRAZNA. recimo namestio je varijanlu "username" u formu i zadao joj duzinu 10 karaktera. Ako korisnik samo klikne i ne unese stvarni username, varijabla ce biti i dalje 10 karaktera dugacka, ISSET() vraca true ali ce EMPTY() vratiti true i samim time upozoriti korisnika da treba da unese username!

Dakle, gornja konrstrukcija je korektna jer osim sto testira da li varijabla uopste postoji u formi (pa je samim tim i prenesena iz forme ovamo) testira da li je nesto uneseno ili je ostao inicijalni prazan 10 karaktera dugi sadrzaj.
Moze dakle biti da je varijabla setovana, ali nema sadrzaja, sto i treba da prouzrokuje opomenu...
 
Problem sa empty funkcijom je što nije preterano upotrebljiva, jer se neke vrednsoti promenljive takođe smatraju kao da promenljiva nema vrednost. Na primer ako promenljiva ima neku od sedećih vrednosti "" (prazan string), "0" (string koji sadrži samo karakter 0), 0, empty funkcija i dalje vraća true!
 
Da, poznat mi je taj problem kod PHP
Kod drugih jezika ako je varijabla karakter tipa i ima "0" kao unos, NIJE prazna ali kod PHP jeste.
Ali ako u drugim jezicima je varijabla numerik i uneses 0, EMPTY() vraca TRUE! sto je logicno
 
Zavisi od tačke gledišta, ali mi je uvek bilo totalno nelogično da je empty(0) - true!? Kako nešto i ništa mogu da budu isto? Nešto je empty ako nema nikakav sadržaj, kao na primer nil u Smalltalku ili null u Javi ili NULL u C/C++, a ne ako ima neki podrazumevani sadržaj/vrednost.
 
Ako govoris za PHP, slazem se sa tobom da je nelogicno da varijabla od jednog karaktera a glasi "0", bude na test EMPTY() proglasena za true.
Verovatno su to dizajneri koda preuzeli iz matematickog dela, gde varijabla 0 na test EMPTY() daje true.
 
codemaker:
Milsim da gresis, mada kao sto rekoh, nisam strucnjak za PHP ali imam iskustva u drugim programskim jezicima:
- isset() testira da li je na primer u gornjem slcaju varijabla "username" uopste definisana, nije NULL, dakle njeno ime je navedeno u formi. Rezultat ce biti TRUE iako nije nista uneseno u varijablu, samo ako je postojala u formi.
- empty() testira da li je uopste uneseno nesto ili je varijabla PRAZNA. recimo namestio je varijanlu "username" u formu i zadao joj duzinu 10 karaktera. Ako korisnik samo klikne i ne unese stvarni username, varijabla ce biti i dalje 10 karaktera dugacka, ISSET() vraca true ali ce EMPTY() vratiti true i samim time upozoriti korisnika da treba da unese username!

Dakle, gornja konrstrukcija je korektna jer osim sto testira da li varijabla uopste postoji u formi (pa je samim tim i prenesena iz forme ovamo) testira da li je nesto uneseno ili je ostao inicijalni prazan 10 karaktera dugi sadrzaj.
Moze dakle biti da je varijabla setovana, ali nema sadrzaja, sto i treba da prouzrokuje opomenu...

if (!isset($_POST['username']) || !isset($_POST['password']) ) {
Sto znaci ako je setovan $_POST username , a ne username kao ime u formi vec ako su podaci prosledjeni!
 
Koliko ja znam, ISSET() kontrolise da li varijabla uopste postoji a ne da li su prosledjeni.
Naime, ova funkcija se moze upotrebiti i za kontrolu da li neka vaijabla definisana, nezavisno da li je primamo iz neke forme ili iz tekuceg koda.
Ako prilikom slanja iz forme, varijabla "username" nije ni definisana, ISSET() vraca false.
ISSET() ne kontrolise da li su podaci prosledjeni vec da li postoji varijabla uopste. Naravno, logicki gledano, ako varijabla bude nadjena kao postojeca, znaci da je i prosledjena iz forme. Primarna namena ISSET() je da proveri postojanje varijable.

Medjutim, ta kontrola nije dovoljna, varijabla moze biti prosledjena ali nema sadrzaja uopste na primer. Ako je varijabla deifnisana kao " " (10 space) ali nije popunjena nicim, moras koristiti EMPTY() da vidis da li je sta uneto:
- zbog kontrole IISSET() da varijabla postoji (i jeste prosledjena samim tim)
- EMPTY() proverava da li je nesto uneseno ili je varijabla prazna bez konkretnog sadrzaja

Dakle, potrebno je koristiti obe funkcije da dobijemo dve neophodne informacije
 
Da, naravno, vidim da se radi o polju iz forme i baz zbog toga kazem da treba kioristiti ISSET() za detekciju da li je forma korektno uradjena pa da su polja nazvana "username" i "password" uopste definisana u formi, a i time da li su prosledjena.

Ono sto se ne razumemo izgleda je da nakon gornje kontrole mora da se koristi i EMPTY() za svaku od dve varijable da bi se videlo da nisu slucajno prenesene prazne, u kom slucaju su bezvredne jer su obavezne.

Na to sam skrenuo paznju u vezi tvog posta u kom tvrdis da ne treba ISSET() i EMPTY() vec je dovoljno samo ISSET()

Ili se ne razumemo u vezi neceg drugog pa ustvari tvrdimo jedno te isto a u vezi neceg razlicitog?
 
Pazi, ovako kako je napisano ne valja .. pored toga sto ima jednu proveru viska, proveravaju se podaci na pogresnom mestu...
Standardna procedura je if (!isset($_POST['variabla']) koju je on smestio na pogresno mesto i posle to isto odradio sa empty()... bas konfuzno

Taj deo koda ce uvek ispisati na pocetku poruke o gresci...
treba da stavi:
PHP:
if (isset($_POST['submit'])) //ako je pritisnuto submit dugme
 {
if (empty($_POST['username']) || empty($_POST['password'])) //proveri da li su polja prazna
 { 
    echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad"; //ako jesu ispisi poruku o gresci
} 
 }

ili

PHP:
if (isset($_POST['submit'])) //ako je pritisnuto submit dugme
 {

if ((!$_POST['username']) || (!$_POST['password']))  //proveri da li su polja prazna

{ 
        echo"Niste uneli potrebno podakte<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad</a>";  //ako jesu ispisi poruku o gresci

} 
}

Znaci bez dvostruke provere i ispis greske samo kad se pritisne submit dugme.
 
Stani, stano - zamrsili smo se... Ajmo iz pocetka da raskupusamo. Ovaj kod:
PHP:
<?php  
if (!isset($_POST['username']) || !isset($_POST['password']) ) {   // CRVENI
		echo"Niste uneli potrebno podakte<br/>"; 
		echo"<a href='prijava.php'>Vratite se nazad"; 
} 
elseif (empty($_POST['username']) || empty($_POST['password'])) {	// PLAVI
	echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad"; 
} 
else {								   // ZELENI
		$username = $_POST['username']; 
		$lozinka =  $_POST['password']; 
		 
		 
		$veza = mysql_connect("localhost", "root", "") or die("Ne mogu se konektovati sa bazom"); 
		$izaberi = mysql_select_db("baza", $veza) or die("izaberite drugu bazu"); 
		$upit = mysql_query("SELECT * FROM user WHERE username='$username' AND userpass='$lozinka'", $veza); 
		if (!$upit) die("<h1>Nemogu izvsiti upit"); 
	 $redoj = mysql_num_rows($upit);			 // PINK
		if ($broj >0 ) { 
			session_start(); 
			session_register('username'); 
			echo "Uspsno ste se prijavili"; 
			 
}  
else { 
	"Uneli ste pogresno ime ili lozinku"; 
} 
} 
?>
nije napisano po programskim standardima, ali ne vidim da ne valja, osim nekih napomena:

(naknadna ispravka posto sam delove koda obelezio bojama, otud izraz "crevni","plavi itd".. a onda mi je formatiranje pokupilo boje.. :(
Molim te koristi // CRVENI // PLAVI // PINK remarks da znas na koje delove koda sam mislio)


1. Crveni deo koda bi mogao da izvesti korisnika da jedna od potrebnih varijabli uopste nije definisana unutar forme, jer ISSET() nije nasao kao "setovanu". Znaci
echo"Niste uneli potrebno podakte<br/>";
da bude
echo"Forma ne sadrzi potrebna polja<br/>";

2. Plavi deo koda je korektno izvrsava ako prodje detekcija oba setovanja polja. Proverava da li je jedno od polja mozda prazno, sto ne sme da se desi. Fali deo:
echo"<a href='prijava.php'>Vratite se nazad";

3. Zeleni deo koda mi lici na sasvim korektno, i tu momak ima problem:
- nepravilna upotreba varijable u SQL upitu (bez tacaka, da se uzme sadrzaj)
- plus, kad to ispravi, verovatnoca da je pogresno uneo username/password kombinaciju

4. Pink deo koda ima gresku
$redoj = mysql_num_rows($upit);
if ($broj >0 ) {
gde ima gresku u nazivu varijable.

Da bi se razumeli o cemu pricamo, reci mi zato mislis da ovaj kod generalno nije pravilno napisan (osim gresaka koje sam naveo) i da su provere na pogresnim mestima i da ISSET() i EMPTY() jesu u koliziji, kao sto si napisao u prvom komentaru, pa smo onda u vezi toga veselo zamrsili diskusiju? :)
Ja tvrdim da je ISSET() i EMPTY() upotrebljeno sasvim korektno, ne stranu sto ima nekih gresaka u kodu ali generalno je logika pravilno usmerena. To je i bio smisao mog odgovora na tvoje tvrdnje da ISSET() i EMPTY() rade istu stvari i da ne treba obe da se koriste u gornjem slucaju.

Sto se mene tice kod je uredno logicki napisan:
1. Proveri da li varijable uopste postoje u formi ( ISSET() )
2. Proveri da nije neka od njih praznna ( EMPTY() )
3. Napravi upit u tabelu koristeci username/password

Bas me zanima gde smo se "mimoisli" Ako imas vremena, pokazi mi to "mimoilazenje" na postojecem kodu i nemoj stavljati druge primere kako bi sve moglo, jos vise komplikumemo stvari. Naravno da moze na 1000 nacina, ali sad govorimo o sasvim konkretnom kodu pa daj da njega "seciramo" :).
Zanima me gde smo se zamrsili




 
codemaker:
Ako govoris za PHP, slazem se sa tobom da je nelogicno da varijabla od jednog karaktera a glasi "0", bude na test EMPTY() proglasena za true.
Verovatno su to dizajneri koda preuzeli iz matematickog dela, gde varijabla 0 na test EMPTY() daje true.
Nije reč samo o PHP-u, ali da ne šririmo priču. Na osnovu naziva funkcije njeno ponašanje je potpuno nelogično. Da je naziv funkcije default, onda bi bilo logično.
 
Uh, stvarno smo se zamrsili... :-)

Ovako, taj prvi deo koda (crveni i plavi) treba da proveri da li su polja ussername i password popunjena od strane korisnika, tu se slazemo.

Kako je sada napisano, kada se stranica ucita crveni kod se izvrsava i ako nije setovan user i pass izbacuje poruku iz echo ispod :
Niste uneli potrebno podakte..

Kod:
if (!isset($_POST['username']) || !isset($_POST['password']) ) {   // CRVENI
        echo"Niste uneli potrebno podakte<br/>"; 
        echo"<a href='prijava.php'>Vratite se nazad";

Posto user i pass prilikom ucitavanja strane sigurno nisu setovani stalno ce prikazati tu poruku, a nama to ne treba... mislim da se tu slazemo.

Da nebi do toga doslo proverava se da li je user i pass popunjen samo kada se pritisne submit dugme na formi, a ne prilikom ucitavanja strane...(ovo je poenta oko koje se cini mi se razilazimo!:-))

Pretpostavio sam da nam covek nije dao ceo kod i da negde gore u kodu mora da stoji
Kod:
if (isset($_POST['submit'])) //ako je pritisnuto submit dugme izvrsi taj kod...
inace ako nema to dobice onu poruku prilikom prvog ucitavanja strane, a to nam ne treba.

E sad, kada imamo proveru da li je submit setovan netreba nam onaj crveni i plavi kod vec jedno od ona dva resenja koja sam naveo u prethodnom postu:
Kod:
if (empty($_POST['username']) || empty($_POST['password']))
ili
Kod:
if ((!$_POST['username']) || (!$_POST['password']))

Da se razumemo, radice njegov kod i ovako, ali ima tu gresku da ce prilikom ucitavanja strane izbaciti poruku kojoj tu nije mesto.


Sto se tice zelenog dela koda ocigledan je problem sa upitom, mislim da mu ono resenje sa tackama nece pomoci, ali neka proba .
Takodje treba proveriti upit sa print upit da vidimo sta dobija:
Kod:
$upit = mysql_query("SELECT * FROM user WHERE username='$username' AND userpass='$lozinka'", $veza); 
print_r( "$upit" );

Onaj deo sa sesijama sigurno ne valja, ali nek prvo sredi ovo gore pa nastavljamo. :-)
 
Pretpostavljam, ma da možda grešim, da se strana u kojoj se nalazi kod koji analiziramo izvršava tek kada se na nekoj drugoj strani pritisne dugme Submit, te je onda potpuno nepotrebna porvera da li je dugme pristnuto ili ne, a očekuje se da su promenljive username i password unete i samo se one i proveravaju.
 
@bojane i u tom slucaju situacija je slicna... nece se ispisati poruka o gresci posto nije na istoj strani, ali je taj prvi deo koda potpuno nepotreban onda posto ce se on uvek preskociti i moze komotno da se brise....

To sam i napisao ili samo :
Kod:
if (empty($_POST['username']) || empty($_POST['password'])) //proveri da li su polja prazna 
 {  
    echo "Polja za Lozinku i password su prazna<br/>\nVratite se nazad"; //ako jesu ispisi poruku o gresci 
}  
 }


ili


Kod:
if ((!$_POST['username']) || (!$_POST['password']))  //proveri da li su polja prazna 

{  
        echo"Niste uneli potrebno podakte<br/>";  
        echo"<a href='prijava.php'>Vratite se nazad</a>";  //ako jesu ispisi poruku o gresci 

}

Nema potrebe za duplom proverom, jel me razumes?
 
Kako trenutno izgleda kod jeste nepotrebna provera, ali se prva provera isset() koristi obično da bi se proverilo da li se na stranu došlo onako kako je autor planirao ili ne, na primer. U tom slučaju poruka je drugačija, ako je ima i obično se radi redirekcija.

Dakle, u ovom slučaju jeste dvostruka provera, ali u opštem slučaju nije.
 
Odlicno, sad smo ipak poceli da razmotavamo klupkom problema. :)
Cela stvar se zamrsila jer smo posli od dva razlicita scenarija.
1. Ja sam posao od predpostavke da je PHP samostalan i da fajl NE sadrzi i formu koja salje podatke
2. Ti si posao od predpostavke da je forma SATAVNI DEO ovog PHP fajla.

U tvom slucaju, ti si potpuno u pravu, treba izbeci da se pri prvom startu PHP (pre nego sto korisnik uopste vidi formu) vrsi provera, jer u tom momentu, varijable "usename" i "password" stvarno NISU setovane.. Samim tim i logika provere mora biti drugacija. I tada stvarno treba:
- proveriti da li je taster "submit" kliknut
- ako jeste, proveriti da li su varijable "username" i "password" setovane uopste (mozda je forma pogresno napisana, pa jedne varijable i nema u kodu)
- ako su obe varijable setovane (dakle prisutne u formi) proveriti da li su sa nekim sadrzajem (nisu EMPTY() )
----
- Ako taster "submit" nije aktiviran, nema potrebe za drugim kontrolama, dok se to ne desi
---


U mom slucaju, prepostavka je bila da je forma u nekom drugom HTML fajlu i da poziva taj PHP. Tada mi ne treba kontrola "submit" dugmeta, ne bih ni dosao do PHP da "submit" nije kliknut.
U mom slucaju, ipak ostajem pri tvrdnji da trebaju obe kontrole:
- ISSET() da vidim da nije forma slucajno falicna pa nedostaje jedna ili dve varijable kao INPUT
- EMPTY() ako su varijable setovane, da nije jedna od njih prazna

Onak kod sa greskom u pisanju naziva varijable ne treba ni komentarisati...

Nadam se da smo sad generalno rascistili polje za zavrsetak diskusije. Ti si u pravu sa "submit" cekiranjem samo ako je forma UNUTAR php fajla, inace je to nepotrebno. Razlikovali smo se samo u hiptezi, gde se u momentu rada, nalazi forma (u samom php ili u posebnom HTML)

Ono sto nismo rascistili je zasto mislis da ISSET() ne treba da bude upotrebljen pre EMPTY() kontrole? Kako ces onda resiti situaciju ako je forma falicno napisana pa je programer zaboravio da napise red gde je postavljen recimo "password" INPUT ?
Ponavljam, nisam ekspet za PHP, pa mozda gresim, ali po meni je linija:

if ((!$_POST['username']) || (!$_POST['password'])) //proveri da li su polja pra

nedovoljna, jer polje moze biti prisutno, moze imati i neki sadrzaj, makar 10 blank karaktera, ali to nije validno u takvom slucaju. Zbog toga nedostaje EMPTY() funkcija po meni


Ajde da to jos zavrsimo, pa da iskoristimo lep suncani vikend :)
 

Back
Top