Creazione di un sondaggio dinamico con jQuery e PHP

Quando unisci alcune funzionalità nette, fornite da PHP con l'intelligenza di jQuery, puoi ottenere risultati davvero interessanti. In questo tutorial creeremo un sondaggio usando PHP e XHTML, quindi useremo alcuni effetti Ajax di jQuery per eliminare la necessità di un aggiornamento della pagina e per dargli un bel po 'di animazione.

  1. HTML
  2. PHP
    1. introduzione
    2. poll_default ()
    3. poll_submit ()
    4. poll_return_results ()
    5. poll_ajax ()
  3. CSS
  4. Javascript
    1. introduzione
    2. formProcess ()
    3. loadResults ()
    4. animateResults ()

HTML

Prendiamo il nostro impostare:

   
  • style.css manterrà il codice CSS.
  • jquery.js è la libreria jQuery di base.
  • jquery.cookie.js è un plugin di Klaus Hartl per aggiungere la manipolazione dei cookie a jQuery.
  • poll.js avrà il Javascript che rende dinamico il sondaggio.

Successivamente, creeremo un semplice modulo di sondaggio:

Sondaggio

Scegli il tuo framework Javascript preferito:








Questo modulo verrà elaborato dal PHP per ora, e quando avremo il Javascript in esecuzione, da jQuery. PHP e Javascript sono progettati per estrarre l'ID opzione dal tag value. è solo uno spazio con codifica di entità HTML, e è una freccia: →.


PHP

introduzione

Se Javascript è disabilitato, il PHP:

  1. Prendi richieste GET / POST dal modulo
  2. Imposta / controlla un cookie
  3. Assicurati che la richiesta provenga da un IP univoco
  4. Memorizza il voto in un file DB flat
  5. Restituisci i risultati inclusi con un file HTML

Se Javascript è abilitato, il PHP:

  1. Prendi richieste GET / POST dal Javascript
  2. Assicurati che la richiesta provenga da un IP univoco
  3. Memorizza il voto in un file DB flat
  4. Restituisci i risultati come JSON

Per il file flat DB utilizzeremo un pacchetto scritto da Luke Plant.

Innanzitutto, abbiamo bisogno di un array con i nomi e gli ID delle opzioni di sondaggio:

 

Il pacchetto flatfile utilizza numeri per gli identificatori di colonna, quindi consente di impostare alcune costanti per convertirle in nomi:

define ('OPT_ID', 0); define ('OPT_TITLE', 1); define ('OPT_VOTES', 2);

Quando il modulo viene inviato, PHP deve sapere quale file inserire e restituire i risultati, quindi impostiamo un'altra costante:

define ('HTML_FILE', 'index.html');

Dobbiamo includere flatfile.php e inizializzare un oggetto di database:

require_once ( 'flatfile.php'); $ db = new Flatfile ();

I file flat sono solo file di testo memorizzati nella directory dei dati:

$ db-> datadir = 'data /'; define ('VOTE_DB', 'votes.txt'); define ('IP_DB', 'ips.txt');

Se otteniamo una richiesta con il parametro del sondaggio, è la forma statica, quindi la elaboriamo. Se la richiesta ha un parametro di voto, è una richiesta Ajax. Altrimenti, restituiamo semplicemente il HTML_FILE.

if ($ _GET ['poll'] || $ _POST ['poll']) poll_submit ();  else if ($ _GET ['vote'] || $ _POST ['vote']) poll_ajax ();  else poll_default (); 

poll_default ()

function poll_default () global $ db; $ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']); if (! isset ($ _ COOKIE ['vote_id']) && empty ($ ip_result)) stampa file_get_contents (HTML_FILE);  else poll_return_results ($ _ COOKIE ['vote_id']); 

poll_default () elabora le richieste direttamente allo script senza richieste GET / POST valide.

Il globale linea rende il $ db oggetto disponibile nell'ambito della funzione.

Lo script tiene traccia degli IP univoci per assicurarsi di poter votare solo una volta, quindi eseguiamo una query per verificare se si trova nel DB:

$ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']);

Se non abbiamo un cookie e la query IP risulta vuota, il client non ha ancora votato, quindi possiamo semplicemente inviare il file HTML che contiene il modulo. Altrimenti, inviamo semplicemente i risultati:

if (! isset ($ _ COOKIE ['vote_id']) && empty ($ ip_result)) stampa file_get_contents (HTML_FILE);  else poll_return_results ($ _ COOKIE ['vote_id']); 

poll_submit ()

function poll_submit () global $ db; opzioni globali $; $ id = $ _GET ['poll'] || $ _POST [ 'poll']; $ id = str_replace ("opt", ", $ id); $ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']); if (! isset ($ _ COOKIE ['vote_id']) && empty ($ ip_result)) $ row = $ db-> selectUnique (VOTE_DB, OPT_ID, $ id); if (! empty ($ row)) $ ip [0] = $ _SERVER ['REMOTE_ADDR']; $ db-> insert (IP_DB, $ ip); setcookie ("vote_id", $ id, time () + 31556926); $ new_votes = $ row [OPT_VOTES] +1; $ db-> updateSetWhere (VOTE_DB, array (OPT_VOTES = > $ new_votes), nuovo SimpleWhereClause (OPT_ID, '=', $ id)); poll_return_results ($ id); else if ($ options [$ id]) $ ip [0] = $ _SERVER ['REMOTE_ADDR'] ; $ db-> insert (IP_DB, $ ip); setcookie ("vote_id", $ id, time () + 31556926); $ new_row [OPT_ID] = $ id; $ new_row [OPT_TITLE] = $ opzioni [$ id] ; $ new_row [OPT_VOTES] = 1; $ db-> insert (VOTE_DB, $ new_row); poll_return_results ($ id); else poll_return_results ($ id);

poll_submit () prende la forma di sottomissione, controlla se il cliente ha già votato, e quindi aggiorna il DB con il voto.

Queste linee ottengono l'ID dell'opzione selezionata e impostate $ id ad esso:

$ id = $ _GET ['poll'] || $ _POST [ 'poll']; $ id = str_replace ("opt", ", $ id);

Dobbiamo verificare se l'opzione è ancora nel DB:

$ row = $ db-> selectUnique (VOTE_DB, OPT_ID, $ id);

Se è nel DB (risultato non vuoto), dobbiamo eseguire un updateSetWhere (). Se non lo è, dobbiamo fare un inserire():

if (! empty ($ row)) $ new_votes = $ row [OPT_VOTES] +1; $ db-> updateSetWhere (VOTE_DB, array (OPT_VOTES => $ new_votes), nuovo SimpleWhereClause (OPT_ID, '=', $ id)); poll_return_results ($ id);  else if ($ options [$ id]) $ new_row [OPT_ID] = $ id; $ new_row [OPT_TITLE] = $ opzioni [$ id]; $ new_row [OPT_VOTES] = 1; $ db-> insert (VOTE_DB, $ new_row); poll_return_results ($ id); 

In ogni caso, dobbiamo inserire l'IP nel DB e impostare un cookie (scade tra un anno):

$ ip [0] = $ _SERVER ['REMOTE_ADDR']; $ db-> insert (IP_DB, $ ip); setcookie ("vote_id", $ id, time () + 31556926);

poll_return_results ()

function poll_return_results ($ id = NULL) global $ db; $ html = file_get_contents (HTML_FILE); $ results_html = "

Risultati del sondaggio

\ n
\ n "; $ rows = $ db-> selectWhere (VOTE_DB, nuovo SimpleWhereClause (OPT_ID,"! = ", 0), -1, nuovo OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON)); foreach ($ rows as $ row) $ total_votes = $ row [OPT_VOTES] + $ total_votes; foreach ($ rows as $ row) $ percent = round (($ row [OPT_VOTES] / $ total_votes) * 100); if (! $ row [OPT_ID] == $ id) $ results_html. = "
". $ row [OPT_TITLE]."
$% Per cento\ n "; else $ results_html. ="
". $ row [OPT_TITLE]."
$% Per cento\ n "; $ results_html. ="

Voti totali: ". $ Total_votes".

\ n "; $ results_regex = '/
(. *?)<\/div>/S'; $ return_html = preg_replace ($ results_regex, $ results_html, $ html); stampa $ return_html;

poll_return_results () genera i risultati del sondaggio, prende il file HTML, sostituisce il modulo con i risultati e restituisce il file al client.

Per prima cosa, prendiamo il file HTML e impostiamo $ html ad esso:

$ html = file_get_contents (HTML_FILE);

Successivamente, iniziamo la struttura HTML dei risultati:

$ results_html = "

Risultati del sondaggio

\ n
\ N ";

Per creare l'HTML dei risultati dobbiamo ottenere tutte le righe (opzioni) dal DB ordinate per numero di voti:

$ rows = $ db-> selectWhere (VOTE_DB, new SimpleWhereClause (OPT_ID, "! =", 0), -1, new OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON));

Abbiamo anche bisogno dei voti totali per calcolare le percentuali:

foreach ($ rows as $ row) $ total_votes = $ row [OPT_VOTES] + $ total_votes; 

Successivamente, calcoliamo la percentuale di voti che l'opzione corrente ha:

foreach ($ rows as $ row) $ percent = round (($ row [OPT_VOTES] / $ total_votes) * 100);

L'HTML per i risultati sarà un elenco di definizioni (

) in stile CSS per creare grafici a barre:

$ results_html. = "
". $ row [OPT_TITLE]."
$% Per cento\ N ";

Inoltre, dovremmo controllare se l'opzione corrente è quella scelta dal cliente e cambiare il colore:

if (! $ row [OPT_ID] == $ id)  ​​else $ results_html. = "
". $ row [OPT_TITLE]."
$% Per cento\ n ";

Qui, aggiungiamo un conteggio totale dei voti e chiudiamo i tag html:

$ results_html. = "

Voti totali: ". $ Total_votes".

\ N ";

Questa è una regex che trova il sondaggio-container

:

$ results_regex = '/
(. *?)<\/div>/S';

L'ultimo passaggio in questa funzione è sostituire il modulo di sondaggio con i risultati utilizzando la regex e restituire il risultato:

$ return_html = preg_replace ($ results_regex, $ results_html, $ html); stampa $ return_html;

poll_ajax ()

function poll_ajax () global $ db; opzioni globali $; $ id = $ _GET ['vote'] || $ _POST [ 'voto']; $ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']); if (vuoto ($ ip_result)) $ ip [0] = $ _SERVER ['REMOTE_ADDR']; $ db-> insert (IP_DB, $ ip); if ($ id! = 'none') $ row = $ db-> selectUnique (VOTE_DB, OPT_ID, $ id); if (! empty ($ row)) $ new_votes = $ row [OPT_VOTES] +1; $ db-> updateSetWhere (VOTE_DB, array (OPT_VOTES => $ new_votes), nuovo SimpleWhereClause (OPT_ID, '=', $ id));  else if ($ options [$ id]) $ new_row [OPT_ID] = $ id; $ new_row [OPT_TITLE] = $ opzioni [$ id]; $ new_row [OPT_VOTES] = 1; $ db-> insert (VOTE_DB, $ new_row);  $ rows = $ db-> selectWhere (VOTE_DB, new SimpleWhereClause (OPT_ID, "! =", 0), -1, new OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON)); stampa json_encode ($ rows); 

poll_ajax () accetta una richiesta dal Javascript, aggiunge il voto al DB e restituisce i risultati come JSON.

Ci sono alcune linee di codice che sono diverse da poll_submit (). Il primo controlla se Javascript vuole solo i risultati, e nessun voto dovrebbe essere contato:

if ($ id! = 'none')

Le altre due linee selezionano l'intero DB e lo restituiscono come JSON:

$ rows = $ db-> selectWhere (VOTE_DB, new SimpleWhereClause (OPT_ID, "! =", 0), -1, new OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON)); stampa json_encode ($ rows);

CSS

.graph width: 250px; posizione: relativa; a destra: 30 px;  .bar-title position: relativo; fluttuare: a sinistra; larghezza: 104 px; altezza della linea: 20px; margin-right: 17px; font-weight: bold; allineamento del testo: giusto;  .bar-container position: relative; fluttuare: a sinistra; larghezza: 110 px; altezza: 10px; margine: 0px 0px 15px;  .bar-container div background-color: # cc4400; altezza: 20px;  .bar-container strong position: absolute; a destra: -32px; inizio: 0px; overflow: nascosto;  # poll-results p text-align: center; 

Questo CSS definisce i risultati restituiti da PHP o Javascript.


Javascript

introduzione

Il Javascript intercetterà il pulsante di invio, invierà il voto con Ajax e animerà i risultati.

Innanzitutto, alcune variabili globali. Dovresti riconoscere i primi tre dal PHP. votedID memorizza l'ID dell'opzione scelta dal cliente.

var OPT_ID = 0; var OPT_TITLE = 1; var OPT_VOTES = 2; var votatoID;

Ora abbiamo bisogno di una funzione jQuery ready che viene eseguita al caricamento della pagina:

$ (Document) .ready (function () 

All'interno di tale funzione registriamo il gestore per il pulsante di votazione che verrà eseguito formProcess quando è attivato:

. $ ( "# Sondaggio") presentare (formProcess);

Dobbiamo anche verificare se i risultati

esiste e anima i risultati se lo fa:

if ($ ("# poll-results"). length> 0) animateResults (); 

Se abbiamo un cookie dovremmo saltare direttamente alla generazione dei risultati perché l'utente ha già votato. Per fare ciò abbiamo bisogno di eliminare il modulo di sondaggio, ottenere l'id dal cookie, prendere i risultati dal PHP e passarli a loadResults ().

if ($ .cookie ('vote_id')) $ ("# poll-container"). empty (); votatoID = $ .cookie ('vote_id'); $ GetJSON ( "poll.php voto = nessuno?", LoadResults); 

formProcess ()

function formProcess (event) event.preventDefault (); var id = $ ("input [@ name = 'poll']: controllato"). attr ("valore"); id = id.replace ("opt", "); $ (" # poll-container "). fadeOut (" slow ", function () $ (this) .empty (); votatoID = id; $ .getJSON ( "poll.php? vote =" + id, loadResults); $ .cookie ('vote_id', id, expires: 365););

formProcess () viene chiamato dall'evento submit che lo passa un oggetto evento. Impedisce al modulo di eseguire un invio normale, controlla / imposta i cookie, esegue invece un invio Ajax, quindi chiama loadResults () per convertire i risultati in HTML.

Innanzitutto, dobbiamo impedire l'azione predefinita (invio del modulo):

event.preventDefault ();

Successivamente, otteniamo l'ID dall'opzione attualmente selezionata:

var id = $ ("input [@ name = 'poll']: controllato"). attr ("valore"); id = id.replace ("opt", ");

Ingresso [@ 'poll' name =]: selezionata è un selettore jQuery che seleziona a con un attributo di name = 'sondaggio' quello è controllato. attr ( "valore") ottiene il valore dell'oggetto che nel nostro caso è optaren dove n è l'ID dell'opzione.

Ora che abbiamo l'ID, possiamo elaborarlo. Per iniziare, dissolviamo il modulo di polling e configuriamo una funzione anonima come callback che viene eseguita quando la dissolvenza è completa. Le animazioni non mettono in pausa lo script, quindi accadono cose strane se non lo fai in questo modo.

$ ( "# Sondaggio-contenitore"). FadeOut ( "lento", function () 

Dopo che è scomparso, possiamo cancellare il modulo dal DOM usando vuoto():

$ (This) .empty ();

In questo caso, $ (This) è una scorciatoia jQuery per l'elemento DOM a cui è stata applicata la dissolvenza.

jQuery ha alcune altre funzioni di scelta rapida, tra cui $ GetJSON () quale GET richiede un oggetto JSON. Quando abbiamo l'oggetto, chiamiamo loadResults () con esso:

$ GetJSON ( "? Poll.php votare =" + ID, loadResults);

L'ultima cosa da fare è impostare il cookie:

$ .cookie ('vote_id', id, expires: 365);

loadResults ()

function loadResults (data) var total_votes = 0; var percento; for (id in data) total_votes = total_votes + parseInt (data [id] [OPT_VOTES]);  var results_html = "

Risultati del sondaggio

\ n
\ n "; for (id in data) percent = Math.round ((parseInt (data [id] [OPT_VOTES]) / parseInt (total_votes)) * 100); if (data [id] [OPT_ID]! == votatoID) results_html = results_html + "
"+ Dati [id] [OPT_TITLE] +"
"+ + Per cento" %\ n "; else results_html = results_html +"
"+ Dati [id] [OPT_TITLE] +"
"+ + Per cento" %\ n "; results_html = results_html +"

Voti totali: "+ total_votes +"

\ n "; $ (" # poll-container "). append (results_html) .fadeIn (" slow ", function () animateResults (););

loadResults () è chiamato da $ GetJSON () e viene passato un oggetto JSON contenente il DB dei risultati. È praticamente la stessa di PHP poll_return_results () con alcune eccezioni. La prima differenza è che impostiamo il larghezza su tutte le barre allo 0% perché li animeremo. L'altra differenza è che stiamo usando un jQuery aggiungere() invece di regex per mostrare i risultati. Dopo che i risultati si sono attenuati, la funzione chiama animateResults ().

animateResults ()

function animateResults () $ ("# poll-results div"). each (function () var percentage = $ (this) .next (). text (); $ (this) .css (width: "0 % "). animate (width: percentage, 'slow');); 

animateResults () scorre attraverso ciascuna delle barre e anima il larghezza proprietà basata sulla percentuale.

ogni() è una funzione jQuery che scorre attraverso ogni elemento selezionato:

$ ("# poll-results div"). each (function () 

Per prima cosa, impostiamo la percentuale sul testo dell'elemento accanto alla barra che è il contenente la percentuale.

var percentage = $ (this) .next (). text ();

Quindi ci assicuriamo che il larghezza è impostato su 0% e lo anima:

$ (this) .css (width: "0%"). animate (width: percentage, 'slow');
Codice