Každý dobrý katalog stránek by měl svým návštěvníkům umožňovat přidat odkaz na nějaké stránky. Buď dovolíme uživateli odkaz vložit rovnou do databáze, tj. po přidání odkazu se odkaz v katalogu objeví ihned, nebo každý nově přidaný odkaz si nejprve správce katalogu prohlédne a teprve potom jej zařadí do katalogu.

Každý z uvedených postupů má své výhody a nevýhody. První varianta je zcela jistě jednodušší na implementaci, na druhou stranu ale nemáme k dispozici žádný kontrolní mechanismus, jak ošetřit vložení nevhodných odkazů, apod. Proto si dovolím tuto první variantu zavrhnout. Druhá varianta vychazí z toho, že uživatel nevloží odkaz rovnou do katalogu (tj. záznam se neuloží do tabulky ODKAZ), ale do „prozatimní“ tabulky ZADOSTI. Teprve potom administrátor prohlédne všechny nově přidané odkazy, které může potvrdit a uložit do katalogu. Zde má možnost i nové odkazy před jejich potrvzením zeditovat.

V dnešním článku se budu věnovat právě přidání odkazu na straně uživatele.

Pomocné funkce

Z důvodů zvýšení přehlednosti kódu skriptu pridej_odkaz.php zde uvedu a popíšu několik pomocných funkcí, které budeme potřebovat. První z nich bude funkce get_new_id(), která nám bude vracet novou hodnotu ID pro záznam v tabulce ZADOSTI. Tuto funkci využijeme tam, kde budeme chtít vložit nový záznam do tabulky.

function get_new_id () {
  $id = 0;
  $tmp = mysql(„katalog“, „SELECT MAX(id) AS maxim FROM zadosti“);
  $pocet = mysql_num_rows($tmp);
  if (!$pocet) {
    $id = 1;
  }
  else {
    $id = mysql_result($tmp, 0, „maxim“);
    $id++;
  }
  return $id;
}

Protože zde bude uživatel zadávat data do formuláře, je potřeba ošetřit všechny zadané hodnoty. Např. že e-mailová adresa nebo URL je zadáno v korektním tvaru, že název či popis neobsahují nebezpečné znaky, že heslo má délku alespoň 5 znaků, apod. Zde je několik funkcí, které pak použijeme pro kontrolu nezávadnosti vstupních řetězců:

