Anketní systém v PHP II. - 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

Anketní systém v PHP II.

php_anketa

3. dubna 2001, 00.00 | Vylepšení anketního systému o administrační část. Nyní můžete zadávat nové ankety, mazat staré a editovat stávající. Nechte se inspirovat naším článkem a udělejte si svůj anketní systém!

V minulém díle jsme navrhli funkci pro vykreslovaní ankety, kterou jsme si "natvrdo vytvořili" jako jeden řádek v tabulce.

Dnes navrhneme systém (prostředí), který nám umožní vytvářet ankety, upravovat je a mazat.

Všechno bude obstarávat jeden soubor, který budeme volat buď s parametrem id pro zobrazení určité ankety či vytvoření nové id=0 nebo bez parametru, pro zobrazení seznamu anket. Pro vykonáni akce přidáme parametr zmena=1. Soubor si pojmenujeme spravceanket.phtml.

spravceanket.phtml

Poznámka na úvod: Tento správce je vyvtořen pro strukturu tabulky anket, kterou jsme si vytvořili v minulém díle. Pokud ji nemáte z nějakého důvodu vytvořenou, vytvořte si ji tímto SQL příkazem:
create table ankety (id int4 not null default '0' auto_increment primary key, otazka varchar(50), odp1 varchar(35), p1 int2, odp2 varchar(35), p2 int2, odp3 varchar(35), p3 int2, odp4 varchar(35),p4 int2, odp5 varchar(35), p5 int2, odp6 varchar(35), p6 int2, odp7 varchar(35), p7 int2 )

Na začátku souboru si načteme "moje oblíbené" soubory pro práci s databází (ct_sql.inc, db_mysql.inc, local.inc)

<?php
require("ct_sql.inc");
require("db_mysql.inc");
require("local.inc");
$db = new mojeDB;

(tyto tři soubory jsou volně šiřitelné. Pro větší bezpečnost si je přejmenujte na *.phtml nebo *.php)

Provedení změn
Teď přijde část, která ověří, zda byla provedena nějaká změna a vykoná ji { parametr zmena=1 };

Provedení změn je rozděleno na dvě částí, první je pro výmaz ankety ze systému (odstranění řádku z databáze). Odstraňení se provede zavoláním SQL příkazu DELETE.

if (isset($zmena))
{
 if (isset($smaz))
 { //bude mazat???
  $query = "delete from ankety where id=$smaz";
  $db->query($query);
 }

Pokud se změna netýká mazání, pak je to tedy úprava/vložení nové ankety. Předtím, než se provede úprava či vložení se zkontroluje pomocí for cyklu, zda všechny proměné p1 - p7 mají "hodnotu integeru" (udělalo by to problém při vykonání SQL příkazu)

Samotné vložení či úprava se provede pomocí SQL příkazu REPLACE, který má tuto výhodu: Existuje-li pole s primárním klíčem a já vkládám do tabulky řádek, který má primární klíč stejný jako nějaký řádek v databázi,tak pouze upraví tento řádek podle ostatních hodnot, pokuď neexistuje, vytvoří v tabulce nový řádek. Pole s primárním klíčem má v naší tabulce ještě parametr auto_increment. Tedy pokud dám 0 a ta v tabulce jako primarní klíč není (když je auto_increment tak nula nikdy není), nevloží se 0, ale dosud nejvyšší číslo primárního klíče v tabulce +1. Tím zajistím při parametru $id=0 vytvoření nové ankety s nejvyšším id (primárním klíčem ;-)

Nakonec vymažu existenci proměné $id, aby se mi zobrazil seznam anket (viz níže) a ne znovu úprava této ankety.
 else
 { //nebude mazat, tedy upravuji
  for ($i = 1; $i <= 7; $i++) // zkontruluj zda byli zadany hodnoty
  { // vsech odpovedi ankety
   $cham = "p".$i;
   settype($$cham,"integer");// preved na integer - pokud lze
   if (!(is_long($$cham)) < 1) $$cham=0; // nebyla zadana ci byla zadana chybne? pak je nula
  }
  $query = "replace into ankety values ($id,\"$otazka\",\"$odp1\", $p1, \"$odp2\", $p2, \"$odp3\", $p3, \"$odp4\", $p4, \"$odp5\", $p5, \"$odp6\", $p6, \"$odp7\", $p7)";
  $db->query($query);
 }
 unset($id); //smaz promenou $id !
 // aby po provedeni zobrazil seznam a ne znovu cast pro upravu ankety s timto id :)
}

