Autor | Zpráva | ||
---|---|---|---|
noris Profil |
Ahoj, pokouším se naprogramovat přihlášení, které by mělo fungovat následovně:
Po kliknutí na Přihlásit se to ověří zda není login a heslo prázdné, pokuď prázdné není, mělo by to ověřit zda nick a heslo jsou z databáze. Poté zapsat do session id uživatele. Poté na stránkách ji ověřovat zda je nastavené session či ne. Toto je můj zápis (k session jsem se ještě nedopracoval neboť mám chybu již tady v začátku..). <form method="POST"> <table> <tr> <td>Login:</td> <td><input name="login" type="text"></td> </tr> <td>Heslo:</td> <td><input name="heslo" type="password"></td> </tr> <tr> <td colspan="2"><input type="Submit" name="prihlaseni" value="Prihlasit se"></td> </tr> </table> </form> <?php if ($_POST['prihlaseni']) { if (!empty($_POST['login']) & !empty($_POST['login'])) { $link = mysql_connect('wm15.wedos.net', 'a12631_system', 'heslo'); if (!$link) { die('Could not connect: ' . mysql_error()); } mysql_select_db("d12631_system"); $login = $_POST['login']; $query = "select * from uzivatele where login = $login"; $res = mysql_query($query); $row = mysql_fetch_array($res); $heslo = $_POST['heslo']; $heslo1 = $row['heslo']; if ($heslo == $heslo1) { echo "přihlášení úspěšné"; } echo "přihlášení neúspěšné"; } } |
||
Jan Tvrdík Profil |
Co zkusit místní návod?
Jinak: • Naučit se odsazovat kód, aby byl čitelný. • Na 17 řádku má být && a ne &. • Skript je náchylný na SQL injection. Uprav si 23. řádek na $login = mysql_real_escape_string($_POST['login'];
• Vnější podmínka (řádek 16 a 34) je v podstatě zbytečná, můžeš ji zrušit. |
||
noris Profil |
#3 · Zasláno: 16. 2. 2012, 15:27:58
Tak jsem to nakonec vyřešil pomocí jednoho návodu.
Jen bych potřeboval upravit aby po příhlašení nastavilo $_SESSION['id']=$row['id']; A aby se všechny tyto funkce dělali jen pokuď session není nastavená. V kódu o to mám nějaké pokusy ale hází mi to Error: Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /data/web/virtuals/12631/virtual/www/subdom/s1/index.php:2) in /data/web/virtuals/12631/virtual/www/subdom/s1/pozadi/prihlaseni.php on line 2 <?php session_start(); if (isset($_POST['login']) && isset($_POST['heslo'])){ $link = mysql_connect('wm15.wedos.net', 'a12631_system', 'heslo'); mysql_select_db("d12631_system"); if (!$link) { die('Could not connect: ' . mysql_error()); } @$query = "SELECT * FROM uzivatele WHERE login=\"".$_POST['login']."\""; if (!$query) { echo "Spojenie z databázou sa nepodarilo"; } @$result = mysql_query($query, $link); if (!$query) { echo "Vyber z databáze sa nepodaril"; } $row = mysql_fetch_array($result); if ($row['heslo'] == $_POST['heslo']){ $_SESSION['id']=$row['id']; echo "prihlasen"; } } else { ?> <form method="POST"> <table> <tr> <td>Login:</td> <td><input name="login" type="text"></td> </tr> <td>Heslo:</td> <td><input name="heslo" type="password"></td> </tr> <tr> <td colspan="2"><input type="Submit" name="prihlaseni" value="Prihlasit se"></td> </tr> </table> </form> <?php } ?> |
||
Again Profil |
Pokud si přeložíš chybu, zjistíš že už nemůžeš nastavit session. Tento problém lze vyřešit funkcí ob_start, nebo upravit kód tak, aby odeslal všechny hlavičky v jeden moment ...
|
||
noris Profil |
#5 · Zasláno: 16. 2. 2012, 16:09:30
Again:
Co je jednoduší? (popřipadě jestli by jste mi to do kódu doplnili..) Díky |
||
noris Profil |
#6 · Zasláno: 17. 2. 2012, 19:43:41
Tak už jsem vyřešil to že mi to hází error atd.
Problém je v tom, že když nastavím session po přihlášení, web bere přihlášené ale všechny lidi co ho navštíví. Chtěl bych se tedy zeptat jak to upravit aby mi to šlo jen pro určitého uživatele. PS: použití cookies se nebráním, takže pokuď by to bylo jednoduší... <?php session_start(); if (isset($_POST['login']) && isset($_POST['heslo'])){ $link = mysql_connect('wm15.wedos.net', 'a12631_system', 'heslo'); mysql_select_db("d12631_system"); if (!$link) { die('Could not connect: ' . mysql_error()); } @$query = "SELECT * FROM uzivatele WHERE login=\"".$_POST['login']."\""; if (!$query) { echo "Spojenie z databázou sa nepodarilo"; } @$result = mysql_query($query, $link); if (!$query) { echo "Vyber z databáze sa nepodaril"; } $row = mysql_fetch_array($result); if ($row['heslo'] == $_POST['heslo']){ $_SESSION['id']=$row['id']; echo "prihlasen"; } } else { ?> <form method="POST"> <table> <tr> <td>Login:</td> <td><input name="login" type="text"></td> </tr> <td>Heslo:</td> <td><input name="heslo" type="password"></td> </tr> <tr> <td colspan="2"><input type="Submit" name="prihlaseni" value="Prihlasit se"></td> </tr> </table> </form> <?php } ?> |
||
Dědek Profil |
#7 · Zasláno: 17. 2. 2012, 20:45:53
Jak pak kontroluješ na dalších stránkách jestli je uživatel přihlášen?
|
||
noris Profil |
#8 · Zasláno: 17. 2. 2012, 20:51:15
Takto...asi bude chyba zde...
<h3>Uživatelské menu</h3> <?if (isset($_SESSION["id"])):?> <?php include "uzivatelskeodkazy.php";?> <?else:?> <?php include "prihlaseni.php";?> <?endif?> |
||
Dědek Profil |
#9 · Zasláno: 17. 2. 2012, 21:06:58
Pokud se nepletu, tak problém bude v tom, že Ti na začátku každého takového souboru chybí
session_start(); pak bych také pro jistotu upravil podmínku kontroly na if (isset($_SESSION["id"]) && is_numeric($_SESSION["id"])) Dávej si pozor na otevírací tag, používej <?php ... ?> |
||
noris Profil |
#10 · Zasláno: 17. 2. 2012, 21:11:52
Dědek:
jak ověřuji zda je nastavená session tak to vkládám do jiného souboru kde session zapínám. V souboru do kterého vkládám mám toto hned na začátku souboru: <?php session_start(); session_register("id");?> |
||
Dědek Profil |
#11 · Zasláno: 17. 2. 2012, 21:24:55
Tak tady je ten problém, hned po startu si vytváříš session "id" a při kontroluje kontroluješ jen její existenci (nikoliv obsah), tj. každý uživatel je přihlášen.
Odstraň ten druhý řádek a session "id" vytvářej jen při úspěšném přihlášení... $_SESSION['id']=$row['id']; Při odhlášení uživatele ji zase zruš, fce unset($_SESSION['id']);
|
||
noris Profil |
#12 · Zasláno: 17. 2. 2012, 22:09:09
Dědek:
Jo díky, již to funguje jak má. Jen mám ještě dotaz (trošku mimo toto téma, ale nechci zbytečně zakládat další diskuzi). Když jsem měl v souboru jen formuláře a podmínky vše fungovalo, ale jak jsem doplnil divi abych to vzhledově k něčemu vypadalo, obsah formu se již nechce zobrazit. Soubor s formem: <link rel="stylesheet" href="../styly/style.css" type="text/css" /> <?php //include "menuadministrace.php"; /*----------------------------------------------------------------------------------- | Dokumentace | | Název: Přidání článku do databáze | | Autor: Pavel Čermák| | Datum: 2012 | | Popis: Uživatel napíše a odešle článek, který se uloží do databáze článků. | Proměnné: $link=připojí k databázi $datum=získá aktuální datum $nadpis=nadpis článku §rubrika=rubrika článku $viditelnost=je článek viditelný nebo ne? $uvod=uvod članku $pokracovani=pokračovaní článku -----------------------------------------------------------------------------------*/ echo "<div id\"aobsah\">";?> <form method="POST"> Nadpis:<br> <textarea name="nadpis"></textarea><br> Rubrika:<br><input type="text" name="rubrika"><br> Viditelnost:<br>Veřejný: <input type="radio" name="viditelnost" value="1" checked="checked"> Neveřejný: <input type="radio" name="viditelnost" value="0"><br> Úvod:<br> <textarea name="uvod"></textarea><br> Pokracovani:<br> <textarea name="pokracovani"></textarea><br> <input type="submit" name="zverejnit" value="Zveřejnit"> </form> <?php if (isset($_POST["zverejnit"])){ $link = mysql_connect('wm15.wedos.net', 'a12631_system', 'heslo'); mysql_select_db("d12631_system"); $time = Time(); $datum = date("j. n. Y"); $nadpis = $_POST["nadpis"]; $rubrika = $_POST["rubrika"]; $viditelnost = $_POST["viditelnost"]; $uvod = $_POST["uvod"]; $pokracovani= $_POST["pokracovani"]; mysql_query("INSERT INTO clanky (id,rubrika,datum,autor,viditelnost,nadpis,uvod,pokracovani) VALUES ('','$rubrika','$time','admin','$viditelnost','$nadpis','$uvod','$pokracovani')"); echo "clanek odeslan"; } ?> </div> </div> <html> <link rel="stylesheet" href="../styly/style.css" type="text/css" /> <head> <title>Administrace</title> </head> <body> <div id="obal"> <div id="head"> <h1> Vítej v administraci </h1> </div> <div id="amenu"> <h4> <a href="pridaniclanku.php">Přidat článek</a> <a href="pridanirubriky.php">Přidat rubriku</a> <a href="pridanistranky.php">Přidat stránku</a> <a href="pridaniwidgetu.php">Přidat widget</a> <a href="odhlaseni.php">Odhlásit se</a> </h4> </div> <div id="panel"> <a href="administrace.php">Články</a><br /> <a href="arubriky.php">Rubriky</a><br /> <a href="stranky.php">Stránky</a> <br /> <a href="widgety.php">Widgety</a> </div> |
||
Dědek Profil |
#13 · Zasláno: 17. 2. 2012, 22:42:06
Zkusmo jsem si ten kód nechal zobrazit a obsah div "aobsah" se mi vypíše (Chrome / IE9 / Firefox).
Jedna chyba je tady echo "<div id\"aobsah\">"; , chybí tam znak = za id.
Za druhé si dej pozor na duplicitní načítání stylů - načítáš je v obou souborech. Jediné co mě napadá, jestli ten div nemáš nějak špatně nastylovaný, zkus vypnout styly úplně a uvidíš. |
||
noris Profil |
#14 · Zasláno: 17. 2. 2012, 22:56:20
Dědek:
když styly vypnu naběhne to, když tam vypisuji napřiklad články všechno fachá. Skusím opravit chyby :) a ozvu se jak to dopadlo. |
||
Dědek Profil |
#15 · Zasláno: 17. 2. 2012, 23:15:17
Ok, super.
Ještě jedna věc, pro uložení data a času bych použil pole typu timestamp (MySQL manuál) a pro následný výpis funkci date_format() (MySQL manuál), do budoucna se Ti s tím bude mnohem lépe pracovat. |
||
noris Profil |
#16 · Zasláno: 18. 2. 2012, 00:58:51
Ještě mám jeden dotaz. Nastavuji ověření do administrace, a chci že pokuď není nastavená session aby to vypsalo neoprávněný přístup.
<?php if (!isset($_SESSION["id"])) { echo "neopravněný přístup"; }?> |
||
TomasJ Profil |
#17 · Zasláno: 18. 2. 2012, 01:19:55
noris:
Není nastavená z poslední relace? Zkus smazat Cookies. Vypíše se "neoprávněný přístup"? |
||
noris Profil |
TomasJ:
cookies jsem smazal, nápis se nevypíše. I když kliknu na odhlásit se, což odnastaví dotyčnou session (na webu mě to odhlásí ale do administrace mohu pořád..) |
||
Dědek Profil |
#19 · Zasláno: 18. 2. 2012, 01:47:23
Nenastavuješ si opět někde nechtěně tu danou session?
Když si vypíšeš všechny session (těsně před tou podmínkou), je tam? print_r($_SESSION); |
||
noris Profil |
#20 · Zasláno: 18. 2. 2012, 01:54:46
nic se nevypíše, je to prázdné...
Když najedu přímo na soubor kde mám ten script (to overeniprihlaseni.php) tak to hodí neoprávněný přístup. overeniprihlaseni.php <?php if (!isset($_SESSION["id"])) { echo "neopravněný přístup"; }?> <?php session_start(); include "overeniprihlaseni.php"; ?> <link rel="stylesheet" href="../styly/style.css" type="text/css" /> <head> <title>Administrace</title> </head> <body> <div id="obal"> <div id="head"> <h1> Vítej v administraci </h1> </div> <div id="amenu"> <h4> <a href="pridaniclanku.php">Přidat článek</a> <a href="pridanirubriky.php">Přidat rubriku</a> <a href="pridanistranky.php">Přidat stránku</a> <a href="pridaniwidgetu.php">Přidat widget</a> <a href="odhlaseni.php">Odhlásit se</a> </h4> </div> <div id="panel"> <a href="administrace.php">Články</a><br /> <a href="arubriky.php">Rubriky</a><br /> <a href="stranky.php">Stránky</a> <br /> <a href="widgety.php">Widgety</a> </div> <?php include "menuadministrace.php"; ?> <div id="aobsah"> <?php $link = mysql_connect('wm15.wedos.net', 'a12631_system', 'heslo'); if (!$link) { die('Could not connect: ' . mysql_error()); } mysql_select_db("d12631_system"); $query = "select * from clanky"; $res = mysql_query($query); while ($row = mysql_fetch_array($res)) { echo "<strong>"; echo $row['nadpis']; echo "</strong><br />"; echo "<b> id:</b> "; echo $row['id']; echo "<b> autor:</b> "; echo $row['autor']; echo "<b> rubrika:</b> "; $rubrika =$row['rubrika']; $query1 = "select nazev from rubriky where id=$rubrika"; $res1 = mysql_query($query1); while ($row1 = mysql_fetch_array($res1)) { echo $row1['nazev']; } echo " "; echo "<br />"; $id = $row['id']; $odkaz = "<a href=\"upraveniclanku.php?id=$id\">Upravit článek</a> <a href=\"smazaniclanku.php?id=$id\">Smazat článek</a>"; echo "$odkaz"; echo "<br />"; } ?> </div> </div> </body></html> |
||
Dědek Profil |
#21 · Zasláno: 18. 2. 2012, 02:02:16
Už to vidím, on se tam ten nápis "neopravněný přístup" podle mě vypíše i tak, jen ho řekl bych překryje zbytek stránky, protože je vlastně mimo strukturu stránky. Schválně jestli ho uvidíš, když vypneš styly?
Přepokládám však, že cílem by mělo být, aby se v tomto případě administrace vůbec nezobrazila? |
||
noris Profil |
#22 · Zasláno: 18. 2. 2012, 02:06:46
Dědek:
Ano vypíše se. Už sem na to teďka taky koukal. Takže k tomu Neoprávněný přístup bych měl dodat die nebo něco na ten způsob? |
||
Dědek Profil |
#23 · Zasláno: 18. 2. 2012, 02:11:29
Ano,
die() je řešení.
|
||
noris Profil |
#24 · Zasláno: 18. 2. 2012, 02:21:53
Dědek:
Děkuji vše již funguje jak má. |
||
Časová prodleva: 12 let
|
0