Avatar
Jan Demel
Redaktor
Avatar
Jan Demel:

Č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
Redaktor
Avatar
Odpovídá na Jan Demel
Kit:

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
Redaktor
Avatar
Odpovídá na Kit
Jan Demel:

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
Redaktor
Avatar
Odpovídá na Jan Demel
Kit:

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  +1 4.1.2014 11:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Redaktor
Avatar
Odpovídá na Jan Demel
mkub:

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  +1 4.1.2014 12:09
Avatar
itmakememad
Člen
Avatar
itmakememad:

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:

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):
  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  +2 17.1.2014 14:56
Avatar
itmakememad
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
itmakememad:

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

 
Nahoru Odpovědět  +1 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.