Interní vzkazy - III - 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 - III

redakcni system

10. října 2002, 00.00 | Další díl "nekonečného" seriálu o Redakčním systému. Dnes dokončíme interní vzkazy a podíváme se ještě na nějaké opravy..

Pro dnešek nám tedy zbývá script cist.php. Ještě před tím se ale vrátím ke scriptu vzkazy_cist.php. Je to reakce na poznámku Pavla Treutnera, za kterou mu tímto děkuji.

Upozornil mě na to, že pokud odešle dvakrát ten samý uživatel pokyn k smazání zprávy, smaže se na trvalo bez ohledu na názor druhé strany. Řešení je poměrně jednoduché. Podmínka pro mazání zpráv pak bude vypadat takto:

if(isset($did))
{
   $u=mysql_query("SELECT smazat FROM vzkazy WHERE id='$did'");
   $v=mysql_fetch_array($u);
   if($v[0]!=$INFO[0])   // pokud zprávu již jednou mazal, 
                         //nepovolíme mu tuto akci opakovat
   {
      if($v[0]!=0 or $mazat=="true")
         @$j=MySQL_query("DELETE FROM vzkazy WHERE id='$did'"); 
                                                //smažeme jej na trvalo
      else
         @$j=MySQL_Query("UPDATE vzkazy SET smazat='$INFO[0]' WHERE id='$did'");
			// pouze jej uděláme neviditelným
      if($j)
         $zprava="Vzkaz byl smazán.";
   }
   else  
   {
      $zprava="Tento vzkaz již byl smazán.";
   }
}

Bohužel, moje nepozornost ovlivní i změnu scriptu menu.php. SQL dotaz musíme změnit na tento:

SELECT count(id) FROM vzkazy WHERE pro_id='$INFO[0]' AND stav='n' 
   AND smazat!='$INFO[0]'

Ptáte se proč? Je to z jednoduchého důvodu. Tento dotaz funguje i v případě, že příjemce zprávu smaže ještě než si jí přečte. V takovém případě ale zůstává v položce stav hodnota 'n' a SQL dotaz by nepracoval tak jak chceme. Tím, že přidáme zeleně označenou část, se tento nedostatek odstraní.

Přidám ještě jednu takovou užitečnou věcičku. Možná vás obtěžuje, když jste si všechny vzkazy přečetli a přes to tam stále máte hlášku o nových zprávách. Postačí na to jednoduchý javascript, který při kliku na nějaký odkaz reloadne stránku. Možná si říkáte, že reloadovat stránku při každém kliku je zbytečné, ale i tento nedostatek je odstraněn. Podívejme se na to.

.
.
.
$zprava="(".$b[0]." nových)";
else
$zprava="";
if($zprava=="")
$click="";
else
$click=" ONCLICK=\"location.reload()\" ";
// zobrazíme stránku menu
head();
.
.
.

echo "<A HREF=prehled.php target=main $click>Přehled článků</A><BR>\n";

Jak vidíme, zeleně je označena nová část. V první části máme podmínku, která nám vyřeší situaci, kdy žádné nové zprávy nemáme. Pokud ale nějaké jsou, na určené místo (druhá zelená část v odkazu), se umístí Javascript, který zajistí reload stránky. Použití podmínky je na vás. Pokud ji použijete, zmizí vám hláška, ale nezobrazí se upozornění na nové zprávy, které přijdou v době, kdy je uživatel přihlášen.

Poslední oprava je znovu ve scriptu vzkazy_cist.php a je u výběru zpráv. Tuto část nechávám bez komentáře, neboť rozdíly jistě pochopíte sami.

// 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]' OR 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]'";
elseif($zobraz=="r")
$query=" stav='r' AND pro_id='$INFO[0]' ";
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");

Konečně se dostáváme ke scriptu cist.php. Je velice podobný tomu, pomocí kterého tiskneme. Tady je:

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

// není-li uživatel autorizován, vykopneme ho
if (!isset($PHP_AUTH_USER)):
   echo "Neautorizovaný přístup";
   exit;
endif;

// includneme funkce a spojíme se s databází
@include "../conn.php";
@include "../function.php";

// ověříme autorizaci
auth();

// select článku a informací o autorovi a rubrice
@$sql = mysql_query("SELECT * FROM vzkazy WHERE id = $id"); 
// vybereme zprávu
@MySQL_query("UPDATE vzkazy SET stav='a' WHERE id = $id"); 
// zpráva je od této chvíle přečtená

// načtení výsledku z databáze
@$data = mysql_fetch_row($sql);

// zobrazíme stránku a v ní získaná data
head();
?>

<P ALIGN="CENTER"><B>Od:</B> <? 
@$a=mysql_query("SELECT jmeno FROM autori WHERE id='$data[1]'"); 
$b=mysql_fetch_row($a); 
echo $b[0]; ?>
</P>

<P><B>Předmět:</B> <? echo $data[3]; ?></P>
<B>Zpráva:</B><BR>
<? echo nl2br($data[5]); ?>

<P>
<B>
<? 
if($data[6]==0):
echo "Tato zpráva není reakcí na žádný vzkaz.";
else:
$a=mysql_query("SELECT id,predmet FROM vzkazy WHERE id='$data[6]'"); 
$b=mysql_fetch_row($a); // vybereme název a id vzkazu
echo "Odpověď na <A HREF=\"cist.php?id=$b[0]\">".$b[1]."</A>\n";
endif;
?>
</B>
</P>
<P>
<A HREF="vzkazy.php?odpoved_id=<?=$data[0]?>">Odpovědět</A>
<?
foot(); 
@mysql_close($conn);
?>

Na začátku provedeme klasické procedury jako načtení scriptů či autorizace. Následně vybereme zprávu z databáze a nastavíme ji jako přečtenou. Pomocí položky výsledku, kde máme id odesílatele (od_id), zjistíme z tabulky autori jeho jméno. Dále zobrazíme předmět a následně samotnou zprávu, kde konce řádek převedeme na znaky <BR>(funkce nl2br()). V další položce zobrazíme předmět vzkazu, na který tato zpráva reaguje. Ten zjistíme pomocí položky odpoved_id, kterou máve ve výsledku pod číslem 6. Následuje již jen odkaz, pomocí kterého odpovíme na tuto zprávu odesílateli.

To je pro dnešek vše. Příště začneme vzkazy, ale tentokrát od čtenářů k autorům.

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: