IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jan Demel
Tvůrce
Avatar
Jan Demel:4.1.2014 11:36

Čau lidi. Dneska jsem si chtěl udělat nějáký jednoduchý login system ... No ale můj zápis se mi zdá opravdu hooodně zdlouhavý. Dalo by se to udělat něják jinak ?... Vím, že jo :D Jenom mě prosím neukamenujte za to, jak jsem to tu provedl. Vím, že je to hrozné, ale berte ohledy na to, že opravdu začínám :)

<?php
header('Content-Type: text/html; charset=UTF-8');
$pdo = new PDO('mysql:host=localhost;dbname=camerata;charset=utf8;', 'root', '');

if($pdo)
{
    $stranka_nick = filter_input(INPUT_POST, 'nick');
    $stranka_pass = filter_input(INPUT_POST, 'pass');

    $nick_prepeare = $pdo->prepare("SELECT nick FROM users");
    $nick_prepeare->execute();
    $nick = $nick_prepeare->fetch(PDO::FETCH_ASSOC);

    $pass_prepeare = $pdo->prepare("SELECT pass FROM users");
    $pass_prepeare->execute();
    $pass = $pass_prepeare->fetch(PDO::FETCH_ASSOC);

    if($stranka_pass == $pass['pass'] && $stranka_nick == $nick['nick'])
    {
        echo('<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>Camerata</title>
  <link rel="stylesheet" href="../css/style.css" type="text/css">
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
  <script src="../js/animations.js"></script>
  <link href="http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  <link href="http://fonts.googleapis.com/css?family=Denk One&subset=latin,latin-ext" rel="stylesheet" type="text/css">
</head>
<body>
        <div id="container">
                <div id="header">
                        <img src="../images/header.gif" id="floatleft">
                        <img src="../images/facebook.gif" id="facebook">
                        <img src="../images/line.gif" style="opacity:0.5;">
                </div>
                <nav>
                        <ul>
                                <li><a href="../index.php" class="anim">Domů</a></li>
                                <li><a href="../about.php" class="anim">O Kapele</a></li>
                                <li><a href="../mp3.php" class="anim">Mp3</a></li>
                                <li><a href="../foto.php" class="anim">Foto</a></li>
                                <li><a href="../diskografie.php" class="anim">Diskografie</a></li>
                                <li><a href="../reference.php" class="anim">Reference</a></li>
                                <li><a href="../kontakt.php" class="anim">Kontakt</a></li>
                                <li><a href="../odkazy.php" class="anim">Odkazy</a></li>
                                <li><a href="../poradatel.php" class="anim">Pořadatel</a></li>
                                <li><a href="../admin/admin.php" class="anim">Admin</a></li>
                        </ul>
                </nav>
                <div id="main">
                        <h2>Admin</h2>
                        <form action="login.php" method="POST">
                            <table>
                                <tr><td>Jméno:</td><td><input type="text" name="nick"></td></tr><br>
                                <tr><td>Password:</td><td><input type="password" name="pass"></td>
                                <td><input type="submit" value="Log in !"></td>

                            </table>
                        </form>
                </div>
                <div id="side">
                        <h3 class="side"><u>Novinky</u></h3>
                </div>
                <div id="footer">
                    <hr>
                    <p>Copyright &copy by Jan Demel 2013</p>
                </div>
        </div>
</body>
</html>

');
    }
    else
    {
        echo("Špatně vyplněný formulář.");
        echo("<br>");
        echo('<a href="admin.php"><input type="submit" value="Zpět"></a>');
    }

}
else
{
    echo("Nepovedlo se připojit do databáze.");
}
?>
Odpovědět
4.1.2014 11:36
To co se zdá být nemožné, je vždy možné.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jan Demel
Kit:4.1.2014 11:48

Je to nejen zdlouhavé, ale navíc je to i špatně. Pro přihlašování se používá session a SQL dotaz musí mít jinou podobu než ty dva zmetky, které tam máš. Zkus hledat dál.

Nahoru Odpovědět
4.1.2014 11:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Demel
Tvůrce
Avatar
Odpovídá na Kit
Jan Demel:4.1.2014 11:49

A ohledně vypisování té stránky ... mělo by se to udělat ještě jinak, nebo by jsem to mohl nechat normálně v echo() ?

Nahoru Odpovědět
4.1.2014 11:49
To co se zdá být nemožné, je vždy možné.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jan Demel
Kit:4.1.2014 11:56

Tak, jak to máš, je to poněkud nevýhodné, protože do toho echa nemůžeš vkládat obsah proměnných. Proto bývá obvykle výhodnější místo stringu v apostrofech použít Heredoc, kterým můžeš do výstupní stránky vkládat nejen čísla a stringy, ale i celé objekty.

Nahoru Odpovědět
4.1.2014 11:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Tvůrce
Avatar
Odpovídá na Jan Demel
mkub:4.1.2014 12:09

ohladnetej HTML kodu mas na vyber viacero moznosti:

  1. moznost je ta, co si pouzil, ale ak pouzijes apostrofy, neda sa vlozit do vystupu obsah premien, nefunguju ani escape sekvencie, uvodzovky ten problem riesi, ale v HTML treba potom escapeovat uvodzovky
  2. moznost je prerusit vykonavanie PHP kodu, nasledne tam dat HTML kod a zase subor ukoncit PHP kodom (hrozi, ze sa PHP kod zmiesa s HTML kodom
  3. moznost je pouzit zapisu HEREDOC, vyhoda: moznost pouzitia premien, nemusia sa escapeovat, aj ked escape sekvencie funguju tak ako pri uvodzovkach a PHP kod sa nerozbije tak, ako v tom druhom bode, cize je v celku
Editováno 4.1.2014 12:11
 
Nahoru Odpovědět
4.1.2014 12:09
Avatar
itmakememad
Člen
Avatar
itmakememad:17.1.2014 12:35

Ahoj, viděl jsem že se tu řeší login systém a to je přesně to, co se snažím teďka naučit/vytvořit. Proto prosím zkušené programátory, jestli mi kouknete na moje řešení. Zda li je myšlenka a provedení správné/bezpečné, nebo eventuelně jak to přepsat. zatím jsem neřešil připojení do DB a ověření uživatele, takže stačí když budou obě pole (user i pass) vyplněné čímkoli.

1. Soubor index.php

<?php

if (isset($_POST['SendCheck'])) {
    if (isset($_POST['UserName']) && !empty($_POST['UserName']) &&
            isset($_POST['Password']) && !empty($_POST['Password'])) {

        //tady by prislo overeni vuci DB jestli existuje user a heslo je OK

        session_start();
        $_SESSION['UserName'] = $_POST['UserName'];
    } else {
        $ErrMsg = 'UserName or Password must be filled!';
    }
}
?>


<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>

        <?php
        // vypsani chybove zpravy
        if (isset($ErrMsg))
            echo('<strong>' . $ErrMsg . '</strong><br />');

        //pokud je vytvorena session / uzivatel je prihlasen zobrazi kdo je prihlasen a moznost odlogovani
        //pokud ne, pak zobrazi prihlasovaci formular
        if (isset($_SESSION['UserName'])) {
            echo('You are loged in as: ' . $_SESSION['UserName'] . '<br />');
            echo('<a href="logout.php">LogOut</a>');
        } else
        {
            echo('
            <form method="post">
                <label for="UserName">UserName</label>
                <input name="UserName" type="text" /><br />
                <label for="Password">Password</label>
                <input name="Password" type="password" /><br />
                <input type="submit" value="Login" />
                <input name="SendCheck" type="hidden" value="LoginForm" />
            </form>
            ');
        }
        ?>


    </body>
</html>

2. Soubor logout.php

<?php

$_SESSION = array();
session_destroy();
header('Location: index.php');
exit;

?>
 
Nahoru Odpovědět
17.1.2014 12:35
Avatar
itmakememad
Člen
Avatar
Odpovídá na itmakememad
itmakememad:17.1.2014 12:57

Teď když na to koukám, tak mě ještě napadlo, že do URL odkazu odhlásit bych mohl přímo dopsat parametr např index.php?logou­t=true a pak na začátku indexu.php ještě testovat tuto hodnotu v $_GET, tam vykonat dohlášení a přesměrování zpět na index. Tím bych si ušetřil ten logout.php

 
Nahoru Odpovědět
17.1.2014 12:57
Avatar
Odpovídá na itmakememad
Martin Konečný (pavelco1998):17.1.2014 14:56
  1. Funkci session_start() bych dal na začátek souboru, ne až do nějaké podmínky.
  2. Pro kontrolu validaci zadaných dat bych použil spíše opačné porovnávání a chyby ukládal postupně do pole. Pak se nestane, že budeš mít velké větvení.
<?php

session_start();

$errors = array();
if ($_POST) {
    if (empty($_POST["name"])) {
      $errors[] = "Nebylo zadáno jméno.";
    }
    if (empty($_POST["password"])) {
      $errors[] = "Nebylo zadáno heslo.";
    }

    if (empty($errors)) {
        // kontrola správnosti jména a hesla v DB
        $_SESSION["uzivatel_id"] = $data_z_db["id"];
        header("location:index.php");
        exit;
    }
}


// výpis chyb
if (!empty($errors)) {
    echo "<ul>";
    foreach ($errors as $error) {
       echo "<li>" . $error . "</li>";
    }
    echo "</ul>";
}

Místo foreache by to mělo fungovat i přes funkci implode() na jeden řádek.

Nahoru Odpovědět
17.1.2014 14:56
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
itmakememad
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
itmakememad:17.1.2014 15:53

Jo to se mi líbí víc :) Děkuji za odpověď.

 
Nahoru Odpovědět
17.1.2014 15:53
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 9 zpráv z 9.