(pokud máte toho již toho plnou hlavu, dejte si pauzu, protáhněte se, napijte se, něco pojezte a pak hurá na druhou-zobrazovací část souboru)

Zobrazit anketu nebo seznam anket?

Teď přijde na řadu rozlišení volání. Buď existuje proměnná $id pak se zobrazí příslušná anketa. Neexistuje-li proměnná $id (nebo byla smazána, tedy taky není) zobrazí seznam anket.

if (isset($id))
{ //Mas zobrazit jednu anketu? Nacti jeji hodnoty do $db
 $query = "select * from ankety where id=$id";
 $db->query($query);
 $db->next_record();

Nyní máme v proměnné $db->f("otazka") otázku, v poli $db->f("odp1") 1.možnou odpověď, atd... V našem systému můžeme měnit všechny parametry ankety, kromě jejího id - jedinečné číslo pro anketu.

Formulář pro změny/vytvoření

Nejdříve si zobrazíme $id, to nelze měnit a poté formuář (formulář je volán bez parametru action to znamená, že data budou odeslány tomuto skriptu), kde v prvním textovém poli bude otázka.

 if ($id>0) { echo "id ankety je $id"; } else { echo "tohle bude nova anketa"; } //jen pro informaci
 echo "<form method=\"post\">";
 echo "OTAZKA: <input type=\"text\" name=\"otazka\" value=\"".$db->f("otazka")."\"></input><br>";

Dále zobrazíme všech 7 otázek a počty odpovědí, abychom to provedli elegantně, využijeme na to for cyklus. 7x zobrazíme formulářový prvek INPUT s jménem odp1-7 a 7x se jménem p1-7 a jeho hodnoty přednastavíme parametrem value s příslušnou hodnotou proměnné v objektu $db

for ($i=1; $i <8;$i++)
{
 echo "Odpoved c.$i : <input type=\"text\" name=\"odp$i\" value=\"".$db->f("odp".$i)."\"></input>";
 echo " a pocet odpovedi byl: <input type=\"text\" name=\"p$i\" value=\"".$db->f("p".$i)."\"></input><br>";
}

Ještě potřebujeme tlačítko a něco, co nám nastaví parametr zmena=1. Vytvoříme tedy skryté pole (parametr hidden) se jménem zmena a hodnotou 1 a tlačítko (parametr submit) a value="popis tlačítka". Někdo by mohl namítnout, že by stačílo tlačítku přiřadit name=zmena a nemuseli bychom mít skrytý prvek, ale to by fungovalo jen při kliknutí, ne při stisknutí ENTERu

echo "<input type=\"hidden\" name=\"zmena\" value=\"1\"></input>";
echo "<input type=\"submit\" name=\"tl\" value=\"Ulozit\"></input>";
}

Část pro editaci je kompletní, přistoupíme tedy k zobrazení.

Seznam anket
Nejdříve pošleme dotaz k databázi pro výpis anket, a poté pomocí for cyklu budeme zobrazovat. (zvolil jsem primitivní zobrazení, co anketa, to jeden řádek). Zobrazím vždy id ankety, otázku a za nimi odkaz pro úpravu a smazání. Odkaz ukazuje na tento soubor a je tam přidán parametr pro úpravy ?id=$id a pro smazaní ?zmena=1&smaz=$id

else
{ //zobrazit seznam vsech anket
 $query = "select id, otazka from ankety order by id";
 $db->query($query);
 for($i=1; $i <= $db->num_rows(); $i++)
 {
  $db->next_record();   echo "ID je ".$db->f("id")." otázka zní <b>".$db->f("otazka")."</b>";
  echo "&nbsp;&nbsp;<a href=\"spravceanket.phtml?id=".$db->f("id")."\">ÚPRAVA</a>";
  echo "--- nebo také <a href=\"spravceanket.phtml?zmena=1&smaz=".$db->f("id")."\">SMAZÁNÍ</a>";
  echo "<br>"; //aby dalsi anketa byla na novem radku
 }

Doufám, že jste se při tom nezapotili, jdeme do finiše.

Ještě potřebujeme odkaz na vytvoření nové ankety, to provedeme voláním tohoto souboru s parametem ?id=0

 echo "<br><br><a href=\"spravceanket.phtml?id=0\">VYTVOŘ NOVOU ANKETU</a><br>";
}

Nakonec nezapomeňte, že tento správce anket, je jenom pro vás, tedy je neveřejný. Proto by bylo dobré alespoň neuvádět odkaz na tento soubor. Lepší způsob ochrany je chránit soubor ověřením identity, ale o tom třeba příště.


Download ukázky z tohoto dílu (6 kB)

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: