Interní vzkazy - I - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Interní vzkazy - I

redakcni system

30. srpna 2002, 00.00 | Náš redakční systém doplníme o možnost posíláni vzkazů mezi autory, čím výrazně zlepšíme možnost komunikace mezi autory a korektory.

  Nedávno jsem dostal e-mail, ve kterém byl docela dobrý nápad na rozšíření našeho RS. Jedná se o zprávy mezi autory na serveru. Posílat zprávy mohl pouze administrátor, protože on jediný znal e-maily (tento systém je používá pouze jako volitelný doplněk). Pokud chtěl korektor něco vzkázat pisateli, tak mohl použít poznámku ke článku. Autoři ale žádnou možnost komunikace - jak mezi sebou, tak s korektorem (mimo článku) - neměli.

Z toho důvodu je tu možnost psát vzkazy. Chtěl bych upozornit, že se jedná o interní vzkazy! Vzkazy od čtenářů si můžeme udělat někdy příště. Přejděme ale rovnou k samotnému vytvoření této služby v admincentru.

První krok je založení nové tabulky. Ta má následující strukturu.

CREATE TABLE vzkazy (
	id INT UNSIGNED not null AUTO_INCREMENT, 
	od_id int not null , 
	pro_id int not null , 
	predmet VARCHAR (255) not null , 
	stav CHAR (1) DEFAULT 'n' not null , 
	zprava TEXT not null , 
	odpoved_id int DEFAULT '0' not null , 
	smazat int DEFAULT '0' ,
	PRIMARY KEY (id))

Popišme si nyní co všechno budeme do tabulky ukládat.

  • id - jedinečný identifikátor, na jehož základě budeme se vzkazem pracovat.
  • od_id - položka, kam se bude ukládat číslo autora vzkazu. Číslo bude shodné s autorovým id v tabulce "autori"
  • pro_id - to samé jako předchozí, jen s tím rozdílem, že zde bude příjemce zprávy
  • predmet - obsahuje předmět zprávy
  • stav - bude nám říkat, zda byl vzkaz přečten ('a'), bylo na něj odpovídáno ('r'), či jej zatím příjemce neviděl ('n')
  • zprava - obsahuje samotný vzkaz
  • odpoved_id - pokud je vzkaz odpověď na nějaký jiný vzkaz, bude zde id zprávy, na kterou je to odpověď
  • smazat - tato položka je zde kvůli tomu, že pokud by např. příjemce chtěl smazat zprávu, tak by ji smazal i pro odesílatele. Ten ji ale třeba smazat nechce. Více si o ní povíme později.
Přejděme k samotným scriptům. První, který musíme změnit, je script menu.php v adresáři admin. Část pro všechny tak bude vypadat následovně (přidaná část je označena zeleně).
// volby pro všechny
if ($INFO[6] >= 1)
{ 
$a=mysql_query("SELECT count(id) FROM vzkazy WHERE pro_id='$INFO[0]' 
			AND stav='n'");
$b=mysql_fetch_row($a);
if($b[0]==1)
$zprava="(1 nový)";
elseif($b[0]>=2 and $b[0]<=4)
$zprava="(".$b[0]." nové)";
elseif($b[0]>5)
$zprava="(".$b[0]." nových)";
else
$zprava="";
if($INFO[6]==1)echo "<A HREF=uprav.php TARGET=main>Upravit článek</A><BR>\n";
echo "<A HREF=addclanek.php target=main>Přidat článek</A><BR>\n";
echo "<A HREF=addnovinka.php target=main>Přidat novinku</A><BR>\n";
echo "<A HREF=userstats.php target=main>Moje statistiky</A><BR>\n";
echo "<A HREF=prid.php TARGET=main>Obrázek ke článku</A><BR>\n";
echo "<A HREF=vzkazy_cist.php target=main>Vzkazy</A> 
		<FONT COLOR=\"#FF0000\">$zprava</FONT><BR>\n";
echo "<A HREF=logout.php target=_blank ONCLICK=\"alert('V rámci Vaší 
      bezpečnosti doporučujeme uzavřít toto okno.')\">Logout</A><BR>\n";
}

Z tabulky vzkazy zjistíme počet nových zpráv, načteme výsledek a podle počtu zpráv upravíme hlášení tak, aby vyhovovala českému jazyku. Hlášení je uloženo v proměnné $zprava. Pak již jen přidáme odkaz na vzkazy.

Nyní vám ukáži script vzkazy_cist.php, který si následovně popíšeme.

<?
Header("Pragma: No-cache");
Header("Cache-Control: no-cache");
Header("Expires: ".GMDate("D, d M Y H:i:s")."GMT");

// pokud neproběhla autorizace, ukončíme skript
if (!isset($PHP_AUTH_USER))
{
     echo "Neautorizovaný přístup";
     exit;
}

// vložíme soubory
@include "../conn.php";
@include "../function.php";

// autorizace
auth();
if(isset($did))
{
$u=mysql_query("SELECT smazat FROM vzkazy WHERE id='$did'");
$v=mysql_fetch_array($u);
if($v[0]!=0 or $mazat=="true")
@$j=MySQL_query("DELETE FROM vzkazy WHERE id='$did'");
else
@$j=MySQL_Query("UPDATE vzkazy SET smazat='$INFO[0]' WHERE id='$did'");
if($j)
$zprava="Vzkaz byl smazán.";
}
// zobrazíme hlavičku stránky
head();
?>

<h3>Vzkazy</h3>
<?=$zprava?>
<A HREF="vzkazy.php">Napsat vzkaz</A>
<FORM ACTION="vzkazy_cist.php" METHOD="GET">
<select name="zobraz" ONCHANGE="submit()">
<option value="n" <?if($zobraz=="n") echo "SELECTED"; ?>>nepřečtené</option>
<option value="a" <?if($zobraz=="a") echo "SELECTED"; ?>>přečtené</option>
<option value="r" <?if($zobraz=="r") echo "SELECTED"; ?>>zodpovězené</option>
<option value="v" <?if($zobraz=="v") echo "SELECTED"; ?>>všechny</option>
<option value="on" <?if($zobraz=="on") echo "SELECTED"; ?>>
		odeslané - nepřečtené</option>
<option value="op" <?if($zobraz=="op") echo "SELECTED"; ?>>
		odeslané - přečtené</option>
</select>
</FORM>
<?
// select do databáze
if($zobraz=="" or $zobraz=="n")
$query=" stav='n' AND pro_id = '$INFO[0]'";
elseif($zobraz=="v")
$query=" pro_id='$INFO[0]' AND od_id='$INFO[0]'";
elseif($zobraz=="on")
$query=" stav='n' AND od_id='$INFO[0]'";
elseif($zobraz=="op")
$query=" stav='a' AND od_id='$INFO[0]'";
elseif($zobraz=="a")
$query=" (stav='a' OR stav='r') AND pro_id = '$INFO[0]'";
else
$query=" stav='".$zobraz."'";
if($query!="")
$query="WHERE ".$query." AND smazat!='$INFO[0]'";
else
$query="WHERE smazat!='$INFO[0]'";
@$sql = mysql_query("SELECT * FROM vzkazy $query ORDER BY od_id");

// pokud je v databázi alespoň jeden článek
// zobrazíme tabulku se statistikami
if(@mysql_num_rows($sql) > 0)
{
   ?>
   <table border=0 cellspacing=0 cellpadding=1 WIDTH="100%">
     <tr bgcolor=#C0C0C0>
       <td bgcolor=#C0C0C0><b>Vzkaz 
		<?if($zobraz=="on" or $zobraz=="op") 
			echo "pro"; 
		else 
			echo "od"; ?>:</b></td>
       <td bgcolor=#C0C0C0 align="center"><b> Předmět: </b></td>
       <td bgcolor=#C0C0C0 align="center"><b> Odpověď na vzkaz:</b></td>
       <td bgcolor=#C0C0C0 align="center"><b> Číst: </b></td>
       <td bgcolor=#C0C0C0 align="center"><b> Smazat: </b><</td>
     </tr>
   <?
        $i = 0; // pomocná proměnná
        // pro každý záznam v databázi se opakuje smyčka, ve které
        // postupně zobrazíme všechny uživatele
        while ($row = mysql_fetch_row($sql))
        {
            // pokud je číslo liché, vložíme do proměnné bgcolor
            // šedou barvu. Jinak bude proměnná prázdná
            if ($i%2==0) $bgcolor=''; else $bgcolor=" bgcolor=#C0C0C0";
   ?>
     <tr<? echo $bgcolor; ?>>
       <td<? echo $bgcolor; ?>> <b>
	<? if($zobraz=="op" or $zobraz=="on") 
		$kdo=$row[2]; 
	else 
		$kdo=$row[1]; 
	$a=mysql_query("SELECT jmeno FROM autori WHERE id='$kdo'"); 
	$b=mysql_fetch_row($a); 
	echo $b[0];?></b></td>
       <td<? echo $bgcolor; ?> align="center"> <? echo $row[3];?></td>
       <td<? echo $bgcolor; ?> align="center"> 
		<A HREF="vzkazy.php?odpoved_id=<?=$row[0]?>">
		Odpovědět</A></td>
       <td<? echo $bgcolor; ?> align="center"> 
		<A HREF="cist.php?id=<?=$row[0]?>">
		Číst</A></td>
      <td<? echo $bgcolor; ?> align="center"> 
		<A HREF="vzkazy_cist.php?did=<? echo $row[0]; 
		if($zobraz=="on") 
			echo "&mazat=true"; ?>" 
		ONCLICK="return confirm('Opravdu chcete zprávu smazat?')">
		Smazat</A></td>
     </tr>
   <?
          // zvýšíme proměnnou i o 1.
          $i++;
       } 
       // uvolníme výsledek
       @mysql_free_result($sql);
   ?>
   </table>
<?
}
// pokud není nikdo v databázi - nemožné, ale co kdyby...
else
{
   ?>
   <h3><font color="#FF0000"><b>Nenalezen žádný záznam !!!</b></font></h3>
   <?
}
// zobrazíme patičku stránky a zavřeme spojení s databází
foot();
@mysql_close($conn);
?>

Co se ve scriptu děje? Provedeme známé věci na začátcích scriptu. To jest zajistíme, že se stránka bude vždy načítat ze serveru a ne z cache paměti počítače. Jen tak mimochodem. Hlavička "Cache-Control", kterou používáme mi, odpovídá standartu HTTP/1.0. Aby odpovídala HTTP/1.1 musela by vypadat následovně.

header ("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1

Dále provedeme autorizaci a načteme soubory potřebné pro běh scriptu.

Pokud existuje proměnná $did, smažeme vzkaz s tímto id. Mazáni vzkazů je jistě důležité, neboť za chvíli bychom jich měli tolik, že bychom ztrácely přehled, ale hlavně by zabíraly místo v databázi. Nemůžeme samozřejmě nikoho nutit, aby si mazal některé vzkazy, ale jistě i příjemce se bude chtít některých zpráv zbavit. Je ale také potřeba ošetřit ty případy, kdy si odesílat zprávu smaže, ale příjemce si jí chce nechat. Pokud by se použilo DELETE smazala by se i pro příjemce. Z toho důvodu je tu položka smazat. Po vložení vzkazu má hodnotu 0. Tu má do té doby, než se ji rozhodne někdo z nich smazat. V tuto chvíli se však stává pouze neviditelnou pro toho, kdo ji smazal jako první. Teprve až v okamžiku, kdy ji smaže i druhý z nich, se na trvalo odstraní z databáze. Vyjimkou je případ, kdy odesílatel poslal zprávu a příjemce si ji ještě nepřečetl. V takovém případě se smaže natrvalo.

Dále tam máme možnost vybrat si, které zprávy chceme zobrazit. Z těchto dat sestavíme dotaz do databáze. Asi se vám zdá divné, proč když chci zobrazit přečtené, tak používám 'r' a 'a'. Myslím, že je jasné, že pokud byl nějaký vzkaz zodpovězen, tak musel být také přečtený. V SQL dotazu samozřejmě nesmí chybět podmínka pro smazané zprávy (smazat!='$INFO[0]').

Následuje již výpis jednotlivých vzkazů. Pokud zobrazujeme zprávy odeslané, tak víme, že jsme je poslali my a tak vybereme jméno příjemce. Proto i ta změna v nadpisu sloupce ("od" a "pro"). U mazání vidíme podmínku, o které jsem již mluvil. Jedná se o mazání odeslané zprávy, která ještě nebyla přečtena. Zajistíme to tím, že proměnnou $mazat nastavíme na true.

Ještě něco málo k zobrazování vzkazů podle práv uživatelů. Můžeme se s tím setkat i v televizi, kde je z toho vždy strašný poprask. Zámněrně jsem to postavil tak, že každý může číst vzkazy určené jen jemu, nebo jím odeslané. Předejde se tak zásahu do soukromí. Upravit vše do podoby, kdy bude mít nebo vybraná osoba přístup k celkové korespondenci všech užvatelů, není příjiš složité. Jde vlastně jen o úpravu SQL dotazu. Myslím ale, že soukromí jiných není naše záležitost. Vše je však na vašem svědomí.

Tak to by bylo pro dnešek vše. Zkuste to nějak přelouskat a těšte se na příště, kdy si ukážeme jak psát vzkazy.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: