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é";
}
}
Jinak předem děkuji všem za pomoc. PS: vím že je dost návodů, pročítal jsem a zkoušel si implatovat asi 3....neúspěšně....(dopadlo to ještě hůře než když jsem to zkoušel sám :D )
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
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
Kód:
<?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  }
?>
Co mám přesně špatně (vím že je to problém s tím session). Předem děkuji za odpověď
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
Again:
Co je jednoduší? (popřipadě jestli by jste mi to do kódu doplnili..)
Díky
noris
Profil
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
Jak pak kontroluješ na dalších stránkách jestli je uživatel přihlášen?
noris
Profil
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
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
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
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
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>
menuadministrace.php :
<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>
V divu aobsah se nic nezobrazí.
Dědek
Profil
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
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
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
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";
}?>
Session mám zaplé v souboru, do kterého vkládám. Ale i přes tento zápis mě to pustí i když session není nastavená..
TomasJ
Profil
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
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
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";
}?>
menuadministrace.php
<?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>
administrace.php
<?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
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
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
Ano, die() je řešení.
noris
Profil
Dědek:
Děkuji vše již funguje jak má.

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:

0