Přihlášení registrovaného uživatele v PHP

3. září 2002

Navážeme na článek „Registrace uživatelů“ a využijeme stejnou tabulku databáze. Ukážeme si, jak ověřit heslo uživatele v databázi a umožnit mu upravit si údaje v nastavení přesměrovací služby, kterou si sám aktivoval.

Než budete číst dále, doporučuji vám oživit si předchozí článek. Pak si prohlédněte ukázku, možná se budete muset nejprve zaregistrovat.

K přihlašování využijeme jednoduchou metodu HTTP autentizace, možné je ale využít i session (ukážeme si dále).

Aplikace je oddělená od části registrace, buď ji vytvoříme ve zvláštní složce, nebo použijeme jiný název skriptu, který aplikaci obsluhuje. Bylo by možné naprogramovat skripty i tak, aby celou aplikaci obsluhoval jediný index.php, ale pro náš příklad by byla zbytečná komplikace rozlišovat, do které části je přístup všem, a do které se musí uživatel autentizovat. Nejprve si tedy ukážeme skript login.php, který ověří oprávněnost uživatele v databázi a přidělí identifikátor uživatele v proměnné $uid. Pro připojení k databázi se používá soubor opendb.php, který je totožný se souborem opendb.php z předchozího článku.

login.php:

