Avatar
Sxmanek
Člen
Avatar
Sxmanek:

Zdravím, zkouším udělat login na stránky, ale mám zde problém...
Mám klasicky index.php, kde je user panel(dva stavy pro přihlášené a nepřihlášené).

<?php
if (login() == true) {
    ?>
    <a href="index.php">Home</a><br>
    <a href="profile.php">Profile</a><br>
    <a href="logout.php">Log Out</a>
    <?php
} else {
    ?>
    <a href="index.php">Home</a><br>
    <a href="login.php">Login</a><br>
    <a href="register.php">Register</a>
    <?php
}
?>

Záleží na funkci login() viz...

Záleží na funkci login() viz...

<?php

session_start();

function login(){
    if (isset($_SESSION["user_id"]) && !empty($_SESSION["user_id"]) ) {
        return true;
    } else {
        return false;
    }
}

?>

Data vkládám pomocí formuláře...

<form method="post">
                <?php
                if (isset($_POST["submit"])) {
                    $username = $_POST["username"];
                    $password = md5($_POST["password"]);

                    if (empty("$username") || empty("$password")) {
                        echo "<p>Vyplňte všechna pole!</p>";
                    } else {
                        $check_login = mysql_query("SELECT id,type FROM users WHERE username = '$username' AND password = '$password'");
                        if (mysql_num_rows($check_login) == 1) {
                            $run = mysql_fetch_array($check_login);
                            $user_id = $run["id"];
                            $user_type = $run["type"];
                            if ($user_type == "d") {
                                echo 'Tvůj účet je deaktivován';
                            } else {
                                $_SESSION_ = ["$user_id"];
                                header("location: index.php");
                            }
                        }
                    }
                }
                ?>
                Uživatelské jméno:<br>
                <input type="text" name="username"/><br>
                Heslo:<br>
                <input type="password" name="password"/><br><br>
                <input type="submit" name="submit" value="Login"/>
            </form>

Po přihlášení se přesměruje opět na login.php a je jedno jestli zadám správně login nebo ne.
Problém je, že mě to nepustí přes if (mysql_num_row­s($check_login) == 1)
SQL příkaz je v pořádku.
Když odeberu ověření hesla, přesměruje mě to na index.php beze změny user panelu.

Editováno 24.10.2014 0:25
 
Odpovědět 24.10.2014 0:23
Avatar
Sxmanek
Člen
Avatar
Sxmanek:

A další problém, že neproběhne ověření, jestli bylo zadáno heslo...takže, když napíšu jen username bez hesla a dám přihlásit, tak to běží v pořádku dál.

 
Nahoru Odpovědět 24.10.2014 0:42
Avatar
Odpovídá na Sxmanek
Michal Štěpánek:

Nemělo by tam být jen jedno "rovná se"?

if (mysql_num_rows($check_login) = 1) {
Nahoru Odpovědět 24.10.2014 6:07
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Tonda Kozák
Člen
Avatar
Odpovídá na Michal Štěpánek
Tonda Kozák:

To opravdu ne. Jedná se o podmínku, nikoli o přiřazování hodnoty.

Sxmanek
Zkus si nechat vypsat, co je v

mysql_num_rows($check_login)
 
Nahoru Odpovědět 24.10.2014 6:40
Avatar
Fredep
Redaktor
Avatar
Odpovídá na Sxmanek
Fredep:

Hele, v databázi můžeš mít více stejných řádku, proto raději udělej toto:

if (mysql_num_rows($check_login) >= 1) {

A co se týče hesla, hashování prázdného řetězce ti nevrátí null, takže musíš udělat toto:

if (empty("$username") || empty( $_POST["password"] ))
// Nezahasovane heslo musis overit...
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 24.10.2014 6:48
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
Sxmanek
Člen
Avatar
Sxmanek:

Už jsem to vyřešil :) První chyba byla, že jsem měl špatně jeden řádek

$_SESSION_ = ["$user_id"];

a ta druhá, že md5 vrací 32 znaků řětezec a já měl nastaveno u hesla v databázi max. 30, takže mi to porovnávalo 32 s 30 = vždy 0 shoda. Ale s tím hashováním prázdného řetězce dík.

 
Nahoru Odpovědět 24.10.2014 12:17
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Sxmanek
Snorlax:

Ještě jedna věc, která je tu ohledně PHP vždy oblíbená: Používej PDO. :) Možná je ze začátku těžší na pochopení, ale je to rozhodně dobrá investice. I já si vzpomínám jak jsem přecházel z toho starýho na PDO, ale jsem za to rád. Opravdu o tom uvažuj ;)

Nahoru Odpovědět 24.10.2014 14:18
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Sxmanek
Člen
Avatar
Odpovídá na Snorlax
Sxmanek:

Kouknu na to :) PHP ještě moc neumím, takže říkáš, ať se to učím rovnou s PDO?

 
Nahoru Odpovědět 24.10.2014 14:46
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Sxmanek
Snorlax:

Ano. Jak s říká, že starého psa nenaučíš novým kouskům, tak je to pravda. Je to přece logický, přechod na novou technoloii je vždy nějaký problém. Když se PDO naučíš rovnou, nezahltíš si hlavu něčím starým. Přece si taky nezačínal programovat v assembleru, tak proč se učit nějaký starý přístup k db :)

Nahoru Odpovědět 24.10.2014 19:15
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Sxmanek
Člen
Avatar
Odpovídá na Snorlax
Sxmanek:

ABych pravdu řek, tak assembler sem se učil :D

 
Nahoru Odpovědět 24.10.2014 20:30
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Sxmanek
Snorlax:

No a jak dlouho ti to vydrželo? :D A mělo to pěkný nevýhody co? Tak proč se učit staré technologie. Ano, někdy to smysl má, ale tohle to není :D

Nahoru Odpovědět 24.10.2014 20:47
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Sxmanek
Člen
Avatar
Sxmanek:

Nechce se mi zakládat nové téma, abych nespamoval, zkouším to teda předělat s PDO a mám problém s počtem řádků.

$query = $connection->prepare("SELECT * FROM users WHERE username = ? OR mail = ?");
                        $query = $query->execute(array($username, $mail));
                        $rows = $query->fetchALL(PDO::FETCH_COLUMN, 0);
                        $numrows = count($rows);

Vypisuje chybu:

Fatal error: Call to a member function fetchALL() on a non-object
 
Nahoru Odpovědět 24.10.2014 22:53
Avatar
Sxmanek
Člen
Avatar
Sxmanek:

Tak už v pořádku :)

 
Nahoru Odpovědět 24.10.2014 23:30
Avatar
mkub
Redaktor
Avatar
Odpovídá na Sxmanek
mkub:

na sifrovanie hesiel a inych udajov nepouzivaj MD5, ale inu, lebo uz nie je bezpecna

 
Nahoru Odpovědět 25.10.2014 3:36
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 14 zpráv z 14.