Jak na vlastní katalog stránek v PHP – přidání odkazu

29. března 2001

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.

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

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