NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: prihlas.php - Nevypisuje chybu pokud přihlášení selže.

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
StrangeR
Člen
Avatar
StrangeR:30.9.2015 11:48

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
Odpovídá na StrangeR
Neaktivní uživatel:30.9.2015 12:00

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
Neaktivní uživatelský účet
Avatar
StrangeR
Člen
Avatar
StrangeR:30.9.2015 12:13

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
Odpovídá na StrangeR
Patrik Valkovič:30.9.2015 12:31

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í
+2,50 Kč
Ř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):30.9.2015 15:34

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
30.9.2015 15:34
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Tonda Kozák
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Tonda Kozák:30.9.2015 21:40

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
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:30.9.2015 21:41

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

Nahoru Odpovědět
30.9.2015 21:41
Neaktivní uživatelský účet
Avatar
Odpovídá na Tonda Kozák
Martin Konečný (pavelco1998):30.9.2015 22:33

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

Neaktivní uživatel: 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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:30.9.2015 22:59

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

Nahoru Odpovědět
30.9.2015 22:59
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Uživatel sítě :30.9.2015 23:55

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
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.