Autor Zpráva
skrepyKOKO
Profil
Ahoj,potřebuju pomoct...
mám problém s podmínkou
<?php
  require_once "databaze.php";

  $vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele");
  while($zaznam=mysql_fetch_array($vysledek)){

if($_POST['heslo']==$zaznam['heslo']&&empty($_POST['heslo']){
if($_POST['jmeno']==$zaznam['jmeno']&&empty($_POST['jmeno']){
header('Location: obsah.php');
}else{
echo "<script>alert('Jméno je špatně zadáno');</script>";
}
}else{
echo"<script>alert('Heslo je špatně zadáno');</script>";
}
}

$_SESSION[jmeno]=$_POST['jmeno'];
$_SESSION[heslo]=$_POST['heslo'];
?>

Co je na tom blbě?
když vstoupím na stránku,tak všechno zmizí,prostě všechno je pryč...

má to kontrolovat jestli je zadané heslo a jmeno správně..
když člověk příjde na tu stránku,tak by to nemělo nic psát,pokud zadá hodnoty,(jmeno,heslo) a bude špatně něco z toho,tak to napíše co je špatně...

formulář s touhle kontrolou mám v jednom souboru....
jde o to,že pokud tam mám normální podmínku jen
if($_POST['heslo']==$zaznam['heslo']){
if($_POST['jmeno']==$zaznam['jmeno']){

tak to jde,jenže když někdo vstoupí na tu stránku,tak to napíše že je špatné jméno,a přitom tam nic nezadal ještě...
jinač value formuláře mám jmeno a heslo..takže isset je zbytečný,musí to být bych řekl empty..
joe
Profil
skrepyKOKO:
Co je na tom blbě?
Už blbě na tom je ten dotaz do databáze, kterým vybíráš všechny uživatele. Zkus se zamyslet a udělat to lépe.
Tori
Profil
Ty podmínky jsou strašně divné: "Heslo je špatně zadáno" hlásí pouze v případě, že uživatel v databázi nemá vůbec uložené heslo a zároveň ho nezadal, jestli dobře vidím. To může někdy nastat?
Celé to hoďte do takové podmínky, aby se kontrola přihlášení prováděla skutečně jen v případě odeslání formuláře - např.
if ($_POST)
Potom bych ověřila, že bylo zadané aspoň uživ.jméno (tím isset), a s využitím joeovy rady zkontrolovala heslo.
skrepyKOKO
Profil
joe:
aha,mysql_fetch_array tam být nemusí?..
nebo pak už nevím kde je v tom načtení chyba..

Tori:
já myslel že ta podmínka funguje takto..
že pokud se rovná heslo v databázi s _POST heslem,tak ho to pustí,stejně tak i s jmenem,ale asi jsem se spletl jak píšeš..
já mám ve formuláři onfocus a onblur,takže prázdný bych řekl že nebude nikdy...

jinač,takže první podmínka bude if(_POST),a pak to ostatní jestli je heslo a jmeno správně?
okolojdouci
Profil *
skrepyKOKO:
jinač,takže první podmínka bude if(_POST),a pak to ostatní jestli je heslo a jmeno správně?

Ne. Chceš zjistit, jestli v tabulce uživatelů existuje řádek, ve kterém heslo = $_POST['heslo'] a zároveň jmeno = $_POST['jmeno']. Ověř existenci tohoto jednoho řádku, neprocházej všechny řádky.
joe
Profil
skrepyKOKO:
že pokud se rovná heslo v databázi s _POST heslem
Vyznač ve svém kódu tuto podmínku. Já ji v dotazu SELECT jmeno,heslo FROM uzivatele nikde nevidím.
skrepyKOKO
Profil
joe:
aha,že mě tam chybý WHERE pro jmeno?
skrepyKOKO
Profil
hm,tak ted mě to jde tak na 50%
nepřihlásí mě to když tam zadám špatně udaje,a když je zadám správně,tak mě to přihlásí,jenže když je zadám špatně,tak to nenapíše tu chybu o tom,že to napsal špatně..zde přihládám aktualní kod
<?php
  require_once "databaze.php";

  $vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele WHERE jmeno='{$_POST['jmeno']}'");
  while($zaznam=mysql_fetch_array($vysledek)){

if($_POST){
if($_POST['jmeno']==$zaznam['jmeno']){
if($_POST['heslo']==$zaznam['heslo']){
header('Location: obsah.php');
}else{
echo "<script>alert('Heslo je špatně zadáno')</script>";
}

}else{
echo"<script>alert('Jmeno je špatně zadáno')</script>";
}

}
}
$_SESSION[jmeno]=$_POST['jmeno'];
$_SESSION[heslo]=$_POST['heslo'];
?>
Tori
Profil
skrepyKOKO:
To if ($_POST) jsem myslela dát ještě před DB dotaz - odkud se má (na ř.4,21,22) číst $_POST['jmeno'], když pošlu prázdný formulář a budu mít zákeřně vypnutý JavaScript? Podmínka na ř.8 je zbytečná, totéž ověřujete už v dotazu, ve WHERE. Pokud uživatel toho jména neexistuje, mysql_fetch_* vrátí false a dovnitř cyklu se vůbec nedostanete -> místo cyklu dejte obyč. podmínku, jestli $zaznam není prázdný. Ad řádky 21+22 - neměly by být před řádkem 10? Takhle se provedou v případě špatného přihlášení.

Mimo dotaz: neukládala bych hesla jako obyčejný text, ale hašovaná (např. funkcí sha1) - hodně lidí používá stejné heslo na x místech a když se vám někdo dostane do dat, tak má v ruce přístup k dalším účtům/e-mailům/... uživatelů. Subjektivně taky považuju za lepší nedávat přesné informace, jestli je špatné jméno nebo heslo, ale prostě jen že přihlášení selhalo a chybná příhlášení + důvody si třeba logujte.
skrepyKOKO
Profil
dobře..a ještě se chci zeptat,je lepší md5 nebo ten sha1?co je bezpečnější?
Tori
Profil
Použila bych sha1.
Jinak koukněte třeba na článek Zabezpečení hesla z pohledu programátora.
skrepyKOKO
Profil
no,mám to tak,jak jste napsaly,jenže pořád mě to nechce hlásit chyby,když dá blbě heslo nebo jméno..nemůže to být formulářem?
i když..to bych řekl že je blbost

<form method="POST" action="">					
   <label>
	<input name="jmeno" value="Jmeno" onfocus="if(this.value=='Jmeno')this.value=''" onblur="if(this.value=='')this.value='Jmeno'" type="text">
   </label>
   <label>
	<input name="heslo" value="Heslo" onfocus="if(this.value=='Heslo')this.value=''" onblur="if(this.value=='')this.value='Heslo'" type="password">
   </label>
   
   <label>
	<input type="submit" value="Přihlásit mě" style="background: url('images/signinbutton.png')100% no-repeat;background-position: center;border:0px;width:100px;height:27px;color:white;font-size:12px;">
   </label>
</form>
skrepyKOKO
Profil
Tak už vím proč
není to formulářem ale podmínkou,
vlastně ta podmínka se ukáže,pokud je jmeno stejný jako v post,
tudíž to mám špatně ty 2 podmínky..jak by to mělo vypadat?
potřebuju to udělat takhle..
když někdo příjde na stránku,tak se mu žádná chyba neobjeví..to se udělá podmínkou if($_POST)
když napíše špatně jmeno,nebo heslo,tak mu to napíše chybu...
zkusil jsem to udělat znova,a takhle to momentálně vypadá

<?php
if($_POST){
  require_once "databaze.php";

  $vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele WHERE jmeno='{$_POST['jmeno']}'");
  while($zaznam=mysql_fetch_array($vysledek)){


  if($_POST['heslo']==$zaznam['heslo']) {
  
   $_SESSION[jmeno]=$_POST['jmeno'];
   $_SESSION[heslo]=$_POST['heslo'];
    header('Location: obsah.php');

  }else{
  echo "Jmeno nebo heslo je špatně zadané.";
  }
}
}else{echo "";}
?>
okolojdouci
Profil *
Použij
$vysledek = mysql_query("SELECT jmeno,heslo FROM uzivatele WHERE jmeno='".$_POST['jmeno']."' AND heslo='".$_POST['heslo']."' ");
skrepyKOKO
Profil
no,mě jde o to,že když napíšu jmeno nebo heslo špatně,tak to nenapíše tu hlášku
echo "Jmeno nebo heslo je špatně zadané.";
...pouze když napíšu správně jmeno tak se ta hláška objeví
Tori
Profil
skrepyKOKO:
vlastně ta podmínka se ukáže,pokud je jmeno stejný jako v post,
tudíž to mám špatně ty 2 podmínky..jak by to mělo vypadat?
viz #9
if (isset($_POST['jmeno'], $_POST['heslo'])) {
  require_once "databaze.php";
  $jmeno = mysql_real_escape_string($_POST['jmeno']);
  $heslo = mysql_real_escape_string($_POST['heslo']);
  $vysledek = mysql_query("SELECT jmeno, heslo FROM uzivatele WHERE jmeno='$jmeno' AND heslo='$heslo'");
  $zaznam = mysql_fetch_array($vysledek);
  if (!empty($zaznam)) {  
    $_SESSION['jmeno']=$_POST['jmeno'];
    $_SESSION['heslo']=$_POST['heslo'];
    header('Location: obsah.php');
  } else {
    echo "Jmeno nebo heslo je špatně zadané.";
  }
}
skrepyKOKO
Profil
Tori:
jsi borec,díky moc
okolojdouci
Profil *
skrepyKOKO:
jsi borec
Omyl :)

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:

0