Interrogare il Database in una Custom Page

Rispondi
Avatar utente
Micogian
Amministratore
Messaggi: 104
Iscritto il: 28/11/2014, 19:32

Interrogare il Database in una Custom Page

Messaggio da Micogian »

Interrogare il Database in una Custom Page

Nel topic Creare una Custom Page ho cercato di spiegare come realizzare una pagina personalizzata (Custom Page) utilizzando la connessione di phpbb e il template header e footer per ottenere una pagina che abbia la stessa testata e piede del Forum e un corpo dove si possa inserire qualcosa di personalizzato.

Vediamo ora di approfondire questo aspetto: interrogare il Database per ottenere i dati che vogliamo visualizzare nella nostra pagina.

1) Come funziona phpbb.
Se guardiamo i file del pacchetto phpbb vediamo che ci sono dei file php nella root, altri file php nella cartella includes, altri ancora nella cartella language e infine nella cartella styles che contiene gli stili installati abbiamo le cartelle template, theme e imageset.

In sostanza avviene questo: il file php situato nella root (index.php, viewforum.php, viewtopic.php, ecc) ha il compito di interrogare il database e con apposite domande (query) ottenere una lista di dati (un array) che contiene le informazioni richieste sotto forma di Variabili (tutte rigorosamente in Maiuscolo).
Per ottenere questi dati il file php sfrutta altri file (ad esempio le function della cartella includes) e per fare questo viene inserito nel file una riga "include".

Codice: Seleziona tutto

include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
Inserire un "include" è come se avessimo inserito nel file stesso tutto il contenuto del file "incluso"
Ovviamente questo porta a semplificare ed evitare di inserire il codice di un file include in tutti i file che avrebbero bisogno di queste funzioni.

Il file php è collegato con un template che è un file html che ha il compito di ricevere i dati sotto forma di variabili e creare la pagina visualizzando il contenuto.

In pratica l'abbinamento php-template è fondamentale nel meccanismo di phpbb.

Veniamo ora allo scopo di questa Guida: realizzare una query che interroghi il database.

Il Database contiene numerose tabelle (una sessantina) tutte collegate tra loro e in pratica contenenti tutto quello che costituisce il Forum.

Le tabelle in phpbb hanno un prefisso (per default è phpbb_ ma ognuno è libero di cambiarlo per cui potrebbe essere diverso, in questa Guida consideriamo che sia phpbb_)
Avremo quindi una serie di tabelle del tipo:
- phpbb_forums = contiene l'elenco dei Forums
- phpbb_topics = contiene i dati relativi ai Topics
- phpbb_posts = contiene i dati relativi ai Posts, testi, users, data, ecc.
- phpbb_users = è l'elenco degli utenti
- phpbb_attachments = l'elenco degli allegati (gli allegati veri e propri vengono salvati nella cartella "files")
- e così per altre numerose tabelle.

Queste tabelle, attraverso il file constants.php prendono un nome che poi verrà utilizzato dal sistema.
Avremo così FORUMS_TABLE, TOPICS_TABLE, POSTS_TABLE, USERS_TABLE, ATTACHMENTS_TABLE e così via.
Teniamo ben presente questo perchè sarà questo il nome che useremo nella query.
L'elenco lo troviamo nel file includes/constants.php.

Query di interrogazione

In una Custom Page la connessione al Database viene effettuata dalle prime righe di codice inserite nel file php e quindi se creiamo una query all'interno di una Custom Page dobbiamo considerare che siamo già connessi.

La struttura base di una query di interrogazione è la seguente:

Codice: Seleziona tutto

$sql = "SELECT campo1, campo2, campo3 FROM nome_tabella WHERE campo1 = 'x' ORDER BY campo2"
Che significa "Seleziona i campi 1,2,3 della Tabella "nome_tabella" nel caso che il campo1 sia uguale a 'x' e ordina il risultato in base al campo2"

Considerando che in precedenza abbiamo detto che alle tabelle viene assegnato una Variabile tipo TOPIC_TABLE, ecc. vediamo un esempio pratico: vogliamo ottenere l'elenco dei Topics dell'utente topic_poster=10 nel forum_id=5 e voglio limitare il risultato ai primi 10 records.
Avremo:

Codice: Seleziona tutto

$sql = "SELECT topic_poster, topic_id, forum_id, topic_title
     FROM " . TOPICS_TABLE . "
     WHERE topic_poster = 10
     AND forum_id = 5
     ORDER BY topic_id DESC LIMIT 0,10";

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
     {
     $template->assign_block_vars('lista_topics',array(
     'USER_COR'      => $row['topic_poster'],
     'TOPIC_COR'   => $row['topic_id'],
     'FORUM_COR'   => $row['forum_id'],
     'TITLE_COR'   => $row['topic_title']
     ));
     }
Vediamo di spiegare la query: abbiamo chiesto di selezionare i campi "topic_poster, topic_id, forum_id, topic_title" nella tabella phpbb_topics nel caso il topic_poster sia "10" e il forum_id sia "5".
Il tutto viene messo in ordine di topic_id ma decrescente (DESC).
Inoltre il risultato è limitato ai records 0-10 della Lista con l'opzione "LIMIT 0,10".
Con il ciclo while prendiamo un record alla volta e i dati estratti li inseriamo in un array di nome "lista_topics" utilizzando le variabili USER_COR, TOPIC_COR, FORUM_COR e TITLE_COR.

Il Template, con la funzione BEGIN visualizzerà la lista cosi ottenuta:

Codice: Seleziona tutto

<!-- BEGIN lista_topics -->
{lista_topics.USER_COR}, {lista_topics.TOPIC_COR}, {lista_topics.FORUM_COR}, {lista_topics.TITLE_COR} <br>
<!-- END lista_topics -->
Le variabili phpbb devono essere sempre maiuscole e se fanno parte di un array che ha un nome questo va inserito associandolo alla variabile.
Ovviamente questo è un esempio, nel template le variabili andranno inserite associate ai relativi tag per una corretta formattazione (<table><tr><td><div>, ecc.)

Abbiamo realizzato la nostra prima query e creato una Lista degli ultimi 10 Topics dell'utente '10'.
Non abbiamo il nome dell'utente e nemmeno il nome del Forum, vediamo come fare per ottenere anche questi dati.

Abbiamo bisogno di ricavare i dati da più di una tabella, in questo caso le tabelle interessate sono topics, forums e users.
Dato che le diverse tabelle potrebbero avere campi con lo stesso nome dobbiamo individuare a quale tabella è riferito il campo che andremo a chiedere.
Questo si ottiene inserendo il nome completo "tabella_campo" (es. phpbb_users.user_id) ma il php ci consente di utilizzare delle abbreviazioni che andremo a stabilire.
Indichiamo con "ut, tt, ft" rispettivamente le tabelle users, topics e forums.
Questa sarà la query che oltre ai dati estratti in precedenza fornirà l'username e il nome del Forum.

Codice: Seleziona tutto

$sql = "SELECT tt.topic_poster, tt.topic_id, tt.forum_id, tt.topic_title,
     ft.forum_id, ft,forum_name,
     ut.user_id, ut.username
     FROM " . TOPICS_TABLE . " tt, " . FORUMS_TABLE . " ft, " . USERS_TABLE . " ut
     WHERE tt.topic_poster = 10
     AND tt.forum_id = 5
     AND tt.forum_id = ft.forum_id
     AND tt.topic_poster = ut.user_id
     ORDER BY tt.topic_id DESC LIMIT 0,10";

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
     {
     $template->assign_block_vars('lista_topics',array(
     'USER_COR'      => $row['topic_poster'],
     'TOPIC_COR'   => $row['topic_id'],
     'FORUM_COR'   => $row['forum_id'],
     'TITLE_COR'   => $row['topic_title'],
     'USERNAME_COR'   => $row['username'],
     'FORUM_NAME_COR'   => $row['forum_name']
     ));
     }
Ad ogni campo abbiamo aggiunto la sigla che abbiamo associato a ciascuna tabella, abbiamo aggiunto i controlli che stabiliscono che topic_poster della tabella topics sia lo stesso dell'user_id della tabella users, stessa cosa per il campo forum_id.
Viene così ricavato anche il nome dell'utente e il nome del Forum.

Abbiamo realizzato la nostra prima query su tabelle diverse e possiamo passare il risultato alla nostra Pagina Personalizzata che visualizzerà la Lista degli ultimo 10 Topics dell'utente 10 nel Forum 5.

Per ora termino qui, in seguito vedremo di approfondire l'argomento con esempi più complessi.
Rispondi