Autor Zpráva
vomackav
Profil *
Ahoj, potřeboval bych poradit s mysql a přihlášením podle údajů v databázi. Registrace mi funguje bez problému - uloží se mi heslo a email, zda je registrace dokončena či nikoliv a přiřadí k tomuto řádku id.

V index.php mám:

<?php
  session_start();

if ($_GET["stranka"]=="prihlaseni")
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařilo se otevřít databázi.');
  mysql_query("SET NAMES 'utf8'");
  $id = iduzivatele($_POST["email"], $_POST["heslo"]);
  if (($_GET["id"]<>0)
  { $_SESSION["id"]=$id; }
}
elseif ($_GET["stranka"]=="odhlaseni")
{
  unset($_SESSION["id"]);
}

if ($_SESSION["id"]<>0)
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařila se otevřít databáze.');
  mysql_query("SET NAMES 'utf8'");
}


function iduzivatele ($email, $heslo)
{
  $vysledek=mysql_query("select id from uzivatel where registracedokoncena=1 and email='".$email."' and heslo='".$heslo."'");
  if (mysql_num_rows($vysledek)==0) 
    return false; 
  else {
    $radek = mysql_fetch_array($vysledek);
    return $radek["id"];
  }
}

?>

a v prihlaseni.php mám:

<span class="pismo_1" style="position:absolute; left:25px; top:13px;">Přihlášení</span>
<img  style="position:absolute; left:15px; top:43px;" src="/images/oddel.png">
<div style="position:absolute; top:54px; left:25px;">

<?php 

$BudemeZobrazovat=true;
if (!empty($_POST)):
  if (!isset($_SESSION["id"])) 
  { echo "<span class='pismo_2'>&nbsp;Email nebo heslo nesouhlasí<br><br></span>";
//    echo "(<a href=\"index.php?clanek=zapomenuteheslo\">připomenout heslo</a>)";
  }
  else 
  { $BudemeZobrazovat=false;
    echo "Přihlášen ".$_POST["email"];
    echo ", Id: ".$_SESSION["id"];
  }   
endif;

if ($BudemeZobrazovat):?>
  <form method="post" action="index.php?stranka=prihlaseni">
  <table border="0">
    <tr>
      <td><span class="pismo_3">Email:</span></td>
      <td><input name="email" size="19" value="<?php echo $_POST["email"]?>"></td>
    </tr>
      <td><span class="pismo_3">Heslo:</span></td>
      <td><input name="heslo" size="19" type = "password" value="<?echo $_POST["heslo"]?>"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="Submit" name="odesli" value="Přihlásit"></td>
    </tr>
  </table>
  </form>
<?php endif;?>
<br><br>
<a href="index.php?stranka=registrace">Registrace</a>
</div>

Po zobrazení index.php mi nenaběhne ani stránka, kde může být problém, předpokládám že někde v této části kodu:

if ($_GET["stranka"]=="prihlaseni")
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařilo se otevřít databázi.');
  mysql_query("SET NAMES 'utf8'");
  $id = iduzivatele($_POST["email"], $_POST["heslo"]);
  if (($_GET["id"]<>0)
  { $_SESSION["id"]=$id; }
}
elseif ($_GET["stranka"]=="odhlaseni")
{
  unset($_SESSION["id"]);
}

Netuším však v čem, jelikož k databázi nrmálně připojený jsem a data z ní číst a vypisovat můžu.
Děkuji za rady, V.
Davex
Profil
vomackav:
Po zobrazení index.php mi nenaběhne ani stránka
Co to znamená, že nenaběhne? Zobrazí se nějaká chyba nebo prázdná stránka bez chyby? Pokud to druhé, tak by to mohlo být tím, že se ve skriptu index.php ve větvi pro přihlášené uživatele nic nevypisuje.
vomackav
Profil *
Zobrazí se prázdná stránka. Pod tímto scriptem je samozřejmně komplet celé tělo s obsahem, který se zobrazuje, když odstraním právě ten php script. Konkrétně když odstraním tuto část kódu:

if ($_GET["stranka"]=="prihlaseni")
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařilo se otevřít databázi.');
  mysql_query("SET NAMES 'utf8'");
  $id = iduzivatele($_POST["email"], $_POST["heslo"]);
  if (($_GET["id"]<>0)
  { $_SESSION["id"]=$id; }
}
elseif ($_GET["stranka"]=="odhlaseni")
{
  unset($_SESSION["id"]);
}
Kajman
Profil
vomackav:

A není např. v errorlogu zmínka o tom, že za if (8. řádek) je více otevíracích závorek než zavíracích?
vomackav
Profil *
Závorky jsem si nevšiml, po odstranění se index.php zobrazuje v pořádku, ale po zadání mailu a hesla shodného s DB se mi na obrazovce stejně vypíše že Email nebo heslo nesouhlasí a netuším proč, kde je chyba.

Díky V.
Kajman
Profil
Pečlivě si zkontrolujte hodnoty v databázi, zda tam není např. mezera navíc. Vypište si výsledný kontrolní sql dotaz a zkontrolujte ho. Navíc se hesla většinou ukládají až prohnaná hashovací funckí s řádným osolením.
vomackav
Profil *
Hodnoty z databáze zkontrolovány, vše sedí jak má. Při přihlašování se mi stále zobrazuje: "Email nebo heslo nesouhlasí" Výsledný kontrolní sql dotaz si vypíšu jak?
Jinak hashovaci funkci budu řešit až po zprovoznění této části.
Děkuji za rady.
Kajman
Profil
Id uživatele si na řádku 7 uložíte do proměnné $id. Na následujícím řádku z neznámého důvodu testujete proměnnou předanou jako parametru v url - $_GET["id"] - místo zjištěného id z databáze.

A dejte si pozor na sql injection, máte lehce zranitelný kód.
vomackav
Profil *
Samozřejmně, má to být takto:

if ($_GET["stranka"]=="prihlaseni")
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařilo se otevřít databázi.');
  mysql_query("SET NAMES 'utf8'");
  $id = iduzivatele($_POST["email"], $_POST["heslo"]);
  if ($id<>0)
  { $_SESSION["id"]=$id; }
}
elseif ($_GET["stranka"]=="odhlaseni")
{
  unset($_SESSION["id"]);
}

A už to běží, díky!


Jen mám nyní problém, že jakmile do přihlašovacího formuláře napíšu cokoliv a jakékoliv heslo, ten uživatel se přihlásí. Ale to už snad pořešim.
vomackav
Profil *
Zdravím, mám zde kousek kódu, ve kterém předpokládám že mám něco špatně. Jde o to, že po prvním přihlášení se mi neustále zobrazuje přihlašovací formulář i když by podle následujícího kódu podle mě neměl.

$BudemeZobrazovat=true;
if (!empty($_POST)):
  if (!isset($_SESSION["id"])) 
  { echo "<span class='pismo_2'>&nbsp;Email nebo heslo nesouhlasí<br><br></span>";
//    echo "(<a href=\"index.php?clanek=zapomenuteheslo\">připomenout heslo</a>)";
  }
  else 
  { $BudemeZobrazovat=false;
    echo "Přihlášen ".$_POST["email"];
    echo ", Id: ".$_SESSION["id"];
  }   
endif;
 
if ($BudemeZobrazovat):?> Zde je přihlašovací formulář 

Poradí někdo co jsem přehlédl?
Děkuji V.
vomackav
Profil *
Vyřešeno.
juriad
Profil
vomackav:
A nechceš se pochlubit jak?

$_POST bude empty při každém kliknutí na odkaz bez ohledu na tom, jestli je uživatel přihlášený nebo ne. Smysl té podmínky nechápu.
Inspiruj se registrací/přihlašováním ve FAQ
vomackav
Profil *
$_POST se plní v přihlašovacím formuláři. Vše funguje jak má, měl jsem jen špatnou adresu odkazu v jedné části kódu, proto nebylo funkční ani toto.
vomackav
Profil *
Tak přihlašování stále zlobí. Problém je ten, že mám v databázi dva řádky (dva uživatele). Když chci přihlásit druhého, s mailem 2@neco.cz, tak se mi přihlásí 1@neco.cz:

Toto mi zajistí vytáhnutí ID a EMAILu z databáze a uložení do proměnné (umístěno v index.php)
if ($_GET["stranka"]=="prihlaseni")
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařilo se otevřít databázi.');
  mysql_query("SET NAMES 'utf8'");
  $id = iduzivatele($_POST["email"], $_POST["heslo"]);
  if ($id<>0)
  { $_SESSION["id"]=$id;
    $_SESSION["email"]=$email; }
}
elseif ($_GET["stranka"]=="odhlaseni")
{
  unset($_SESSION["id"]);
}

function iduzivatele ($email, $heslo)
{
  $vysledek=mysql_query("select id from uzivatel where registracedokoncena=1 and email='".$email."' and heslo='".$heslo."'");
  if (mysql_num_rows($vysledek)==0) 
    return false; 
  else {
    $radek = mysql_fetch_array($vysledek);
    return $radek["id"];
  }
}

Toto mi ihned po přihlášení vypíše kdo byl přihlášen - správně ID=2, email=2@neco.cz! (v prihlaseni.php)
$BudemeZobrazovat=true;
if (!empty($_POST)):
  if (!isset($_SESSION['id'])) 
  { echo "Email nebo heslo nesouhlasí!"; }
  else 
  { $BudemeZobrazovat=false;
    echo "Přihlášen {$_POST['email']}<br>";
    echo "Id: {$_SESSION['id']}";
  }   
endif;

Ale když chci na další stránce vypsat kdo je přihlášen, tak mi to vyhodí 1@neco.cz:
if (isset($_SESSION['id'])) { echo "echo mysql_result(mysql_query("SELECT email FROM uzivatel"), 0, "email"); } ?>

Nevěděl by si někdo rady co s tim?
Díky V.
Kajman
Profil
vomackav:
Nevěděl by si někdo rady co s tim?

Při načítání emailu dejte databázi vědět id uživatele, ke kterému email chcete.

A ještě jednou varuji, že máte kód zranitelný sql injection. Escapujte!
vomackav
Profil *
S databází mám stále problém:
V index.php mám scripty:

<?php
  session_start();

if ($_GET["stranka"]=="prihlaseni")
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařilo se otevřít databázi.');
  mysql_query("SET NAMES 'utf8'");
  $id = iduzivatele($_POST["email"], $_POST["heslo"]);
  if ($id<>0)
  { $_SESSION["id"]=$id; }
}
elseif ($_GET["stranka"]=="odhlaseni")
{
  unset($_SESSION["id"]);
}


if ($_SESSION["id"]<>0)
{
  include ("config.php");
  mysql_connect($server, $login, $heslo) or die('Nepodařilo se připojit k MySQL databázi');
  mysql_select_db($databaze) or die('Nepodařila se otevřít databáze.');
  mysql_query("SET NAMES 'utf8'");
}


function iduzivatele ($email, $heslo)
{
  $vysledek=mysql_query("select id from uzivatel where registracedokoncena=1 and email='".$email."' and heslo='".$heslo."'");
  if (mysql_num_rows($vysledek)==0) 
    return false; 
  else {
    $radek = mysql_fetch_array($vysledek);
    return $radek["id"];
  }
}
?>


Poté na jiné stránce zobrazuji:

if (isset($_SESSION['id'])) 
  { echo "<a class='odhlaseni' href='index.php?stranka=odhlaseni'>";
$vysledek=mysql_query("select email from uzivatel where id=".$_SESSION["id"]);
$radku=mysql_num_rows($vysledek);
if (!$radku==0)
 {
  while ($zaznam=MySQL_Fetch_Array($vysledek)):
   echo $zaznam["email"]."";
  endwhile;
 };} ?> | Odhlásit</a>

Vše se zobrazí jak má (email), ale jakmile chci načíst data z druhé databázové tabulky, tak se mi nezobrazí nic (proměnné a název tabulky jsou zkontrolované několikrát):

$vysledek_karlova=mysql_query("select rezervace from parkoviste_karlova where id_karlova=1");
$radku_karlova=mysql_num_rows($vysledek_karlova);
if ($radku_karlova!=0)
 {
 while ($zaznam_karlova=MySQL_Fetch_Array($vysledek_karlova)):
 echo $zaznam_karlova["rezervace"]."";
 endwhile;
 };

Kde by mohla být chyba? Tímto už snad uzanřu mé dotazy ohledně přihlašování. SQL injecton mám další v pořadí co budu řešit, nezapomněl jsem na to.
Děkuji s pozdravem, Vašek
vomackav
Profil *
Tak (snad) všechny problémy vyřešeny DiBi knihovnou.

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: