XV. Realizarea unui modul de sondaje (Partea I)
07.02.2009
In cursul acestei serii, ti-am oferit un tur al PHP, invatandu-te tot ce trebuie sa stii pentru a te lansa in utilizarea acestui limbaj de programare extrem de puternic. In cele doua capitole finale ale acestei serii de tutoriale, vei putea citi despre implementarea a doua aplicatii PHP din lumea reala. Nu numai ca vei fi introdus in dezvoltarea propriu-zisa a aplicatiilor PHP, dar vei avea ocazia sa testezi toata teoria cu care ai fost indoctrinat in ultimile saptamani.
5877 afisari 3 Rating (4 voturi) 25 min

Lumea reala

In cursul acestei serii, ti-am oferit un tur al PHP, invatandu-te tot ce trebuie sa stii pentru a te lansa in utilizarea acestui limbaj de programare extrem de puternic. Ai invatat cum sa procesezi siruri, sa scrii functii, sa construiesti obiecte si sa generezi exceptii. Ai mai invatat cum sa citesti datele introduse de utilizatori in formulare, sa cauti prin baze de date si sa utilizezi cookie-uri si sesiuni pentru a memora starea aplicatiei. Nu mai esti bobocul timid intr-ale PHP-ului dinainte, ci un luptator PHP curajos si puternic, gata de a prelua tot ce lumea (sau seful tau) arunca spre tine.

Exista un singur dezavantaj. Desigur ca ai tot armamentul, dar inca nu l-ai utilizat niciodata in lumea reala. Iata rolul acestor parti finale ale PHP 101.

In cele doua capitole finale ale acestei serii de tutoriale vei putea citi despre implementarea a doua aplicatii PHP din lumea reala. Nu numai ca vei fi introdus in dezvoltarea propriu-zisa a aplicatiilor utilizand PHP, dar vei avea ocazia sa testezi toata teoria cu care ai fost indoctrinat in ultimele saptamani.

Intrebari arzatoare

Prima aplicatie este destul de simpla. Este un sistem de votare pentru un site web, care iti permite sa calculezi rapid ceea ce cred vizitatorii tai despre anumite subiecte. Acest mecanism de vot online este destul de popular deoarece iti permite sa afli ce gandesc vizitatorii tai si sa iti faci site-ul cat mai dinamic si interactiv.

Mai mult ca sigur ca ai vazut un astfel de sistem functionand pe multe portaluri web si ai o imagine destul de clara in minte despre cum functioneaza.

Oricum, este un bun exercitiu sa notezi exact ceea ce ar trebui sa execute produsul final inainte de a incepe sa scrii chiar si o singura linie de cod (It-istii numesc asta definirea cerintelor).

  • Trebuie sa existe un mecanism prin care utilizatorul poate vedea o intrebare si apoi poate selecta dintr-o lista de raspunsuri posibile. Acest "vot" trebuie sa fie ulterior captat in sistem si adaugat numarului de voturi aferent acelei intrebari.
  • Trebuie sa existe o metoda prin care administratorul siteului poate adauga noi intrebari sau le poate sterge pe cele vechi. Pentru a stoca aceste intrebari si raspunsuri poti crea un tabel intr-o baza de date SQL, dar e posibil ca administratorul site-ului sa nu fie destul de priceput in SQL pentru a modifica aceste date manual. Asadar, ar trebui furnizata o interfata de tip formular pentru a-i face munca mai simpla.
  • In mod evident, trebuie sa existe o modalitate de a vedea rapoarte ale voturilor furnizate în cazul fiecarei intrebari si a raspunsurilor aferente. Raportul ar trebui sa contina un calcul al voturilor totale inregistrate la o intrebare, dar si o separare a voturilor obtinute pentru fiecare raspuns.

