Autor Zpráva
Slavo
Profil
Zdravicko mam mensi problem... neviem preco ale ked prejde cyklus tak while tak mi potom hodi chybu ze neni definovana dbmeno v podmienke if.. zistil som ze ked prejde cyklus tak vlastne to co je v cykle sa neda predat ako keby dalej na tu podmienku resp. asni vypisat sa to neda.

    
<?php    
    if(isSet($_POST["prihlas"])){
     if(!empty($_POST["meno"])){
      if(!empty($_POST["heslo"])){     
 
      $meno=$_POST["meno"];
      $heslo=$_POST["heslo"];
      
      //login na db
      $dbc=mysqli_connect("***","***","***","***",***);
      $dbc->set_charset("utf8");
      if(!$dbc){
       echo "Pripojenie<br />";
       echo "Podrobnosti pripojenia: ",mysqli_connect_error();
       exit("Neplatné pripojenie.");}
       
      //query 
      $query=mysqli_query($dbc,"SELECT hodnota, meno, heslo FROM uzivatelia WHERE meno='$meno'");
      if(!$query){
       echo "SQL-chyba <br />";
       echo "Podrobnosti SQL: ",mysqli_error($dbc);
       exit("Neplatný SQL prikaz.");}
    
      //cyklus na db   
      while($row=mysqli_fetch_array($query)){
       $dbhodnota=$row["hodnota"]; 
       $dbmeno=$row["meno"];     
       $dbheslo=$row["heslo"];}
       
      if($meno==$dbmeno&&$heslo==$dbheslo){
       $_SESSION["meno"]=$_POST["meno"];
       $_SESSION["hodnota"]=$dbhodnota;
       header("Location: miestnosti.php");}else{
       echo "Vaše meno alebo heslo nie je správne.";}
       mysqli_free_result($query);
       
      }else echo "Prosím zadajte vaše heslo.";
     }else echo "Prosím zadajte vaše meno.";
    }
    ?>  

problem je tu if($meno==$dbmeno&&$heslo==$dbheslo){ hodi ze nemam definovanu premennu dbmeno. Ked som pouzival mysql a nie mysqli mal som uplne iny zapis tak mi to nerobilo. V db je meno aj heslo nastavene na test. Dufam ze mi pomozete v taku neskoru hodinu. Buem vdacny za kazdu radu a co by som mohol na kode napr. zmenit :) Dakujem
abc
Profil
Za řádek 28 přidej echo $dbmeno;
Vypíše to něco?
Pokud ne, tak je s největší pravděpodobností v DB prázdné pole meno.
Pokud může být prázdné ošetři nějak takto na ř. 28:
$dbmeno = isset($row['meno'])? $row['meno'] : '';
Slavo
Profil
nie nevypisalo nic.. nechapem tomu.. Dal som spravne hodnoty tak ma to koplo na miestnosti.php no ked zadam zle udaje tak hodi ze neni definovana premenna :/ a to tvoje pomohlo no zaujimalo by ma aj tak v com bol problem :(
a v DB je
id=1
hodnota=1
meno=test
heslo=test
abc
Profil
Však je to logické, když zadáš chybné údaje.
Tenhle dotaz SELECT hodnota, meno, heslo FROM uzivatelia WHERE meno='$meno'
vytáhne z DB odpovídající záznam, tudíž, když ve formuláři zadáš jméno, které neexistuje, tak se ti vrátí prázdný vysledek, takže v $row['meno'] nic neni.
Tori
Profil
Slavo:
- hesla by neměla být ukládaná jako obyč.text, ale jen jako hash (viz např. http://php.vrana.cz/ukladani-hesel.php)
- chybí escapování dat v SQL dotazu
- while je imho zbytečné, když ten dotaz by měl vrátit max.jeden řádek. Dtto vytváření dalších proměnných, když byste mohl rovnou používat pole $row.
- i ověření hesla se dá zapsat do dotazu.
- za přesměrováním funkcí header se obvykle ukončuje skript.

ř.19 - 36 by mohly teda vypadat takto (řádky 7+8 by tím byly zbytečné):
$result = $dbc->query("SELECT hodnota, meno FROM uzivatelia WHERE meno = '".$dbc->escape_string($_POST['meno'])."' 
    AND heslo = '".$dbc->escape_string($_POST['heslo'])."'");

if ($result === false) {
    // popis chyby by se ale na veřejném webu neměl objevit, to je informace jen pro programátora
    echo 'Došlo k chybe. '.$dbc->error; 
} elseif ($result->num_rows < 1) {
    echo 'Prihlasovacie meno alebo heslo boli zadané nesprávne.';
} else {
    $row = $result->fetch_assoc();
    $_SESSION["meno"] = $row['meno'];
    $_SESSION["hodnota"] = $row['hodnota'];
    header("Location: miestnosti.php");
    exit;
}
Jan Tvrdík
Profil
Tori:
i ověření hesla se dá zapsat do dotazu.
Nicméně z hlediska bezpečnosti je podle mě lepší to nedělat, protože to vyžaduje poslat heslo do databáze v plaintextu, což zvyšuje riziko, že heslo v této podobě někdo odchytne nebo, že skončí v nějakém logu.
Slavo
Profil
Jaj tak... uz tomu rozumiem.... abc.. tam bola chyba... som si to trosku neuvedomil :) bolo uz neskoro ..dakujem Vam :)

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: