Autor | Zpráva | ||
---|---|---|---|
Pavel Vodnář Profil * |
#1 · Zasláno: 25. 1. 2011, 21:50:13
dobrý den, potřeboval by jsem poradit, když z databáze ověřím uživatele (správné heslo i přihlašovací jméno) jak po splnění této podmínky přesměrovat na script který obsahuje data přihlášeného uživatele? Děkuji Vám
|
||
Tori Profil |
#2 · Zasláno: 25. 1. 2011, 21:59:37
Stav přihlášení + jméno/id uživatele ukládáte nejspíš do session? Tak potom použít
header("Location: $url_webu/skript.php"); |
||
Pavel Vodnář Profil * |
#3 · Zasláno: 25. 1. 2011, 22:23:21
Mám tento script:
<?php $submit = $_POST['submit']; $name = $_POST['name']; $password = $_POST['password']; // kontrola údajů if ($submit) { $connect = mysql_connect ("$localhost","$user","$pass") or die("Nepodařilo se připojit k databázi"); mysql_select_db ("databaze..."); //select database //zkouka existence jmena $zkouskajmena = mysql_query("SELECT uzivatelskejmeno FROM klienti WHERE uzivatelskejmeno='$name'"); $count = mysql_num_rows($zkouskajmena); // zkouska existence hesla u daného jména $zkouskahesla= mysql_query("SELECT heslo FROM klienti WHERE heslo='$password'"); $count1 = mysql_num_rows($zkouskahesla); if ($count==0) { $obsazeno ="Uživatelské jméno nenalezeno"; } if (($count!=0)&&($count1==0)) { $uzivatelnalezen ="Zadali jste špatné heslo"; } } ?> Zde potřebuji pomoci jak to do toho zakombinovat aby mě to přesměrovalo na přihlášenou stránku když budou údaje ověřeny. Jak tedy nato? děkuji Vám |
||
Tori Profil |
#4 · Zasláno: 25. 1. 2011, 22:47:15 · Upravil/a: Tori
1. Použijte ten sql dotaz, co vám v předchozím vlákně radil xmark. Takhle by se každý uživatel mohl kromě svého hesla přihlásit i s heslem kteréhokoli jiného uživatele. Detto ošetření vstupu z formuláře zmiňované tamtéž.
2. Rámcově takto (↓neřeším ukládání stavu přihlášen/nepřihlášen ani používání session) : $vysledekSql = mysql_query("SELECT jmeno, heslo FROM klienti WHERE jmeno = '$name' AND heslo = '$password'"); $uzivatelDb = mysql_fetch_assoc($vysledekSql); if ($name == $uzivatelDb['uzivatelskejmeno'] && $password == $uzivatelDb['heslo']) header("Location: http://muj.web.cz/pouze-pro-prihlasene.php"); else echo "Špatné uživatelské jméno nebo heslo"); Taky se koukněte na hotový skript pro přihlašování uživatelů ve FAQ, pro inspiraci. |
||
Radek Cvek Profil |
#5 · Zasláno: 25. 1. 2011, 22:50:34
Podle mě to přesměrovávání je to krok navíc, který lze stejně obelstít. Taky by se mělo testovat v http://muj.web.cz/pouze-pro-prihlasene.php jestli je v session přihlášený, jinak by to do url mohl vložit kdokoliv.
|
||
pcmanik Profil |
#6 · Zasláno: 25. 1. 2011, 23:16:12
Tato podmienka sa splni vzdy if ($submit) totizto aj keby post bol prazdny, tak sa ta premenna uz vyplni prazdna, a teda vyhovuje podmienke.
|
||
xmark Profil |
#7 · Zasláno: 26. 1. 2011, 11:13:21
Pavel Vodnář
Doporučoval bych nastudovat si, jak se používá session. V hodně zahuštěné zkratce: 1. session je něco, co můžu vytvářet na serveru pro každého návštěvníka zvlášť. Kdykoliv to můžu vytvořit, přepsat, nebo načíst, aniž bych to musel předávat v adrese. 2. když návštěvník úspěšně vypíše přihlašovací formulář, vytvoříš mu session a dáš do ní třeba jeho ID 3. existenci a hodnotu té session ověřuješ a můžeš ji zpracovávat Takže můžeš mít třeba adresu domena.cz/o-mne.php a můžeš zařídit, že tam nepřihlášený neuvidí nic a každý přihlášený tam uvidí svoje údaje. |
||
Pavel Vodnář Profil * |
#8 · Zasláno: 26. 1. 2011, 22:28:35
Tori: ze #4
Dobrý den, když vložím váš kód a zadam existující heslo a jméno píše mi to: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/web5/ Co znamená tato chyba? Děkuji Vám |
||
Radek Cvek Profil |
#9 · Zasláno: 26. 1. 2011, 22:44:43
$vysledekSql = mysql_query("SELECT jmeno, heslo FROM klienti WHERE jmeno = '".$name."' AND heslo = '".$password."' ;"); |
||
Tori Profil |
#10 · Zasláno: 27. 1. 2011, 08:07:30
Pavel Vodnář:
Asi jsem použila jiné názvy sloupců, než máte v db: jmeno misto uzivatelskejmeno. Je to tím? |
||
Pavel Vodnář Profil * |
#11 · Zasláno: 27. 1. 2011, 09:01:20
Tori:
Když to zaměním takto: $vysledekSql = mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE jmeno = '$name' AND heslo = '$password'"); pořád mi to píše chybu: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/web5/webovastranka.net/webovastranka.net/prihlaseni.php on line 23 Warning: Cannot modify header information - headers already sent by (output started at /var/www/web5/prihlaseni.php:23) in /var/www/web5/prihlaseni.php on line 25 řádek 23 je tento: $uzivatelDb = mysql_fetch_assoc($vysledekSql); může to být ještě nečím jiným? Děkuji Vám |
||
Tori Profil |
#12 · Zasláno: 27. 1. 2011, 09:05:43
Pavel Vodnář:
$vysledekSql = mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '$name' AND heslo = '$password'"); echo mysql_error(); |
||
xmark Profil |
#13 · Zasláno: 27. 1. 2011, 09:10:11
Pavel Vodnář:
To SQL je syntakticky v pořádku. Jestli sedí názvy polí, to musíš ověřit sám. Až budeš mít jistotu, že je to v tomto směru v pořádku, dej sem tu část kódu, která začíná tím dotazem a končí tím 23. řádkem. "Cannot modify header information" znamená, že se snažíš pracovat s hlavičkou po tom, co php už vytvořilo nějaký výstup pro prohlížeč - prostě proběhlo echo. To nelze. Dá se to ošetřit funkcí ob_start. |
||
Radek Cvek Profil |
#14 · Zasláno: 27. 1. 2011, 10:02:33
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in
za databázový dotaz mysql_query bych přidal or die(mysql_error()); - je jasné, že výsledek z databáze není MySQL result, ale bude to nejspíš pravdivostní hodnota pro zkoušku je dobré vypsat si, co vlastně databázi posílám a jestli je to vůbec platný dotaz: před mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '".$name."' AND heslo = '".$password."' ;"); napíšu echo "SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '".$name."' AND heslo = '".$password."' ;" a zkontroluji, co mi to vypsalo - platné sloupce, správná syntaxe Cannot modify header information - headers already sent buď byl výpis před odesíláním hlavičky nebo je php příkaz header ve skriptu až po html !DOCTYPE nebo výpisu - header by měl být jeden z prvních příkazů ve skriptu |
||
Pavel Vodnář Profil * |
#15 · Zasláno: 27. 1. 2011, 10:13:32
Děkuji Vám za veškeré informace - ani nevíte jak si jich vážím
Tori - výborně už to běží Ještě by sem se chtěl zeptat - v případě úspěšně zadaného hesla a jména me to přesměruje na stránku uzivatel-prihlasen.php Dalo by jse nějak zabránit tomu aby když uživatel vloží natvrdo adresu do url jako nepříhlášen tak aby ho to nepustilo na tuto stránku? respektive přesměrovalo na prihlaseni.php? Děkuji Vám, moc. |
||
Radek Cvek Profil |
#16 · Zasláno: 27. 1. 2011, 10:18:07
Dalo by jse nějak zabránit tomu aby když uživatel vloží natvrdo adresu do url jako nepříhlášen tak aby ho to nepustilo na tuto stránku? respektive přesměrovalo na prihlaseni.php?
Jedině pomocí session - při správném přihlášení nastavit session a to potom na prvním řádku uzivatel-prihlasen.php kontrolovat. |
||
Radek Cvek Profil |
#17 · Zasláno: 27. 1. 2011, 10:28:47 · Upravil/a: Radek Cvek
prihlaseni.php
<?php session_start(); ... $vysledekSql = mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '".$name."' AND heslo = '".$password."' ;"); if ($radek = mysql_fetch_row($vysledekSql)) $_SESSION["user"]=$radek["uzivatelskejmeno"]; ... ?> uzivatel-prihlasen.php <?php session_start(); if (!isset($_SESSION["user"])) header("Location: prihlaseni.php"); echo 'Přihlášený uživatel: '.$_SESSION["user"]; echo '<a href="logout.php">Odhlásit</a>' ?> logout.php <?php session_start(); unset($_SESSION["user"]); header("Location: prihlaseni.php"); ?> |
||
Alphard Profil |
#18 · Zasláno: 27. 1. 2011, 10:49:02
[#17] Aspoň to ošetřete na sql injection.
Radek Cvek: Dotazy v mysql_query() se neukončují středníkem, je to dost neobvyklé, vždy to člověku padne do oka. Pavel Vodnář: Četl jste místní FAQ? Je tam hotový script na přihlášení. Vzhledem k [#3] doporučuji začít odsazovat kód, až takto zanoříte do cyklu dvě podmínky, nikdo se v tom nevyzná. |
||
xmark Profil |
#19 · Zasláno: 27. 1. 2011, 11:36:32
Radek Cvek:
Jen doporučení: na webech, kde používám session_start(); to dávám přímo na konec config.php. Ušetří to spoustu případů, kdy by na to člověk zapomněl a musel doplňovat. A jak říká klasik: "Profíka i pár stovek milisekund zdržuje." :-) |
||
Pavel Vodnář Profil * |
#20 · Zasláno: 27. 1. 2011, 13:58:55
Radek Cvek:
Když vložím do kódu prihlaseni.php <?php session_start(); ... $vysledekSql = mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '".$name."' AND heslo = '".$password."' ;"); if ($radek = mysql_fetch_row($vysledekSql)) $_SESSION["user"]=$radek["uzivatelskejmeno"]; ... ?> a zadám správnou kombinaci hesla a jména vypíše mi to chybu: Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0 Jak toto opravit? děkuji Vám |
||
Radek Cvek Profil |
#21 · Zasláno: 27. 1. 2011, 14:19:39 · Upravil/a: Radek Cvek
Zkusil bych za session_start(); vložit session_register("user");
Ale špíš pomůže novější verze PHP Zkontroloval bych ještě, jestli se ve skriptu nepoužívá nějaká proměná $user - potom by se musela přejmenovat |
||
Pavel Vodnář Profil * |
#22 · Zasláno: 27. 1. 2011, 14:27:23
Radek Cvek:
ano používám proměnou $user, dá se přejmenovat toto: $_SESSION["user"]=$radek["uzivatelskejmeno"]; nebo se musí přejmenovat ta proměnná? Děkuji |
||
Radek Cvek Profil |
#23 · Zasláno: 27. 1. 2011, 14:31:12 · Upravil/a: Radek Cvek
Může se změnit $_SESSION["user"] - třeba na $_SESSION["loggeduser"] to není problém - v tom byla ta chyba. Starší verze PHP+nastavení register_globasl zapříčiní, že se na začátku snaží přejmenovat proměnné v programu těmi globálními a vypíše to varování. Nově by už register_globals nemělo vůbec v PHP existovat.
|
||
Tori Profil |
#24 · Zasláno: 27. 1. 2011, 14:39:56 · Upravil/a: Tori
Radek Cvek:
Ad [#17]: Použijte buď if ($radek = mysql_fetch_assoc($vysledekSql)) $_SESSION["user"]=$radek["uzivatelskejmeno"]; if ($radek = mysql_fetch_row($vysledekSql)) $_SESSION["user"]=$radek[0]; |
||
Pavel Vodnář Profil * |
#25 · Zasláno: 27. 1. 2011, 14:45:10
Radek Cvek:
Neběží mi to, mám tento kód: <?php session_start(); session_register("loggeduser"); $submit = $_POST['submit']; $name = $_POST['name']; $password = $_POST['password']; // údaje pro připojení k DB $localhost = "l---------------------"; $user ="---------------"; $pass = "-------------------------"; // kontrola údajů if ($submit) { $connect = mysql_connect ("$localhost","$user","$pass") or die("Nepodařilo se připojit k databázi"); mysql_select_db ("-------------------"); //select database $vysledekSql = mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '".$name."' AND heslo = '".$password."';"); if ($radek = mysql_fetch_row($vysledekSql)) $_SESSION["loggeduser"]=$radek['uzivatelskejmeno']; $uzivatelDb = mysql_fetch_assoc($vysledekSql); //23 if ($name == $uzivatelDb['uzivatelskejmeno'] && $password == $uzivatelDb['heslo'] && ($name!="") &&($password!="") ) header("Location: http://sroty.net/uzivatel-prihlasen.php"); else $error = ("Špatné uživatelské jméno nebo heslo"); } ?> Když změním třeba na $_SESSION["loggeduser"] tak mi to pak píše: Špatné uživatelské jméno nebo heslo. Mohla by být chyba ještě v něčem jiném? Děkuji Vám |
||
Tori Profil |
#26 · Zasláno: 27. 1. 2011, 14:53:06
Pavel Vodnář:
„Když změním třeba na $_SESSION["loggeduser"] tak mi to pak píše: Špatné uživatelské jméno nebo heslo.“ Změnil jste to ve všech skriptech (přihlášení, stránka pro přihl.uživatele, odhlášení)? |
||
Pavel Vodnář Profil * |
#27 · Zasláno: 27. 1. 2011, 15:05:18
stránka po přihlášení:
<?php session_start(); if (!isset($_SESSION["loggeduser"])) header("Location: prihlaseni.php"); echo 'Přihlášený uživatel: '.$_SESSION["loggeduser"]; echo '<a href="logout.php">Odhlásit</a>' ?> skript odhlášéní jsem ješte neprogramoval, může to být tím? |
||
Pavel Vodnář Profil * |
#28 · Zasláno: 27. 1. 2011, 16:46:37
Když je session_register("user"); a zadám správnou kombinaci hesla a jména vyříše mi to chybu:
Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0 Když je session_register("neco"); a zadám správnou kombinaci hesla a jména vypíše mi to chybu: špatné uživatelské jméno nebo heslo Proč to takto pracuje jak to opravit aby to pracovalo správně? Děkuji Vám |
||
Radek Cvek Profil |
#29 · Zasláno: 27. 1. 2011, 18:52:42 · Upravil/a: Radek Cvek
Problém toho kódu asi je, že se s výsledky databáze pracuje dvakrát:
<?php session_start(); session_register("loggeduser"); $submit = $_POST['submit']; $name = $_POST['name']; $password = $_POST['password']; // údaje pro připojení k DB $localhost = "l---------------------"; $user ="---------------"; $pass = "-------------------------"; // kontrola údajů if ($submit) { $connect = mysql_connect ("$localhost","$user","$pass") or die("Nepodařilo se připojit k databázi"); mysql_select_db ("-------------------"); //select database $vysledekSql = mysql_query("SELECT uzivatelskejmeno, heslo FROM klienti WHERE uzivatelskejmeno = '".$name."' AND heslo = '".$password."';"); if ($radek = mysql_fetch_row($vysledekSql)) { $_SESSION["loggeduser"]=$radek['uzivatelskejmeno']; header("Location: http://sroty.net/uzivatel-prihlasen.php"); } /* toto všechno je tu navíc $uzivatelDb = mysql_fetch_assoc($vysledekSql); //23 if ($name == $uzivatelDb['uzivatelskejmeno'] && $password == $uzivatelDb['heslo'] && ($name!="") &&($password!="") ) */ else $error = ("Špatné uživatelské jméno nebo heslo"); } ?> |
||
Pavel Vodnář Profil * |
#30 · Zasláno: 28. 1. 2011, 10:01:22
Radek Cvek:
Ano máte pravdu, když tam nedám /* toto všechno je tu navíc $uzivatelDb = mysql_fetch_assoc($vysledekSql); //23 if ($name == $uzivatelDb['uzivatelskejmeno'] && $password == $uzivatelDb['heslo'] && ($name!="") &&($password!="") ) */ už to pracuje ale mám problémek se session - jakmile se přihlásím viz kód: <?php session_start(); if (!isset($_SESSION["user"])) header("Location: prihlaseni.php"); echo 'Přihlášený uživatel: '.$_SESSION["user"]; echo '<a href="logout.php">Odhlásit</a>' ?> Načítá mi to do proměnné Přihlášený uživatel: '.$_SESSION["user"]; hodnotu z prihlaseni.php $user ="---------------"; Jakmile se mi to přihlásí píše mi to místo jména uživatele jméno: // údaje pro připojení k DB - $user ="---------------"; Pokouším se to upravit ale marně, jak to opravit? Děkuji Vám |
||
Téma pokračuje na další straně.
|
0