Apare o intrebare importanta: Are vreun rost sa stabilesti numarul de variante disponibile pentru fiecare intrebare? In opinia mea, nu are, deoarece numarul variantelor disponibile se va schimba in cazul fiecarei intrebari. Este mai bina ca acest numar sa fie variabil si sa-i permiti administratorului site-ului sa adauge cate variante considera a fi necesare. Poti oricum defini o limita superioara cu privire la numarul de variante posibile pentru fiecare intrebare - cel mai potrivit ar fi sa pui 5.

Avand aceasta schita in minte, urmatorul pas este sa creezi o baza de date care sustine aceste cerinte.

Designer al bazelor de date

Aceasta este structura tabelelor pe care le vei utiliza pentru aceasta aplicatie, stocata in db.sql:

#
# Structura tabelului ` intrebari ` 
#
CREATE TABLE `questions` (
  `qid` tinyint(3) unsigned NOT NULL auto_increment,
  `qtitle` varchar(255) NOT NULL default '',
  `qdate` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`qid`)
);
 
#
# Structura tabelului ` raspunsuri ` 
#
CREATE TABLE `answers` (
  `aid` tinyint(3) unsigned NOT NULL auto_increment,
  `qid` tinyint(4) NOT NULL default '0',
  `atitle` varchar(255) NOT NULL default '',
  `acount` int(11) NOT NULL default '0',
  PRIMARY KEY  (`aid`)
);

Dupa cum poti observa este destul de simplu: un tabel pentru intrebari si unul pentru raspunsuri. Cele doua tabele sunt conectate prin intermediul unui camp qid. Cu aceasta structura poti avea un numar infinit de raspunsuri la fiecare intrebare. (Nu iti doresti asta - ai prefera ca acest numar sa fie 5 sau mai putin - dar logica implementarii acestei reguli este mai bine situata la nivelul aplicatiei decat la nivelul bazei de date).

Pentru a incepe si pentru a-ti oferi o idee mai buna cu privire la functionarea acestei structuri in lumea reala, insereaza o intrebare in baza de date, impreuna cu trei raspunsuri posibile:

INSERT INTO `questions` VALUES (1, 'Ce versiune de PHP folosesti?', '2008-10-15');
INSERT INTO `answers` VALUES (1, 1, 'PHP 3.x', 0);
INSERT INTO `answers` VALUES (2, 1, 'PHP 4.x', 0);;

Alternativ, poti crea o noua baza de date si sa tastezi source db.sql in command prompt pentru a incarca direct structurile tabelelor si datele.

Sistemul de vot

Dupa ce ne-am ocupat de baza de date, este timpul sa trecem la paginile web pe care le vede utilizatorul. Prima este user.php, care se conecteaza la baza de date pentru a obtine ultima intrebare din tabel si o afiseaza impreuna cu toate variantele de raspuns. Iata codul:

<html>
<head><basefont face = 'Arial'></head>
<body>
 
<?php
 
// include fisierul de configurare
include('config.php');
 
// deschide conexiunea la baza de date
$connection = mysql_connect($host, $user, $pass) or die('EROARE: Nu s-a putut realiza conexiunea!');
 
// selectarea bazei de date 
mysql_select_db($db) or die('EROARE: Nu s-a putut selecta baza de date!');
 
// genereaza si executa interogarea
$query = "SELECT aid, atitle FROM answers WHERE qid = '$qid'";
$result = mysql_query($query) or die("EROARE: $query.".mysql_error());
 
// daca exista inregistrari
if (mysql_num_rows($result) > 0) {
    $row = mysql_fetch_object($result);
 
    // obtine ID intrebare si titlul
    $qid = $row->qid;
    echo '<h2>'.$row->qtitle .'</h2>';
    echo "<form method = post action = 'user_submit.php'>";
    
    // obtine raspunsuri posibile utilizand ID intrebare
    $query = "SELECT aid, atitle FROM answers WHERE qid = '$qid'";
    $result = mysql_query($query) or die("EROARE: $query.".mysql_error());
 
    if (mysql_num_rows($result) > 0) {
 
        // tipareste lista de raspunsuri ca radio buttons
        while ($row = mysql_fetch_object($result)) {
            echo "<input type = radio name = aid value = '".$row->aid."'>'".$row->atitle."'</input><br />";
        }
 
    echo "<input type = hidden name = qid value = '".$qid."'>";
    echo "<input type = submit name = submit value = 'Vote!'>";
    }
    
    echo '</form>';
}
 
// daca nu exista inregistrari, arata mesajul
else {
    echo '<font size="-1">Nu exista intrebari configurate</font>';
}
 
// inchide conexiunea
mysql_close($connection);
 
?>
 
</body>
</html>

Fii atent mai ales la interogarea SQL care va fi executata: ea utilizeaza cuvintele cheie ORDER BY, DESC si LIMIT pentru a obtine ultima inregistrare din tabelul cu intrebari. Cand interogarea intoarce un raspuns, ID-ul inregistrarii este utilizat pentru a obtine lista de raspunsuri din tabelul answers. Apoi, raspunsurile sunt afisate ca butoane radio intr-o bucla while(). ID-ul fiecarui raspuns este memorat in atributul value din butonul radio corespunzator; la trimiterea formularului, acest identificator este folosit pentru a incrementa numarul de voturi pentru raspunsul selectat.

Observa ca daca baza de date este goala, apare un mesaj de eroare. In acest exemplu, am introdus deja o intrebare in baza de date deci nu va aparea; oricum, este un bun exercitiu de programare pentru a te asigura ca toate situatiile sunt prevazute, chiar si cele care nu apar foarte des.

Fisierul config.php inclus la inceputul scriptului contine parametrii de acces pentru baza de date MySQL. Aceasta informatie a fost plasata intr-un fisier separat pentru a fi usor de modificat in cazul mutarii aplicatiei pe un nou server. Codul este:

<?php
 
// parametrii de acces la baza de date
$host = 'localhost';
$user = 'guest';
$pass = 'guessme';
$db = 'db3';
 
?>

Formularul va arata astfel:

Bun, acum ai afisat sondajul. Pe masura ce utilizatorii voteaza sunt generate sute de clickuri. Ce faci cu ele?

Raspunsul se afla in scriptul care este activat cand un utilizator voteaza si trimite formularul descris mai devreme. Acest script, user_submit.php, se ocupa de actualizarea numarului de voturi pentru perechea intrebare/raspuns. Iata codul:

<html>
<head><basefont face = 'Arial'></head>
<body>
 
<?php
 
if (isset($_POST['submit'])) {
 
    if (!isset($_POST['aid'])) {
        die('EROARE: Va rugam selectati una dintre variantele disponibile');
    }
 
    // include fisierul configuratie
    include('config.php');
    
   // deschide conexiunea la baza de date
   $connection = mysql_connect($host, $user, $pass) or die ('EROARE: Nu s-a putut realiza conexiunea!');
   
    // selecteaza baza de date
    mysql_select_db($db) or die('EROARE: Nu s-a putut selecta baza de date!');
    
    // actualizeaza contorul de voturi
    $query = "UPDATE answers SET acount = acount + 1 WHERE aid = ".$_POST['aid']." AND qid = ".$_POST['qid'];
    $result = mysql_query($query) or die("ERROR: $query. ".mysql_error());
 
    // inchide conexiunea
    mysql_close($connection);
 
    // tipareste mesajul de succes
    echo 'Votul tau a fost inregistrat cu succes!';
}
else {
    die('EROARE: Informatia nu a fost introdusa corect');
}
 
?>
 
</body>
</html>

Inainte de toate, codul precedent verifica variabila $_POST['aid'] pentru a vedea daca a fost selectat un raspuns. Presupunand ca ID-ul este prezent, scriptul actualizeaza baza de date pentru a incrementa numarul de voturi si afiseaza un mesaj potrivit.

Acum, priveste lista initiala a cerintelor. Da, poti taia punctul #1. In curand vei putea citi despre implementarea cerintelor ramase in urmatoarea sectiune a acestui tutorial.

Copyright © 2008-2010 E-LEARN.ro. Toate drepturile rezervate. Conceput si realizat de Neokinetics Software.