<?php
unset($uid); // zlikvidovat user id
if ($_COOKIE[‚loggedout‘]==1) // test odhlašovací cookie
{
  echo ‚Z aplikace jste se už odhlásili. Chcete-li se znovu přihlásit, <a href="javascript: self.close()">zavřete toto okno</a> a otevřete aplikaci v novém okně prohlížeče.‘;
  exit;
}
else
{
  $path=SubStr($_SERVER[‚SCRIPT_NAME‘], 0, StrRPos($_SERVER[‚SCRIPT_NAME‘],’/‘));
  $path.="/regedit.php";
  If (!IsSet($_SERVER[‚PHP_AUTH_USER‘])) // pokud uživatel právě přišel, zobrazíme formulář
  {
    Header($_SERVER[‚SERVER_PROTOCOL‘].‘ 401 Unauthorized‘);
    Header(‚WWW-Authenticate: Basic realm="Test odhlašování"‘);
    echo ‚Bez hesla to nepůjde…<br />‘; // když nic nevyplní, vypíšeme chybové hlášení
    echo ‚<a href="http://‘.$_SERVER[‚HTTP_HOST‘].$path.’">Přihlásit</a>‘;
    Exit;
  }
  else
  { // pokud uživatel vyplnil formulář, ověříme data v databázi
    include("handle/opendb.php"); // připojit k databázi
    $MSQ = @MySQL_Query("SELECT id FROM ".$dbappname."redirect WHERE user LIKE ‚".Addslashes(StrToLower($_SERVER[‚PHP_AUTH_USER‘]))."‘ AND password LIKE ‚".Addslashes(MD5($_SERVER[‚PHP_AUTH_PW‘]))."‘ LIMIT 1");
    If (@MySQL_Num_Rows($MSQ)==0)
    {
      Header($_SERVER[‚SERVER_PROTOCOL‘].‘ 401 Unauthorized‘);
      Header(‚WWW-Authenticate: Basic realm="Test odhlašování"‘);
      echo ‚Neautorizovaný přístup<br />‘;
      echo ‚<a href="http://‘.$_SERVER[‚HTTP_HOST‘].$path.’">Přihlásit</a>‘;
      Exit;
    }
    else
    {
      $getuid = @MySQL_Fetch_Row($MSQ); // přihlášení se zdařilo, nastavíme identifikátor uživatele do $uid
      $uid = $getuid[0];
    }
  }
  if ($_GET[‚logout‘]==1)
  { // podpora přihlášení jiného uživatele v IE
    Header(‚Location: <a href=“http://‘.$_SERVER[‚HTTP_HOST‘].$_SERVER[‚SCRIPT_NAME“> http://‘.$_SERVER[‚HTTP_HOST‘].$_SERVER[‚SCRIPT_NAME</a>‘]);
    Exit;
  }
}
?>

Pro detailní pochopení odkazuji na článek Odhlášení z HTTP autentizace. Hlavní částí aplikace je následující skript regedit.php. Pro složitejší aplikaci by bylo vhodné jej rozdělit na části, které se budou dle potřeby vkládat. Naše aplikace je však jednoduchá, umožnuje změnit několik údajů v jednom formuláři a uložit tyto do databáze a je tak pro názornost v  jednom souboru přehlednější. Aplikace využívá soubor config.php, který je totožný se souborem config.php z předchozího článku.

regedit.php:

<?php
require ("handle/config.php"); // zavést nastavení
require ("handle/login.php"); // ověřit přístup uživatele
?>
<html>
<head>
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<title>Upravit registraci</title>
</head>
<body bgcolor="tomato">
<script language="JavaScript" type="text/javascript" src="handle/cookies.js"></script>
<script language="JavaScript" type="text/javascript">
<!–
function logout()
{
  if (navigator.appName==’Microsoft Internet Explorer‘)
    document.body.style.filter=’gray(enabled=1)‘;
  logoutyes=confirm(‚Chcete se odhlásit?‘)
  if (logoutyes)
  {
    MyCookie.Write(‚loggedout‘,1);
    if (navigator.appName==’Microsoft Internet Explorer‘)
      top.opener="interval";
    top.window.close();
  }
  else
    if (navigator.appName==’Microsoft Internet Explorer‘)
      document.body.style.filter=’gray(enabled=0)‘;
}
// –>
</script>
<?php
if ($_POST[‚update‘]==1) // byl odeslán formulář
{
  $_POST[‚email‘] = htmlspecialchars(StrToLower($_POST[‚email‘])); // vyčistit předané údaje
  $_POST[‚url‘] = htmlspecialchars(StrToLower($_POST[‚url‘]));
  $_POST[‚title‘] = htmlspecialchars(StrToLower($_POST[‚title‘]));
  if (!empty($_POST[‚email‘]) && !empty($_POST[‚url‘]) && !empty($_POST[‚title‘])) // ověřit, zda byly zadány povinné údaje
  {
    if (!empty($_POST[‚passw1‘]) || !empty($_POST[‚passw2‘])) // pokud bylo zadáno alespoň jedno z hesel, ověřit, zda se shodují a přípFadně je očistit pro uložení
    {
      $_POST[‚passw1‘]=htmlspecialchars($_POST[‚passw1‘]);
      $_POST[‚passw2‘]=htmlspecialchars($_POST[‚passw2‘]);
      unset($passwupdate); // zničit SQL dotaz na změnu hesla
      if ($_POST[‚passw1‘]!=$_POST[‚passw2‘])
        echo "<b>Zadaná hesla si neodpovídají, heslo nebude změněno!</b><br />";
      else
        $passwupdate=", password = ‚".md5($_POST[‚passw1‘])."’"; // připravit část SQL dotazu pro změnu hesla
    }
    if (StrToUpper($_POST[‚cloak‘]) == ‚N‘)
      $cloak_stat= ‚N‘;
    else
      $cloak_stat= ‚Y‘;
    if (@mysql_query("UPDATE redirect SET email = ‚".$_POST[‚email‘]."‘, url = ‚".$_POST[‚url‘]."‘, title = ‚".$_POST[‚title‘]."‘, cloak = ‚$cloak_stat’$passwupdate WHERE id = ‚$uid‘ LIMIT 1")) // aktualizovat údaje v databázi
    {
      echo ‚<b>Údaje byly uloženy.<b><br />‘;
      if (!empty($passwupdate))
        echo ‚<b>Heslo bylo změněno.<b><br />‘; // pokud bylo měněno i heslo, vypsat hlášení
    }
    else
      echo ‚<b>Chyba při ukládání údajů!</b><br />‘;
  }
  else
    echo ‚<b>Nebyly zadány potřebné údaje!</b><br />‘;
?>
<form>
<input type="button" class="tlac" value="opravit údaje" onclick="window.location=’regedit.php’" /> // tlačítko pro vstup do formuláře po uložení údajů
</form>
<?php
}
else
{ // formulář nebyl odeslán, vyzvednout údaje z databáze a připravit do formuláře k editaci
$data = @mysql_fetch_row(@mysql_query("SELECT user, email, url, title, cloak FROM redirect WHERE id = ‚$uid‘ LIMIT 1"));
?>
<script language="JavaScript" type="text/javascript" src="handle/formcheck.js"></script>
<fieldset>
<legend> registrovat vlastní doménu <br /></legend>
<form name="regform" action="regedit.php" method="POST" onSubmit="return zkontroluj_formular(this);">
<table border="0" cellspacing="5" cellpadding="0">
<tr>
<td align="right"><input type="hidden" name="update" value="1" />titulek stránek:</td>
<td><input type="text" class="sform" name="title" value="<?PHP echo StripSlashes($data[3]) ?>" size="30" autocomplete="off" /></td>
</tr>
<tr>
<td align="right">URL:</td>
<td><input type="text" class="sform" name="url" value="<?PHP echo StripSlashes($data[2]) ?>" size="30" autocomplete="off" /></td>
</tr>
<tr>
<td align="right">e-mail:</td>
<td><input type="text" class="sform" value="<?PHP echo StripSlashes($data[1]) ?>" name="email" size="30" /></td>
</tr>
<tr>
<td align="right">&nbsp;</td>
<td><input type="checkbox" class="sform" value="N" name="cloak" <?PHP echo ($data[4] == "N") ? "checked" : "" ?> />neskrývat skutečnou adresu</td>
</tr>
</table>
<br />
<table border="0" cellspacing="5" cellpadding="0">
<tr>
<td align="right">uživatelské jméno (doména)*:</td>
<td><?PHP echo StripSlashes($data[0]) ?></td>
</tr>
<tr>
<td align="right">heslo:</td>
<td><input type="password" class="sform" name="passw1" size="20" autocomplete="off" /></td>
</tr>
<tr>
<td align="right">ověření hesla:</td>
<td><input type="password" class="sform" name="passw2" size="20" autocomplete="off" /></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="submit" class="tlac" value="uložit nastavení" />
</td>
</tr>
</table>
</form>
&nbsp;* pouze alfanumerické znaky bez diakritiky, bez mezer, podržítek a speciálních znaků
</fieldset>
<?php
}
?>
<form>
<input type="button" class="tlac" value="odhlásit se" onclick="logout()" />
<!–[if IE]>
<input type="button" class="tlac" value="jiný uživatel" onclick="document.body.style.filter=’gray(enabled=1)‘; window.location=’http://nov%FD%20u%9Eivatel:XXX@<?php echo $_SERVER[‚HTTP_HOST‘].$_SERVER[‚SCRIPT_NAME‘] ?>?logout=1’" />
<![endif]–>
</form>
</body>
</html>

Pokud proběhne autorizace úspěšně, zobrazí se formulář, do kterého se vyzvednou z databáze údaje pro editaci. Před jejich vypsáním jsou zbaveny zpětných lomítek pomocí Stripslashes. Pokud je formulář odeslán, přenese se také hodnota ze skrytého pole formuláře, čímž se již formulář nezobrazuje, ale zkontroluje se, zda byly zadány všechny údaje. Pokud bylo do některého z  polí hesla něco zadáno, ověří se, zda se shodují obě pole hesla. Pokud se pole neshodují nebo nebylo žádné heslo zadáno, heslo se nebude ukládat. Jsou-li zadány potřebné údaje, předají se do SQL dotazu pro aktualizaci údajů. Nakonec se vypíše hlášení o stavu proběhlé operace a tlačítko pro případné další opravy. Na konci stránky je vždy tlačítko pro odhlášení se z aplikace a v IE i tlačítko pro přihlášení jiného uživatele.

Pro detailní pochopení dalších nepopisovaných částí odkazuji na články odkazované v úvodu článku, protože tato aplikace z nich vychází a popis těchto funkcí by jen zbytečně "zahustil" komentář skriptu.

Celou aplikaci včetně části pro registraci uživatelů si můžete stáhnout.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

2 komentářů

  1. Patrik Moskal

    Led 31, 2010 v 9:56

    Dobrý den, když chci zadat údaje do databáze pro vytvoření tabulky, tak to napíše chybu #1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚)‘ at line 12 prosím o pomoc, děkuji

    Odpovědět
  2. Anonym

    Dub 18, 2010 v 8:38

    posun ) o ridok vyssie ..

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *