Problemi sa login formom

Pozz svima ja sam novi na forumu i poceo sam uciti php prije tjedan dana i dosao sam do jednog dijela koji mi nije jasan. Ovako imam u root folderu index.php i mapu inc/css. U inc mapi mi je connect.php za spajanje na bazu i to radi odlicno, medjutim index.php izgleda ovako

<?php
   include ("inc/connect.php");
   include ("inc/settings.php");
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="description" content="" />
	<meta name="author" content="" />
	<meta name="keywords" content="" />
	<meta name="copyright" content="" />
	<meta name="generator" content="" />
	<title>Testing PHP</title>
	<link href="css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <div id="container">
    <div id="header"><h1>PHP dinamic pages</h1></div>
    <div id="nav">Navigation</div>

    <div id="main">
      <div id="sidebar"><?php include ("inc/login.php"); ?></div>
      <div id="content"><?php include ("inc/news.php"); ?></div>
    </div>

    <div id="footer">
      <p>Copyright &copy; 2013 by PHP dinamic pages</p>
    </div>
  </div>
</body>
</html>

a u inc folderu se nalazi connect, login, setting, news. Problem se javlja sa loginom, prvo kada se logiram i sesija zapocne kada upisem u link localhost/cms/inc/login.php izbaci mi formu iako sam logiran. A i ovaj kod login.php mi isto javlja seljedece greske kada ne upisem nista i kliknem na submit buton radi ono sto sam htjeo trazi da se oba polja popune, ako upisem samo password trazi da se oba polja popune, a kad upisem samo username pise da korisniko ime ne postoji u bazi iako nisam upisao lozinku i ako upisem tocno lozinku i korisnicko ime pise mi invalid username password combination. U bazu podataka sam dodao manual korisniko ime i lozinku sha1 evo code pa pls recite sta nevalja

<?php

   include ("connect.php");

   // check if user is logged
   if (isset($_SESSION['logged'])) {
 
     echo "Welcome <b>" . " " . $us;
 
   } else {
 
    // if is pressed submit button
	if (isset($_POST['submit'])) {
	
		if (isset($_POST['username']) && isset($_POST['password'])) {
		 
		   $user = htmlentities($_POST['username']);
		   $pass = sha1($_POST['password']);
		 
		   // check if both fields are filled
		   if (empty($user) || empty($pass)) {
			  echo "Both fields are required!";
		   } else {
		    
			  // check if username exist in database
			  $checkuser = mysql_query("SELECT `username` FROM `users` WHERE `username` = '".mysql_real_escape_string($user)."'") or die (mysql_error());
			  if (mysql_fetch_array($checkuser)) {
			  
				// check if username and password is match
				$checkuserpass = mysql_query("SELECT * FROM `users` WHERE `username` = '".mysql_real_escape_string($user)."' AND `password` = '".mysql_real_escape_string($pass)."'") or die (mysql_error());
				$r = mysql_fetch_array($checkuserpass);
				if ($r == 1) {
				  
					// if all ok log user and start session
				    $_SESSION['logged'] = 1;
					$us = $r['username'];
				
				} else {
				   echo "Invalid username, password combination!
Please try again.";
				}
							
			  } else {
			     echo "That username don't exist in database! 
Please register.";
			  }
			
		   }
		 
		}
	
	}
 
   ?>
   <!-- is user not logged show login form -->
   <form action="" method="POST">
	  <input type="text" name="username" placeholder="Username">

	  <input type="password" name="password" placeholder="Password">

	  <input type="submit" name="submit" value="Login">
   </form>
   <?php
 
   }
 
?>

[php]

<?php include ("connect.php"); // check if user is logged if (!empty($_SESSION['logged'])) { echo "Welcome " . " " . $us; } else { // if is pressed submit button if (isset($_POST['submit'])) { if (isset($_POST['username']) && isset($_POST['password'])) { $user = htmlentities($_POST['username']); $pass = sha1($_POST['password']); // check if username exist in database $checkuser = mysql_query("SELECT `username`, `password` FROM `users` WHERE `username` = '".mysql_real_escape_string($user)."'") or die (mysql_error()); if (mysql_num_rows($checkuser) == 1) { $r = mysql_fetch_assoc($checkuserpass); if($r['username'] == $user && $pass == sha1($row['password'])) { // if all ok log user and start session $_SESSION['logged'] = 1; $us = $r['username']; } else echo "Invalid password combination! Please try again."; } else echo "That username don't exist in database! Please register."; } else echo "Both fields are required!"; } //if user not logged show login form echo ' '; } ?>

[/php]

Hvala na pomoci ali taj kod sto si i napiso pogotovo sad ne radii imas gresku ovdje jer te variable uopce nema $checkuserpass i ovo sha1($row[‘password’]), te greske sam ispravio i sada ako klinkem na login button bez unosa ikakvih podataka pise mi da korisnik ne postoji u bazi a kada upisem korisnicko ime i lozinku koji su u bazi ne dogodi se nista samo vrati login formu

System32, mogao si napisati neki kratko objašnjenje, što si promjenio i što je po tvom mišljenju problem -.-

[php]

<?php include ("connect.php"); // check if user is logged if (!empty($_SESSION['logged'])) { echo "Welcome " . " " . $us; } else { // if is pressed submit button if (isset($_POST['submit'])) { if (isset($_POST['username']) && isset($_POST['password'])) { $user = htmlentities($_POST['username']); $pass = sha1($_POST['password']); // check if username exist in datbase $checkuser = mysql_query("SELECT `username`, `password` FROM `users` WHERE `username` = '". $_POST['username'] ."'") or die (mysql_error()); if (mysql_num_rows($checkuser) == 1) { $r = mysql_fetch_assoc($checkuser); if($user == $r['username'] && $pass == sha1($r['password'])) { // if all ok log user and start session $_SESSION['logged'] = 1; $us = $r['username']; } else echo "Invalid password combination! Please try again."; } else echo "That username don't exist in database! Please register."; } else echo "Both fields are required!"; } //if user not logged show login form echo ' '; } ?>

[/php]

Hvala na pomoci ali rijesio sam problem, medjutim neznam dali je ovo sigurni kod ali evo ako nekome moze pomoci

Zašto radiš 2 querya kad mozes sve u jedan, kako sam ja napravio

Kao sto sam vec rekao novi sam u phpu a tvoj code mi nije radio a ovako mi radi, a i tek se ucim nadam se da cu to moc napravit sa puno manje kod sa funkcijama. A mozes li mi reci dali je ovo siguran code ili trebam jos ubaciti gdje zastitu, jer gledajuci po forumima zastite nikad dosta, i zanima me dali trebam stavljat zastitu kada ispisujem iz baze podataka kao npr. news ako samo ispisujem podatke sa while, i ovaj dio u formi mi nije jasan, dali trebam upisat u action ista ili mogu ostavit to prazno posto mi je login includan u index.php

Najbolje bi ti bilo koristi mysqli (klasa) pogledaj dokumentaciju na php.net i imaš tutorijale kako napraviti login uz mysqli

Ok hvala

E imam još 1 problem danas sam pravio login formu ispočetka i problem se javlja vamo

ovako radi kada klinem na Login buton a ne unesem ništa ili unesem samo username ili pass piše All fields are required! što je i potrebno, ali ako stavim na variable

i na

kada unesem samo username i kliknem login napiše mi ok, a trebalo bi napisat All fields are required!, a ako samo unesem password i kliknem Login napiše mi All fields are required!

I zamolio bi nekoga ako ima vremena nije bitno kada ako može da mu pokažem preko Team Viewer-a, i da se možemo čuti preko skype da mi pojasni par stvari…

Trenutno nisam dostupan na skype jer čekam da počne jedan webinar.

Ali ovako, ovo piše u php manualu za md5 (dolje u primjerima i opaskama korisnika):

While md5 on a null string returns null, md5 on an EMPTY string does not return null or an empty string. Rather it returns "d41d8cd98f00b204e9800998ecf8427e"
PHP: md5 - Manual

Znači, što se događa, ti upišeš username, a password nije više prazan i to ti onda prolazi pod ok.

Mislim da me nisi shvatio, ako password upisem a ostavim username prazan forma radi ok napise mi da su sva polja obavezna, a ako upisem samo username a ostavim pass prazan pise “ok” sto nebi trebalo bit trebalo bi pisat da su sva polja obavezna

Moja greska sorry sad sam skuzio kad sam maknio md5 ispred zagrade :slight_smile:

možda bi trebao dodati jedan if i provjeriti da li je $_POST[‘password’] empty, a ako nije, tek onda puknuti $pass = md5($_POST[‘password’]);
(jer ti inače md5 na empty stvara string pa više nije empty)

ma uvijek se pogubim po tome prvo si napravim sta hocu da mi skripta radi i uvijek neka greska napravim si

  1. provjera dali je user vec logiran
  2. provjera dali je kliknut Submit button
  3. provjera dali su polja ispunjena
  4. provjera dali korisnik postoji u bazi
  5. provjera dali se korisnicko ime i lozinka slazu
  6. logiranje i pokretanje sesije

ali uvijek mi negdje gresku izbaci, tj ne gresku nego kad pravim provjere krivo upisem if negdje pa mi radi obrnuto od onog sto bi htjeo da radi, zato bi bilo super kad bi mogo gledat preko team viewa pa da mi mozes reci ti ili neko drugi di pogrijesim.

I ovo sa query mi isto malo nije jasno jer ako idem mysql_num_rows() s time provjeravam dali korisnik vec postoji u bazi s tim korisnickim imenom a nemogu sa time napravit varijablu da mi pise Welcome $us, probo sam sa mysql_fetch_assoc() i mysql_fetch_array i nece mi dati korisnicko ime, a neznam dali je to zato sto mi se welcome $us nalazi na vrhu skripte tj ako je korisnik vec logiran a varijabla mi se nalazi dolje tek kad se korisnik logira i pise mi samo Weclome a nema username

Ah, nažalost (ili nasreću :slight_smile: ), inače bih ti rado pomogao, često sam to radio tako kako kažeš, samo sam trenutno zauzet sa plaćenim poslovima.

Ovo što si rekao za $us si dobro primjetio u čemu je greška.

Zapravo, dodaj me na skype (svedrugojezauzeto), imam ideju kako da ti to popravim, a ne da mi se tu pisati, previše je.
Poslat ćeš mi te fajlove pa ću ti malo okrenuti uvjet, forma će se prikazivati samo ako korisnik nije ulogiran, a username ćemo također spremiti u sesiju.

Lakše mi je raditi sa fajovima nego sa tekstom sa foruma, a od skype-a koristim samo chat, ništa teamviewer i to.
Nakon što napravim neke stvari, pogledat ćeš sam i malo prostudirati, da vidim da si shvatio što se, kako i kada događa u skripti.
Nagovorio si me :wink:

ok hvala ti puno :smiley:

Kako ja slažem svoju login formu i vučem korisničko ime logiranog korisnika.
Ako si ikad radio sam SMF-om lako ćeš ovo skužit, na ovom principu radi SMF.
U login formi provjerim sve podatke (dali korisnik postoji, dali su korisnik i lozinka isti, dali su polja popunjena…) i nakon toga u sesiju ili cookie stavim korisnikov ID. Tu dolje je primjer iz moje najnovije stranice. Koristim mysqli
[php]

<?php require_once('Configuration.php'); class LogInOut { public function logIn($username, $password, $remb_me = false) { global $mysqli; $result = 0; if((strlen($username) < 6 && preg_match('/\W/', $username)) && strlen($password) < 6) return 0; if($stmt = $mysqli->prepare("SELECT id_member FROM s32_users WHERE username = ? AND password = ?")) { $password = md5('aB1cD2eF3G'.$password); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows > 0) { $stmt->bind_result($id); $stmt->fetch(); self::setSession($id, $remb_me); $result = 1; } else $result = 0; $stmt->free_result(); $stmt->close(); } else $result = -1; return $result; } public function logOut() { $result = 0; if(checkSession(false)) { self::unsetSession(); $result = 1; } else $result = 0; return $result; } public function setSession($id, $remb_me = false) { if($remb_me === true) setcookie('s32_login_cookie', $id, time() + (60 * 60 * 24 * 365), '/'); else $_SESSION['s32_login'] = $id; } public function unsetSession() { unset($_SESSION['s32_login']); setcookie('s32_login_cookie', '', time() - (60 * 60 * 24 * 365), '/'); } } ?>

[/php]
Sve radim pomoću klasa pa ti je to možda malo bed, ali polako naučit ćeš ih. Kad sam se malo ‘ufurao’ u php nisam volio klase ali sad ih svugdje koristim.

Dalje, na vrhu dokumenta (index.php) učitav fajl Load.php. U njemu učitav sve, korisnika, artikle, komentare…

[php]

<?php require_once('Connect.php'); $context['user'] = array( 'name' => array( 'string' => 'Guest', ), 'is_admin' => false, 'is_logged' => false, ); if(isset($_COOKIE['s32_login_cookie']) || isset($_SESSION['s32_login'])) { $user = (isset($_COOKIE['s32_login_cookie'])) ? $_COOKIE['s32_login_cookie'] : $_SESSION['s32_login']; loadUsers(array($user)); unset($context['user']); $context['user'] = $context['members'][$user]; $context['user']['is_logged'] = true; $context['user']['is_admin'] = $context['user']['admin']; } function loadUsers($users = array()) { global $context, $mysqli; if(!isset($context['members'])) $context['members'] = array(); if(!empty($users)) { foreach($users as $id) { if(in_array($id, $context['members'])) return false; $result = $mysqli->query("SELECT * FROM s32_users WHERE id_member = ".$id); $row = $result->fetch_assoc(); $context['members'][$id] = array( 'name' => array( 'string' => $row['username'], 'link' => 'index.php?action=profile&id='.$row['id_member'], 'href' => ''.$row['username'].'', ), 'email' => $row['email'], 'admin' => ($row['admin'] == 1) ? true : false, 'language' => $row['language'], 'confirmed' => $row['confirmed'], 'id' => $row['id_member'], ); $result->close(); } } return $context['members']; } ... ?>

[/php]

Objašnjava ću dio po dio.
[php]
$context[‘user’] = array(
‘name’ => array(
‘string’ => ‘Guest’,
),
‘is_admin’ => false,
‘is_logged’ => false,
);
[/php]

U varijablu $context[‘user’] stavljam da je korisničko ime ‘Guest’, nije admin i nije logiran.

[php]
if(isset($_COOKIE[‘s32_login_cookie’]) || isset($_SESSION[‘s32_login’])) {
$user = (isset($_COOKIE[‘s32_login_cookie’])) ? $_COOKIE[‘s32_login_cookie’] : $_SESSION[‘s32_login’];
loadUsers(array($user));
unset($context[‘user’]);
$context[‘user’] = $context[‘members’][$user];
$context[‘user’][‘is_logged’] = true;
$context[‘user’][‘is_admin’] = $context[‘user’][‘admin’];
}
[/php]

Provjeravam dali je korisnik logiran (Postavljena je sesija ili cookie). Ako je, u varijabli $user dobivam ID korisnika. Ako je postavljen cookie onda ID čitam iz cookia ako nije onda iz sesije.

Učitavam korisnikove podatke prema njegovom ID-u (loadUsers funkcija).
Brišem onaj array od prije ($context[‘user’]) i isti taj array postavljam prema podacima korisnika. Na dalje, stavljam da je logiran i ako je admin stavljam true, ako nije false.

[php]
function loadUsers($users = array()) {
global $context, $mysqli;
if(!isset($context[‘members’])) $context[‘members’] = array();

if(!empty($users)) {
	foreach($users as $id) {
		if(in_array($id, $context['members'])) return false;
		
		$result = $mysqli->query("SELECT * FROM s32_users WHERE id_member = ".$id);
		$row = $result->fetch_assoc();

		$context['members'][$id] = array(
			'name' => array(
				'string' => $row['username'],
				'link' => 'index.php?action=profile&id='.$row['id_member'],
				'href' => '<a href="index.php?action=profile&id='.$row['id_member'].'">'.$row['username'].'</a>',
			),
			'email' => $row['email'],
			'admin' => ($row['admin'] == 1) ? true : false,
			'language' => $row['language'],
			'confirmed' => $row['confirmed'],
			'id' => $row['id_member'],
		);
		
		$result->close();
	}
}
return $context['members'];

}
[/php]

Ovo je jednostavno, loopam kroz zadane idove (Ovo ti ne moraš raditi, možeš samo za 1 id učitati) i dobavljam sve informacije iz baze te ih stavljam u varijablu $context[‘members’]. Koristim $context[‘members’][$id] tako da jednostavno iz key-a čitam podatke korisnika.

I na kraju, da dobijem korisničko ime koristim varijablu $context[‘user’][‘name’][‘string’]. Ako je korisnik logiran prikaže njegovo ime, ako nije onda prikaže ‘Guest’.

Možda ti se čini komplicirano ali nije!

Uh ovo sto si ti napiso je malo prenapredno za mene jer sam totalni pocetnik a i nisam radio sa tim cms-om. Ali evo mog problema opet :slight_smile:

Uspio sam napravit da se logiram i da mi radi sesija tj ono Welcome : korisnicko ime
Ali danas sam pravio ponovo login od 0 jer se zelim vjezbat i sada mi na 1 dijelu nesta ne valja tj u provjeri, dakle ako ne unesem u formu nista i kliknem Login pise da polja nisu ispunjena (to je ok), ako unesem pass i prazno ostavim user pise mi isto i obrnuto (to je isto ok), ako unesem korisnika koji je u bazi i lozinku koja je u bazi sve ok, medjutim ako unesem korisnika koji nije u bazi i lozinku bezveze pise da korisnik ne postoji u bazi (to je isto ok), ali problem se javlja kada unesem korisnika koji postoji u bazi i neki bezveze pass pise da korisnik ne postoji u bazi ali bi trebo rec Invalid username password combination.
Znaci samo taj dio neznam zasto mi govori da korisnik ne postoji a samo pass se ne podudara, ajde pls ako mozes ipravi moj code samo ili mi reci di sam pogrijesio ako mozes
evo code