Autor Zpráva
gardener
Profil
Zdravím
Chtěl bych se zeptat, zda musím u níže uvedené fce vracet hodnotu a co popřípadě ověřit.
Fce je zamýšlena tak, že jako parametry pošlu hodnoty z formu, které prošly ověřením.
a na základě toho fce vyhodnotí , nastaví hodnotu session na 1 nebo 0 a přesměruje na odpovídající stránku, kde už si hodnotu session kontroluji.

Díky za každou radu

<?php
function overeni ($prijmeni, $heslo)
{

if (mysql_query("select surname,password from users where surname='".$prijmeni."' and password='".$heslo."' ")) 
  
    {
    	$_SESSION['prihlasen'] = 1;
	}
	 
else if(mysql_query("select surname,password,jeadmin from users where surname='".$prijmeni."' and password='".$heslo."'and jeadmin='1' "))
  
   {
    
	$_SESSION['prihlasen'] = 1;
    
   }
else
{
	$_SESSION['prihlasen'] = 0;
    echo("<meta http-equiv='refresh' content='3;url=false.html'>");	//return false;
}

}  
?>
Majkl578
Profil
krome mysql injection vulnerability a neprehledne struktury (php i mysql) dotazu to je dobre.
muzes si vracet true nebo false a podle toho pak zaridit jinou cast scriptu
priklad:
if(overeni('Pepa', 'pepovoheslo')) {
echo 'Pepa se prihlasil';
} else {
echo 'Pepa se neprihlasil';
}

php samo o sobe nevyzaduje, aby funkce vracely hodnotu
gardener
Profil
O.k ale pak tedy nerozumím tomu, proč v případě
else
{
    $_SESSION['prihlasen'] = 0;
    echo("<meta http-equiv='refresh' content='3;url=false.html'>");    //return false;
}

Nedojde k přesměrování...

Kde by mohla být chyba?
AM_
Profil
Pokud mas zapnute magic_quotes_gpc a nestripslashujes ty udaje, tak je to zcela bezpecne. Ale mel bys prohodit if a elseif vetev, protoze i pro admina bude platit prvni if podminka, takze k elseif se to nikdy neprokouse.
Chyba - zaprve, v HTML se pouzivaji uvozovky, ne apostrofy, takze http-equiv="refresh"... nektere prohlizece to muzou brat spatne
zadruhe, podivej se na zdrojak stranky, jestli se tam ten meta tag vyechuje, ale nefunguje, nebo jestli je chyba v PHP a ten tag se tam ani nedostane.
gardener
Profil
Oslashovane to mam již předtím
AM_díky s tou podmínkou máš samozřejmě pravdu, nicméně i po změně to nefunguje korektně..
Zkoušel jsem to i pomocí header, ale s tím samým výsledkem..
Skript mi žádný výstup nevrátí, jednoduše prázdný dokument:

fci volám takto
$surname = (mysql_real_escape_string($_POST["surname"]));
$password = (mysql_real_escape_string($_POST["password"]));
overeni($surname,$password); 
koroman
Profil
da sa to napisat lepsie:
<?php
function overeni ($prijmeni, $heslo){
	$_SESSION['prihlasen'] = 0;
	$_SESSION['is_admin'] = 0;
	if(mysql_query("select surname,password,jeadmin from users where surname='".$prijmeni."' and password='".$heslo."'and jeadmin='1' ")){
		$_SESSION['prihlasen'] = 1;
		$_SESSION['is_admin'] = 1;
		return true;
	}elseif(mysql_query("select surname,password from users where surname='".$prijmeni."' and password='".$heslo."' ")){
  	$_SESSION['prihlasen'] = 1;  	
  	return true;
  }
	return false;
}


$surname = (mysql_real_escape_string($_POST["surname"]));
$password = (mysql_real_escape_string($_POST["password"]));

if(!overeni($surname,$password)){
	//pokial sa neprihlasi spravne:
	// UPOZORNENIE - nesmu by hlavicky posielane skorej predtym
	header('Location: false.html');
	
	/* popripade:
	echo "<script>location.href='false.html';</script>"
	*/
}
?>


dufam, ze pomoze :-)
panther
Profil
AM_
Chyba - zaprve, v HTML se pouzivaji uvozovky, ne apostrofy, takze http-equiv="refresh"... nektere prohlizece to muzou brat spatne
ale, ale...
koroman
Profil
hadam ok
Majkl578
Profil
panther
ale? apostrof je jen cunarna zacatecniku v php aby se vyhli deleni retezcu nebo escapovani. zadny jiny logicky vyznam pro to nevidim.
AM_
Profil
panther
jestli mas jiny nazor tak sem s nim, ale text "ale, ale" je co se tyce informacni hodnoty nekde okolo bodu mrazu :)
gardener
Profil
Nemůžu si pomoci, ale ať dělám co dělám k tomu přesměrování nedojde..ani pomocí header, ani pomocí echo..
Upravil jsem to takto s použitím Koromanova vylepšení
<?php
include_once("db_connect.php");
$surname = (mysql_real_escape_string($_POST["surname"]));
$password = (mysql_real_escape_string($_POST["password"]));
if (empty($surname)|empty($password))
{
	echo("Nevyplnili jste potřebné údaje");
	exit();
}
else
{
include_once("functions.php");
overeni($surname,$password); 

if(!overeni($surname,$password)){
    //pokial sa neprihlasi spravne:
    // UPOZORNENIE - nesmu by hlavicky posielane skorej predtym
    header('Location: false.html');
    echo "<script>location.href='false.html';</script>";
}
}
?>
AM_
Profil
proč voláš funkci overeni 2x? jádro problému to asi není (budeš si ten kód muset trochu prozkoušet, kde se co špatně vyhodnotí), ale je to trochu hloupé.
overeni($surname,$password); 

if(!overeni($surname,$password)){
gardener
Profil
Pravda, je to zbytecne..ale nema to na to bohuzel vliv..
Majkl578
Profil
nema nahodou byt location v headeru absolutni url?
gardener
Profil
Nemusí být, ono to ale nevypíše nic..ani pomocí echo..
Majkl578
Profil
error_reporting(E_ALL);
na zacatek scriptu
gardener
Profil
To jsem zkoušel jako první věc..bohužel nic nanahlásí..
gardener
Profil
Tak problém byl v návratové hodnotě Fce.
Uvádím příklad použitý u jiné aplikace, je to to samé ale zde potřebuji rozlišit jen admina

<?php
function overeni($username,$password)
{

    $vysledek = mysql_query("select username,password from users where username='".$username."' and password='".$password."'");
	if (mysql_num_rows($vysledek)==0)
    {
    	$_SESSION['prihlasen'] = 0;
    	return false;
	} 
	else {
    $_SESSION['prihlasen'] = 1;
    return true;
  }
	
}

?>


A po zavolání fce:

overeni($username,$password);
{
if($_SESSION['prihlasen'] == 0){
    //:Pokud se neprihlasi spravne
     echo "neco je spatne";
     echo "<script>location.href='false.html';</script>";
     //exit();
}
else if($_SESSION['prihlasen'] == 1)
{
    echo "k overeni doslo";	
     exit();
}
}
?>
gardener
Profil
//session_register("prihlasen");
//session_register("is_admin");

Jsem vykoupnul a chová se to stejně...já bych tipoval, že bude problém s tím dotazem?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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