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
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
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
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
  }
Jinak pokud to potřebuješ právě v jednom SQL dotazu, tak ti neporadím :( Ani s tímto PHP scriptem si nejsem plně jist!
Lonanek
Profil
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
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
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
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
Pavel015:
Vložte sem ten kód "jak nefunguje".
Pavel015
Profil
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
Najdi si ekvivalentní funkci k $mysqli->fetch_assoc() a následovně aplikuj.
Pavel015
Profil
RastyAmateur:
Když já vůbec nevím... Furt nad tím sedím.
Nemohl byste mi prosím pomoct?
Lonanek
Profil
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ší */ }
A tímto způsobem oprav i zbytek.


Lonanek:
Ona ta funkce mysql_query() vrací pole?
Pavel015
Profil
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
juriad:
Já jsem pochopil, že potřebuje mít odlišené kdo se logoval... Proto ty zvrhlosti
Pavel015
Profil
juriad, Lonanek:
Nesmírně Vám DĚKUJI! Funguje to! Hrozně děkuji!!!!!!!!!!!!!!!!

Krásný večer a hrozně děkuji za váš čas.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: