Avatar
StrangeR
Člen
Avatar
StrangeR:

Ahoj, pracuji na jednom menším projektu a mám problém s přihlášením...

<?php
session_start();
include "lokalizace/lokalizace.php";
include 'jadro/mysql_connect.php';

$uzivatelske_jmeno = $_POST['uzivatelske_jmeno'];
$uzivatelske_heslo = $_POST['uzivatelske_heslo'];

$heslo_md5 = md5($uzivatelske_heslo);
$query = mysql_query("SELECT * FROM ncsdpk.ncsdpk_uzivatele WHERE uzivatelske_jmeno='$uzivatelske_jmeno' and heslo='$heslo_md5'");
$sloupec = mysql_fetch_array($query) or die(mysql_error());

if($sloupec['uzivatelske_jmeno'] == $uzivatelske_jmeno) {
        if($sloupec['heslo'] == $heslo_md5) {
                echo 'prihlaseno!';
        } else {
                echo 'spatne heslo';
        }
} else {
        echo 'spatne id';
}
?>

Když zadám správné údaje tak odpověď je normálně přihlášeno, ale jakmile zadám údaje špatně, tak je pouze bílá stránka a tam žádné echo ani chyba v php.

Nevíte čím by to mohlo být?

 
Odpovědět 30.9.2015 11:48
Avatar
serifko
Člen
Avatar
Odpovídá na StrangeR
serifko:

ak su udaje nespravne (nevrati ziadny vysledok z db) tak $sloupec['heslo'] neexistuje -> takze podmienku nevyhodnoti (myslim); preto je prazdna kedze server kvoli chybe v php nic nevracia

 
Nahoru Odpovědět 30.9.2015 12:00
Avatar
StrangeR
Člen
Avatar
StrangeR:

A v čem přesně by mohla být ta chyba? Přemýšlím tu nad tím už nějakou dobu a né a né na to přijít...
V databázi v tabulce ncsdpk_uzivatele mám sloupce id, uzivatelske_jmeno, email, heslo

A takto vypadá zdroják inputů, neboli prihlasit.php

<form action="prihlas.php" method="post">
        <div class="input">
                <?php echo $text['uzivatelske_jmeno']; ?>:</br>
                <input type="text" name="uzivatelske_jmeno" placeholder="Uživatelské jméno" maxlength="20" />
        </div>

        <div class="input">
                <?php echo $text['uzivatelske_heslo']; ?>:</br>
                <input type="password" name="uzivatelske_heslo" placeholder="Heslo" maxlength="20" />
        </div>

        <div class="button">
                <input type="submit" value="<?php echo $text['prihlasit']; ?>"/>
        </div>
</form>
 
Nahoru Odpovědět 30.9.2015 12:13
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na StrangeR
patrik.valkovic:

Možný bych zkusil vyhodit řádek

$sloupec = mysql_fetch_array($query) or die(mysql_error());

a hodil bych tam klasický

if($query == false)
{
        echo mysql_error();
        return;
}
$sloupec= mysql_fetch_array($query);

Další dvě věci - nehlídáš si Sqllnjection - kdyžtak si o tom něco najdi na netu. Každý by ti tam mohl hodit nějaký příkaz, který ti například smaže databázi.

A taky nepoužívej mysql, které je zastaralé, ale mysqli (http://php.net/…k.mysqli.php).

Editováno 30.9.2015 12:33
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 30.9.2015 12:31
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na StrangeR
Martin Konečný (pavelco1998):

zdar,

spíš než na MySQLi se podívej na PDO, někde tu je na to návod (spolu s parametrizovanými dotazy, které SQL injection řeší).
Pak máš zbytečnou podmínku s tím jménem, když tu podmínku máš už v SQL dotazu.
Házet or die() k mysql_fetch_* nemá smysl, protože pak nemáš jak upozornit uživatele, že zadal špatné jméno nebo heslo (vrací to FALSE v případě, že se nenašly žádné záznamy, ne že je chyba v dotazu).
S tím heslem to máš stejně, podmínku máš už v SQL dotazu, takže ta v PHP ztrácí význam.

Vsadím se, že ti to hází prázdnou stránku proto, že mysql_fetch_array() nenajde žádné záznamy (tzn. vrátí FALSE a provede se die(mysql_error())), to ale nic nevypíše, protože v SQL dotazu žádná chyba nebyla...

Jak by to šlo jednoduše s PDO? třeba takto

$pdo = new PDO("přihlašovací údaje do DB");
$query = $pdo->prepare("
  SELECT data
  FROM tabulka
  WHERE jmeno = ? AND heslo = ?
  LIMIT 1
");
$query->execute(array($jmeno, lepsi_hash_fce_nez_md5($heslo)));
$data = $query->fetch(PDO::FETCH_OBJ);

if ($data !== FALSE) {
   // OK
} else {
  echo "špatné jméno nebo heslo";
}

V podmínce WHERE záleží na velikosti písmen, takže pokud bys chtěl umožnit zadat jméno s různou velikostí znaků, použij LIKE

 
Nahoru Odpovědět  +2 30.9.2015 15:34
Avatar
Tonda Kozák
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Tonda Kozák:

V podmínce WHERE záleží na velikosti písmen, takže pokud bys chtěl umožnit zadat jméno s různou velikostí znaků, použij LIKE

Jestli bude záležet na velikosti písmen závisí na použitém kódování (respektive porovnávání) sloupce. Pokud je to zakončeno na cs - case sensitive, tak záleží na velikosti písmen, pokud je zakončeno na ci - case insensitive, tak na tom nezáleží.
Př: utf8_czech_ci

 
Nahoru Odpovědět 30.9.2015 21:40
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Daniel Vítek:

Nepleteš si náhodou mysql a mysqli, že ne?

 
Nahoru Odpovědět 30.9.2015 21:41
Avatar
Odpovídá na Tonda Kozák
Martin Konečný (pavelco1998):

Fajn, přiznám se, že těmhle věcem nerozumim, takže jsem napsal něco z vlastní zkušenosti.

Daniel Vítek: náhodou nepletu a raději bych se podíval na PDO než MySQLi. Viz např.
http://code.tutsplus.com/…e--net-24059
http://stackoverflow.com/…sqli-and-pdo

 
Nahoru Odpovědět 30.9.2015 22:33
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Daniel Vítek:

Já jen že nepoužívá mysqli, ale mysql :)

 
Nahoru Odpovědět 30.9.2015 22:59
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Daniel Vítek
Marek Z.:

Myslím, že reagoval na větu:

A taky nepoužívej mysql, které je zastaralé, ale mysqli (http://php.net/…k.mysqli.php).
|-)
Nahoru Odpovědět  +2 30.9.2015 23:55
Chybami se člověk učí, běžte se učit jinam!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.