Autor | Zpráva | ||
---|---|---|---|
Pavel015 Profil |
Dobrý večer.
Chtěl bych se vás zeptat na nevyřešitelný problém. Opravdu, pokud to někdo zvládne vyřešit, je to génius! Mám databázi, ve které mám tak zvláštně uložená data. Proč to tak je a proč to tak musí být neřešme. S databází se hýbat nemůže. Potřeboval bych SQL dotaz, na který ale nemůžu přijít. Jedná se o přihlašování. Tabulky mezi sebou nemají žádnou vazbu a potřebuji oboje data sloučit a pak: - pokud někdo zadá eko_login a odpovídající eko_heslo, může být přihlášen - pokud někdo zadá eko2_login a odpovídající eko2_heslo, může být přihlášen - pokud někdo zadá login a odpovídající heslo, může být přihlášen it.wz.cz/pomoc.png Problém je, že můžu mít jen jeden formulář pro všechny troje data (a ta musí být takto rozkouskována). Mám napsáno (propojeny jen 2 data): $data = mysqli_query($pripojeni,"SELECT ekonomove.eko_login as login, ekonomove.eko_heslo as heslo, spravci.login, spravci.heslo FROM spravci, ekonomove WHERE (ekonomove.eko_login = '{$_POST["login"]}' AND ekonomove.eko_heslo = '". md5($_POST['heslo']) ."') OR (spravci.login = '{$_POST["login"]}' AND spravci.heslo= '". md5($_POST['heslo']) ."') "); Moc děkuji. |
||
Lonanek Profil |
#2 · Zasláno: 16. 2. 2016, 20:10:09
Proč neřešitelné?
Proč "všechny troje data"? Stačí jeden formulář s loginem a heslem. Následně ve skriptu zpracovat... A dotaz? Pokud neexistuje shoda v jedné databázi, testovat shodu v druhé. Pokud není ani tam shoda, je to chyba.¨ |
||
Pavel015 Profil |
#3 · Zasláno: 16. 2. 2016, 20:25:14
Lonanek:
Prostě potřebuju všechny troje data dohromady. A jak zpracovat? Mě to opravdu nejde... Není to chyba, jen to jsou jiný data a mám je v jiných tabulkách. |
||
kokolino Profil |
#4 · Zasláno: 16. 2. 2016, 20:30:53
Pavel015:
|
||
RastyAmateur Profil |
Pavel015:
V první řadě bych doporučil si přečíst článek o mysql_*() Lonanek již odpověděl! Zkontroluj, jestli se nachází někdo v eko_login, následovně eko2_login a nakonec v login... V PHP zjisti, jestli byl někdo nalezen, a nadále zkoušej další! Příklad (spolu s mysqli, viz odkaz): $eco = $mysqli->query("SELECT * FROM ekonomove WHERE eko_login='".$mysqli->real_escape_string($_POST["login"])."' AND eko_password='".$mysqli->real_escape_string($_POST["password"])."' ")->fetch_assoc(); if(count($eco) === 0){ $eco2 = $mysqli->query("SELECT * FROM ekonomove WHERE eko2_login='".$mysqli->real_escape_string($_POST["login"])."' AND eko2_password='".$mysqli->real_escape_string($_POST["password"])."' ")->fetch_assoc(); if(count($eco2) === 0){ $login = $mysqli->query("SELECT * FROM spravci WHERE login='".$mysqli->real_escape_string($_POST["login"])."' AND password='".$mysqli->real_escape_string($_POST["password"])."' ")->fetch_assoc(); if(count($login) !== 0){ # přihlášeno pod login } else{ # Neexistuje účet } } else{ # Přihlášen pod eco2 } } else{ # přihlášen pod eco } |
||
Lonanek Profil |
#6 · Zasláno: 16. 2. 2016, 20:37:00
RastyAmateur:
První dva dotazy se dají spojit, za předpokladu, že je při vytváření loginu kontrolováno, zda neexistuje již jiný uživatel se stejným loginem. |
||
RastyAmateur Profil |
#7 · Zasláno: 16. 2. 2016, 20:44:45
Lonanek:
Uvědomuji si, jenže to my nevíme... Ale děkuji za upozornění, došlo mi to až po tom, co jsem to odeslal... |
||
Pavel015 Profil |
#8 · Zasláno: 16. 2. 2016, 21:03:03
RastyAmateur:
Neprogramuju web v OOP. Tak jsem si to předělal do klasického PHP, ale stejně to nejde. Ať se přihlásím jak chci, hodí mě to do poslední podmínky (eco). |
||
RastyAmateur Profil |
#9 · Zasláno: 16. 2. 2016, 21:05:25
Pavel015:
Ale zde nejde o to, v čem programovat, ale že od verze PHP 5 (tuším) to bude házet chyby a nebude to fungovat... To tu teď ale řešit nebudeme. Nevím, proč to nefunguje. Pravděpodobně je někde chyba - asi v těch dotazech. Pořádně je zkontroluj... |
||
Lonanek Profil |
#10 · Zasláno: 16. 2. 2016, 21:09:03
Pavel015:
Vložte sem ten kód "jak nefunguje". |
||
Pavel015 Profil |
#11 · Zasláno: 16. 2. 2016, 21:18:43
Lonanek:
if(isset($_POST["login"])){ $eco = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco_login={$_POST["login"]} AND eco_heslo='". md5($_POST['heslo']) ."'"); if(count($eco) === 0){ $eco2 = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco2_login={$_POST["login"]} AND eco2_heslo='". md5($_POST['heslo']) ."'"); if(count($eco2) === 0){ $login = mysqli_query($pripojeni, "SELECT * FROM spravci WHERE spravci.login={$_POST["login"]} AND spravci.heslo='". md5($_POST['heslo']) ."'"); if(count($login) !== 0){ # přihlášeno pod login echo "loginek"; } else{ # Neexistuje účet echo "ne!"; } } else{ # Přihlášen pod eco2 echo "ec2"; } } else{ # přihlášen pod eco echo "ec"; $zaznam = mysqli_fetch_array($eco); if($zaznam["heslo"]==md5($_POST["heslo"])){ $_SESSION["login"]=$zaznam["login"]; echo $zaznam["login"]; echo "ok, seš přihlášenej"; }else{ echo "<div class='chyba'>Špatné uživatelské jméno nebo heslo.</div>\n"; } } } |
||
RastyAmateur Profil |
#12 · Zasláno: 16. 2. 2016, 21:24:01
Najdi si ekvivalentní funkci k $mysqli->fetch_assoc() a následovně aplikuj.
|
||
Pavel015 Profil |
#13 · Zasláno: 16. 2. 2016, 21:26:21
RastyAmateur:
Když já vůbec nevím... Furt nad tím sedím. Nemohl byste mi prosím pomoct? |
||
Lonanek Profil |
#14 · Zasláno: 16. 2. 2016, 21:32:50
Klasická chyba v dotazu, prostě ten nesmysl -
eco_login={$_POST["login"]} musí zákonitě způsobit chybu
<?php # ... includovat soubor pro pripojeni k databazi ... if (isset($_POST["login"])) { $login = mysqli_real_escape_string(trim($_POST['login'])); $heslo = md5(mysqli_real_escape_string(trim($_POST['heslo']))); // mozno vynechat mysqli_real_escape_string, pokud bude chybovat $eco = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco_login='". $login ."' AND eco_heslo='". $heslo ."'"); if(count($eco) === 0) { $eco2 = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco2_login='". $login ."' AND eco2_heslo='". $heslo ."'"); if(count($eco2) === 0) { $login = mysqli_query($pripojeni, "SELECT * FROM spravci WHERE spravci.login='". $login ."' AND spravci.heslo='". $heslo ."'"); if(count($login) !== 0) { # přihlášeno pod login echo "loginek"; } else { # Neexistuje účet echo "ne!"; } } else { # Přihlášen pod eco2 echo "ec2"; } } else { # přihlášen pod eco echo "ec"; $zaznam = mysqli_fetch_array($eco); if ($zaznam["heslo"] == $heslo) { $_SESSION["login"] = $zaznam["login"]; echo $zaznam["login"]; echo "ok, seš přihlášenej"; } else { echo "<div class='chyba'>Špatné uživatelské jméno nebo heslo.</div>\n"; } } } |
||
RastyAmateur Profil |
Pavel015:
Z tabletu to jen tak nejde... $fetch_eco = mysql_fetch_assoc($eco); if(count($fetch_eco) === 0){ /* neexistuje, další */ } Lonanek: Ona ta funkce mysql_query() vrací pole? |
||
Pavel015 Profil |
#16 · Zasláno: 16. 2. 2016, 21:42:09
Lonanek:
Testoval jsem vaši verzi, ale přihlásí mi to pouze ekonomy s loginem eco_login. Ostatní ne. |
||
Lonanek Profil |
Nekontroloval jsem do důsledku uvedený kód. Jen jsem opravil zjevně viditelné chyby. Podívám se...
Vyskytují se dva uživatelé se stejným loginem v eco a eco2??? |
||
Pavel015 Profil |
Lonanek:
Zatím mám jen zkušební data a mám některé uživatele nepojmenované (NULL), tím to ale asi nebude. Kód nyní vypadá takto: include 'connect.php'; if(isset($_POST["login"])){ $login = (trim($_POST['login'])); $heslo = md5((trim($_POST['heslo']))); // vynechano, protoze to jinak hazi warningy // $login = mysqli_real_escape_string(trim($_POST['login'])); // $heslo = md5(mysqli_real_escape_string(trim($_POST['heslo']))); // mozno vynechat mysqli_real_escape_string, pokud bude chybovat $eco = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco_login='". $login ."' AND eco_heslo='". $heslo ."'"); if(count($eco) === 0){ $eco2 = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco2_login='". $login ."' AND eco2_heslo='". $heslo ."'"); if(count($eco2) === 0){ $login = mysqli_query($pripojeni, "SELECT * FROM spravci WHERE login='". $login ."' AND heslo='". $heslo ."'"); if(count($login) !== 0){ # přihlášeno pod login echo "loginek"; $zaznam = mysqli_fetch_array($eco); if ($zaznam["heslo"] == $heslo) { $_SESSION["login"] = $zaznam["login"]; echo $zaznam["login"]; echo "ok, seš přihlášenej"; } else { echo "<div class='chyba'>Špatné uživatelské jméno nebo heslo.</div>\n"; } } else{ # Neexistuje účet echo "ne!"; } } else{ # Přihlášen pod eco2 echo "ec2"; $zaznam = mysqli_fetch_array($eco); if ($zaznam["heslo"] == $heslo) { $_SESSION["login"] = $zaznam["login"]; echo $zaznam["login"]; echo "ok, seš přihlášenej"; } else { echo "<div class='chyba'>Špatné uživatelské jméno nebo heslo.</div>\n"; } } } else{ # přihlášen pod eco echo "ec"; $zaznam = mysqli_fetch_array($eco); if ($zaznam["heslo"] == $heslo) { $_SESSION["login"] = $zaznam["login"]; echo $zaznam["login"]; echo "ok, seš přihlášenej"; } else { echo "<div class='chyba'>Špatné uživatelské jméno nebo heslo.</div>\n"; } } } |
||
Lonanek Profil |
No ptal jsem se proto, že lze spojit dva dotazy do jednoho a testovat zda existuje eco_login && eco_heslo nebo eco2_login && eco2_heslo. Pokud není potřeba rozlišovat ECO a ECO2 uživatele.
Zkuste tento kód: <?php include ('connect.php'); if (isset($_POST["login"])) { $login = mysqli_real_escape_string(trim($_POST['login'])); $heslo = md5(trim($_POST['heslo'])); $eco = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco_login='". $login ."' AND eco_heslo='". $heslo ."'"); if (mysqli_fetch_row($eco) == 0) { // eco_login neexistuje $eco2 = mysqli_query($pripojeni, "SELECT * FROM ekonomove WHERE eco2_login='". $login ."' AND eco2_heslo='". $heslo ."'"); if (mysqli_fetch_row($eco2) == 0) { $spravci = mysqli_query($pripojeni, "SELECT * FROM spravci WHERE spravci.login='". $login ."' AND spravci.heslo='". $heslo ."'"); if(mysqli_fetch_row($spravci) == 1) // musi existovat pouze jeden uzivatel { # přihlášeno pod login echo "login správce nalezen"; } else { # Neexistuje účet echo "ne!"; } } else { # Přihlášen pod eco2 echo "ec2"; } } else { # přihlášen pod eco echo "ec"; $zaznam = mysqli_fetch_array($eco); if ($zaznam["heslo"] == $heslo) { $_SESSION["login"] = $zaznam["login"]; echo $zaznam["login"]; echo "ok, seš přihlášenej"; } else { echo "<div class='chyba'>Špatné uživatelské jméno nebo heslo.</div>\n"; } } } |
||
juriad Profil |
Pánové, vy jste tedy umělci, zkuste trochu víc přemýšlet než něco napíšete.
$login = mysqli_real_escape_string($spojeni, trim($_POST['login'])); # md5 fakt nepoužívej, není a nikdy nebylo určené na hashování hesel # použij password_verify (a password_hash při registraci) $heslo = mysqli_real_escape_string($spojeni, md5(trim($_POST['heslo']))); # stačí jeden jediný dotaz, který zjistí všechny informace $query = mysqli_query($spojeni, "SELECT login, zdroj FROM ( SELECT eco_login AS login, eco_heslo AS heslo, 'eco' AS zdroj FROM ekonomove UNION SELECT eco2_login AS login, eco2_heslo AS heslo, 'eco2' AS zdroj FROM ekonomove UNION SELECT login, heslo, 'spravci' AS zdroj FROM spravci ) x WHERE x.login = '" . $login . "' AND x.heslo = '" . $heslo . "'"); if (mysqli_num_rows($query) > 0) { # je přihlášen podle alespoň jednoho zdroje # teoreticky může dotaz vrátit víc řádků, ale prozatím nám stačí jeden $row = mysqli_fetch_assoc($query); echo 'Přihlášen jako ' . $row['login'] . ' podle ' . $row['zdroj']; } else { echo "Nepřihlášen"; } |
||
Lonanek Profil |
#21 · Zasláno: 16. 2. 2016, 22:01:57
juriad:
Já jsem pochopil, že potřebuje mít odlišené kdo se logoval... Proto ty zvrhlosti |
||
Pavel015 Profil |
#22 · Zasláno: 16. 2. 2016, 22:11:56
juriad, Lonanek:
Nesmírně Vám DĚKUJI! Funguje to! Hrozně děkuji!!!!!!!!!!!!!!!! Krásný večer a hrozně děkuji za váš čas. |
||
Časová prodleva: 9 let
|
0