function check_url ($url) { /* =1 vse ok, =0 spatne */
  $tmp = StrTr($url,“$&#@\`'<>“, “         „);
  if ($tmp <> $url) {
    /* doslo k nejakemu nahrazeni mezerou */
  return 0;
  }
  return 1;
}
function check_mail ($email) { /* =1 vse ok, =0 spatne */

  if (Eregl(„^[a-z0-9_\.]+@[a-z0-9_\.]+[a-z]{2,3}$“, $email)) {
    return 1;
  }
  else {
    return 0; /* e-mail neni v pozadovanem tvaru */
  }
}

První funkce jenom testuje, zdali URL neobsahuje nějaké nepovolené znaky. Pokud bychom chtěli i ověřovat, že URL je zapsáno ve správném tvaru, použili bychom regularních výrazů, jak je uvedeno u druhé funkce pro e-mail. Podobným způsobem lze zapsat i další funkce jako jsou check_nazev, check_popis, apod. Uvedené funkce berte jako vzor, můžete je rozšířit, záleží na vás, jak moc chcete být důslední. Funkce na ověření, že heslo má alespoň 5 znaků, vypadá jednoduše:

function check_password ($pass) {
  if (StrLen($pass) >= 5) {
    return 1;
  }
  else {
    return 0;
  }
}

Jak bude fungovat přidání odkazu?

Při prvním spuštění skriptu pridej_odkaz.php (skript zavolán bez parametrů), se zobrazí formulář pro vyplnění údajů o odkazu. Po té uživatel stiskne tlačítko „Přidat“ a zavolá se znovu skript pridej_odkaz.php (tentokrát s parametrem akce=Přidat). Nyní musíme provést kontrolu všech zadaných hodnot, zdali jsou zadány v pořádku. Pokud je všechno zadáno korektně, odkaz se uloží a pak vypíšeme hlášku: „Váš odkaz byl úspěšně zařazen mezi žádosti o zařazení odkazu do katalogu“. Pokud se nějaká chyba vyskytne, je potřeba znovu zobrazit formulář (v něm již vyplněné hodnoty znovu zobrazit a uvést krátká chybová hlášení vybízející uživatele, aby dané údaje opravil). Po té opět klikne na „Přidat“, znovu se zavolá skript pridej_odkaz.php. Toto se děje opakovaně, dokud všechny údaje nebudou zadány v pořádku (nebo do té doby, než to uživatel vzdá ;-).

Struktura skriptu

S ohledem na postup, který jsem uvedl, by hrubá kostra skriptu mohla vypadat takto:

<?php
/* kostra skriptu pridej_odkaz.php */
/* definice vsech pomocnych funkci */
/* (1) */
/* zjisti vsechny parametry skriptu */
/* a proved vsechna otestovani parametru, pokud jsou definovany */

if ((!$akce) || (($jsou_chyby) && ($akce == ‚Přidej‘))) {
  /* (2) */
  /* zobraz formular */
}
if (($akce == ‚Přidej‘) && (!$jsou_chyby)) {
  /* (3) */
  /* uloz nove pridavany odkaz do tabulky ZADOSTI */
  /* a informuj uzivatele o uspesnem vlozeni */

}
?>

Všem je snad jasné, že formulář se zobrazí jen při prvním zavolání skriptu, nebo po opakovaném zavolání, pokud data od uživatele budou nekorektní.

Skript pridej_odkaz.php

Nyní uvedu ukázkový kód jednotlivých částí tohoto skriptu (tak, jak jsem si je očísloval v kostře).

Část (2)

Možná se pozastavujete nad tím, proč začínám druhou částí. Je to proto, že v první části budeme pracovat s předanými parametry, které jsou v PHP skriptu automaticky přístupné přes proměnné, které mají stejný název, jako prvky formuláře. Proto nejprve nadefinujeme formulář, a pak teprve vyřešíme část (1) a (3).

/* zobrazeni formulare */
print „<FORM ACTION=\“pridej_odkaz.php\“ METHOD=\“get\“>“;
print „<B>Přidání odkazu</B><BR>“;
print „Název stránky (max. 80 znaků): <BR>“;
print „<INPUT TYPE=\“text\“ NAME=\“nazev\“ VALUE=\“$nazev\“ SIZE=50 MAXLENGTH=80><BR>“;
print „Popis stránky (max. 160 znaků): <BR>“;
print „<INPUT TYPE=\“text\“ NAME=\“popis\“ VALUE=\“$popis\“ SIZE=80 MAXLENGTH=160><BR>“;
/* zobrazime seznam vsech sekci */
mysql_connect(„localhost“);
$seznam_sekci = mysql(„katalog“,“SELECT id, nazev FROM sekce ORDER BY nazev“);
$pocet_sekci = mysql_num_rows($seznam_sekci);
print „<SELECT NAME=\“sekce\“ SIZE=8>“;
for ($i = 0; $i < $pocet_sekci; $i++) {
  $ps = mysql_result($seznam_sekci, $i, „id“);
  $pid = mysql_result($seznam_sekci, $i, „nazev“);
  /* pokud byla sekce jiz vybrana v predchozim volani skriptu, pak ji nastavime na checked */
  $zaskrtnuto = “;
  if ($pid == $sekce) {
    $zaskrtnuto = ‚checked‘;
  }

  /* pridame danou sekci do seznamu sekci v poli SELECT */

  print „<OPTION VALUE=$pid $zaskrtnuto>$ps<BR>“;
}
print „</SELECT>“;
mysql_close;
print „URL: (max. 100 znaků):<BR>“;
print „<INPUT TYPE=\“text\“ NAME=\“url\“ VALUE=\“$url\“ SIZE=80 MAXLENGTH=100><BR>“;
print „Váš e-mail: <BR>“;
print „<INPUT TYPE=\“type\“ NAME=\“mail\“ VALUE=\“$mail\“ SIZE=20 MAXLENGTH=30><BR>“;
print „Vaše heslo (použijete jej při budoucí editaci vašeho odkazu): <BR>“;
print „<INPUT TYPE=\“password\“ NAME=\“heslo\“ VALUE=\“$heslo\“ SIZE=20 MAXLENGTH=20><BR>“;
print „<INPUT TYPE=\“submit\“ NAME=\“akce\“ VALUE=\“Přidat\“> „;
print „<INPUT TYPE=\“reset\“ VALUE=\“Původní hodnoty\“>“;
print „</FORM>“;

Přestože uvedená definice formuláře je už trochu složitější, věřím, že si dokážete představit, jak by takový formulář na stránce vypadal. Jistě jste si všimli, že u většiny prvků formuláře definuji implicitní hodnotu (atribut VALUE). To proto, že když bude skript volán opakovaně, aby se již zadané hodnoty ve formuláři objevily. A pokud bude skript volán poprvé, pak hodnoty proměnných $nazev, $popis, … budou prázdné, tedy formulář se zobrazí s prázdnými políčky, což chceme.

Uprostřed definice je pole SELECT. Zde musíme z databáze vybrat všechny sekce a pak je zařadit do menu SELECT. Uživatel kliknutím vybere nějakou konkrétní sekci, skriptu se ale předává pouze její číslo. (Pokud je tedy skript volán opakovaně, pak je potřeba pro sekci s již vybraným číslem označit jako CHECKED.)

Část (1)

Když už známe všechny názvy prvků z formuláře, můžeme nad nimi provést všechny potřebné testy:

/* testovani parametru */
$jsou_chyby = 0;
if (!check_nazev($nazev)) {
  print „Chyba 01: Název stránky obsahuje nepovolené znaky!<BR>“;
  $jsou_chyby = 1;
}
if (!check_popis($popis)) {
  print „Chyba 02: Popis stránky obsahuje nepovolené znaky!<BR>“;
  $jsou_chyby = 1;
}
if (!$sekce) {
  print „Chyba 03: Nebyla vybrána žádná sekce!<BR>“;
  $jsou_chyby = 1;
}

atd.

Tímto postupem bychom bez problémů zkontrolovali všechny hodnoty. Jakákoliv chyba v jedné z nich způsobí, že proměnná $jsou_chyby bude nastavena na hodnotu 1.

Část (3)

Nyní jsme v situaci, že uživatel nakonec vyplnil všechno správně, jak jsme požadovali. Následující kód ukazuje uložení vložených dat do databáze:

/* vlozeni dat do tabulky ZADOSTI */
mysql_connect(„localhost“);
$nove_id = get_new_id(); /* mame nove jedinecne ID */
$prikaz = „INSERT INTO zadosti VALUES ($nove_id, ‚$nazev‘, ‚$popis‘, ‚$url‘, $sekce, ‚$mail‘, password(‚$heslo‘), current_date)“;
mysql(„katalog“, $prikaz);
if (mysql_errno() == 0) {
  print „<B> Váš odkaz byl úspěšně vložen do databáze. „;
  print „Nyní vyčkejte 14 dní, než … </B>“;
}
else {
  print „<B> Při práci s databází došlo k chybě. „;
  print „Váš odkaz nebyl vložen </B>“;
}
mysql_close;

Závěrem

Snažil jsem se uvést co nejjednodušší postup, jak naimplementovat přidání odkazů uživatelem. Z důvodů vyšší přehlednosti uvedených kódů, jsem opět vynechal testování chybových stavů. Možná vás napadne řada různých vylepšení. Například, jak v části (3) vypisujeme hlášku o úspěšném vložení, je vhodné na obrazovku vypsat obsah přidávaného záznamu, nebo jej poslat na zadaný e-mail. Jistě by bylo lepší, kdyby se chybové hlášky pro špatně zadanou hodnotu ve formuláři nezobrazovaly před formulářem, ale přímo v něm (u každé takové položky by byla chybová hláška). Podobných vylepšení určitě najdete mnoho, vzhledem k rozsahu je to však nad rámec tohoto článku.

V příštím díle se podíváme, co s takovými nově přidanými odkazy provede administrátor. Ten bude mít k dispozici skript zarad_odkazy.php, který bude zajišťovat zařazení odkazu z tabulky ZADOSTI do katalogu (tj. odkaz bude přesunut do tabulky ODKAZ). Obsah skriptu zarad_odkazy.php bude tedy náplní dalšího článku.

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

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

Žádný příspěvek v diskuzi

Odpovědět