Login
Nome utente:

Password:

Ricorda



Recupero password

Registrati!
Navigazione
Utenti Online
4 utente(i) online
(1 utente(i) in Tutorial)

Iscritti: 0
Ospiti: 4

altro...
Tutorial :: Sviluppo e Hack :: Sviluppo moduli

Interagiamo con il database di XOOPS (Prima parte)


Interagiamo con il database di XOOPS (Prima parte)
dantom
Profilo Autore: dantom
Gestore del portale XoopsIT, lavora da anni nel campo della produzione web ed in particolare con XOOPS.

E' uno dei più grandi specialisti XOOPS in Italia.

Forse non tutti sanno a cosa serve il file include/common.php(incluso nel mainfile.php). Brevemente, potremo dire che ci prepara belli e pronti, degli oggetti che possiamo sfruttare per richiedere servizi al kernel di xoops per le nostre pagine. Un qualcosa di simile alle chiamate di sistema di linux. Sono diversi questi oggetti..e sono molto comodi da usare. In questo tutorial ci occuperemo dell'oggetto $xoopsDB per l'interazione col database di xoops.

Obbiettivi tutorial
Conoscere l'oggetto $xoopsDB per gestire query SQL che interagiscono con xoops-MySQL. Si imparerà a gestire gli errori, a creare query semplificate e query complesse con due tabelle.

Preconoscenze
Per rendere proficua la lettura è consigliata una conoscenza minima di php (variabili, array, cicli) e una infarinatura sui concetti di classe e oggetto. Ottime guide per principianti a mio parare le trovate:
1 Sul sito html.it http://freephp.html.it/guide/lezioni.asp?idguida=10 .
2 Appunti fi informatica libera http://www.pluto.linux.it/ildp/Appunt ... /a2316.html#almltitle3383

Per quanto riguarda il linguaggio SQL:
1 - Conoscenza minima del linguaggio SQL per interagire col database. (vedi tutorial di Defkon1 http://www.xoopsit.net/modules/soapbox/article.php?articleID=28 )

Materiale
Un portale xoops installato in locale "da pasticciare" con una cartella /lab/database create ad hoc nella root. All'interno della cartella database creeremo di volta in volta i file di esempio da "runnare".

Un esempio pratico e funzionante
Subito un esempio pratico che estrae i primi 3 record dalla tabella xoops_users e ne visualizza il nickname per ciascun iscritto. Creiamo un nuovo file query.php e copiamo e incolliamo codice sottostante. In questo esempio il file risiede nella cartella /lab/database/query.php.Il file sarà raggiungibile a questo indirizzo: http://localhost/xoops/lab/database/query.php .

// File: query.php

/*Dal tutorial "Interagiamo col database di xoops"
Esempio 1: Estrazione di tutti i campi dei primi 3 record dalla tabella users di xoops*/

//richiama $xoopsDB e la connessione al database di Xoops (oltre a fare mille altre cose )
include '../../mainfile.php';

// Fase 1 - Costruzione query
$sql = "SELECT * FROM ".$xoopsDB ->prefix ("users")." LIMIT 0, 3";

//Fase 2 - Esecuzione query
$rs
= $xoopsDB ->query ($sql );

//Estrazione del record e memorizzazione in un array associativo
//Ciclo while per stampare tutti i record indicati nella query (in questo caso 3)
while ($user_arr = $xoopsDB ->fetchArray ($rs ))
{
//Ciclo while sui record della tabella
echo $user_arr['uid']." ".$user_arr['uname']." ".$user_arr['email']."<br>".
}

?>

1 - Se le directory sono state create come indicato
2 - Se il codice è stato copiato e incollato senza errori...
...e andate al seguente indirizzo http://localhost/tuonomesitodixoops/lab/database/query.php .

dovrebbe funzionare!

In questo esempio vengono usati tre metodi dell'oggetto: prefix() , query() , fetchArray() . Per ciascuna pagina nuova che andate a creare per usare $xoopsDB, ci sono delle regole da rispettare.
1 - La prima è che la pagina deve avere estensione .php.
2 - Deve avere incluso il mainfile.php.

Perchè mainfile.php? Perchè come credo gia sappiate, mainfile provvedere a creare una connessione persistente al database di xoops (persistente significa che tra una query e l'altra la connessione non viene chiusa ma rimane aperta ed è eseguita con la funzione mysql_pconnect(), p sta per persistent connection) /include/common.php invece, (incluso nel mainfile.php), crea l'oggetto $xoopsDB e lo rende disponibile a tutte le pagine create ex-novo. L'oggetto viene creato alla riga 82 del file common.php:

//file common.php riga 82
$xoopsDB =& XoopsDatabaseFactory::
getDatabaseConnection();


Per ogni pagina nuova, quindi, , abbiamo già bella e pronta una connessione permanente al database...da sfruttare a piene mani con l'oggetto $xoopsDB.

Vediamo come costruire passo passo query.php

include '../../mainfile.php';

/*Qui posso già usare l'oggetto $xoopsDB...e interagire col database creando
direttamente le query senza preoccuparmi della connessione e della selezione del database*/



1 - Creiamo una query sql
Ecco una query per iniziare, la si crea e la si memorizza in una variabile php che potete chiamare come volete, solitamente è $query oppure $sql o $rs. E' una query molto semplice e intuitiva:

$sql = "SELECT * FROM xoops_users";

Si usa l'istruzione SELECT * FROM per estrarre l'intero contenuto della tabella xoops_users (* sta per tutti i campi della tabella). Ora che nella variabile $sql è memorizzata la query, diamola in pasto all'oggetto $xoopsDB, nel quale è già attiva una connessione al server MySQL e la selezione del database di xoops. Lanciamo quindi la query:

$result = $xoopsDB ->query ($sql );

In $result viene memorizzato un numero univoco che identifica la query appena eseguita. Se vale 1, la query è stata eseguita con successo, in caso contrario c'è qualche problema. Tratteremo la gestione degli errori più avanti. Continuiamo nella nostra operazione controllando semplicemente se la query ha avuto successo. In questo caso proseguiamo nell'estrazione dei risultati, altrimenti terminiamo lo script:

if (!$result)
{
echo "Errore durante l'esecuzione della query! ".$sql;
exit();
}else {
//La query ha avuto successo
......codice...
}


Per estrarre il recordset abbiamo due metodi a disposizione fetchArray e fetchRow :
Con fetchArray:
$myrow = $xoopsDB ->fetchArray ($result ); //array associativo
echo $myrow['uname'] ; //stamperà dan-tom ad esempio

Con fetchRow:
list ( $uid, $uname, $email) = $xoopsDB ->fetchRow ($result); //array enumerato
echo $uid; //stampo lo uid dell'utente

L'uso dell'uno o dell'altro dipende da ciò che si vuole fare. fetchRow è leggermene più veloce. fetchArray è più comodo poichè i suoi indici sono stringhe.
Per pura curiosità statistica, ho provato a cercare le ricorrenze di $xoopsDB->fetchRow e di $xoopsDB->fetchArray in un sito xoopsato con installati anche svariati moduli (una cinquantina....). Ho ottenuto i seguenti responsi:

1 - $xoopsDB->fetchArray 333 risultati
2 - $xoopsDB->fetchRow 714 risultati

Ma vediamo il nostro script e concludiamolo:

Per comodità lo scriverò con entrambi i metodi
Con $xoopsDB->fetchArray

//ESEMPIO CON $xoopsDB->fetchArray

include '../../mainfile.php';

$sql = "SELECT * FROM xoops_users";
$result = $xoopsDB ->query ($sql );
if (!$result)
{
echo "Errore durante l'esecuzione della query ".$sql;
exit ();
}else{
//La query ha avuto successo
while ($myrow = $xoopsDB ->fetchArray ($result))
{
echo $myrow['uid']." ".$myrow['uname']." ".$myrow['email']."<br>";
}
}


Con $xoopsDB->fetchArray
In questo caso, usiamo la funzione list con fetchRow

//ESEMPIO CON $xoopsDB->fetchRow

include '../../mainfile.php';

$sql = "SELECT * FROM xoops_users";
$result = $xoopsDB ->query ($sql );

if (!$result)
{
echo "Errore durante l'esecuzione della query ".$sql;
exit ();
}else{
//La query ha avuto successo
while (list ( $uid,$uname,$email) = $xoopsDB ->fetchRow ($result))
{
echo $uid ." ".$uname." ".$email."<br>";
}
}
?>

ERRATA CORRIGE:Mi hanno fatto notare che l'array che stampo non è user_arr ma $myrow. Grazie pèer la segnalazione.

Questo è tutto per un primo approccio. Sarebbe interessante, prima di passare alla seconda parte, avere dei feedback trammite i commenti qui sotto, dopo che avete fatto delle prove. Sono a disposizione per chiarimenti. Vi prego cortesemente di avvisarmi nel caso avessi scritto strafalcioni
ALLA PROX!

Buon xoops a tutti!

Dantom

<< Un sito XOOPS ad abbonamento (Prima parte) Interagiamo con il database di XOOPS (Seconda parte) >>

API: RSS | RDF | ATOM
Copyright© dantom & Xoops Italia
I commenti sono di proprietà degli autori. Si declina ogni responsibilità sul loro contenuto.

Autore Contenuto
huff01
Data di invio: 5/9/2012 11:16  Aggiornato: 5/9/2012 11:16
Senior
Iscritto: 5/9/2012
Da:
Inviati: 164
 bvlgari fake watches
armani swiss watch armani swiss watch Breitling Chrono-Matic 49 watches Breitling Chrono-Matic 49 watches advanced method of style. swiss emporio armani replica watches swiss emporio armani replica watches Carrera Calibre 1887 Chronograph Photographs GalleryPierre DeRoche can be a firm having an amazing custom at the rear of it, a model which has handled the view production market not like a enterprise, but for a manifestation of peoples ability in direction of reaching technical excellence and producing ground breaking timepieces as evidence of mens intellectual electricity Replica Armani Swiss Watches Replica Armani Swiss Watches . A timepiece can be a refined instrument which has arrive for being thought to be over only a valuable instrument replica watches Audemars Piguet replica watches Audemars Piguet , bvlgari fake watches bvlgari fake watches but much more being an artwork piece replica watches for sale replica watches for sale , the observe producing business currently being thought to be an artwork certainly Visualizza immagine originale . fake watches for sale fake watches for sale audemars piguet swiss watch audemars piguet swiss watch Pierre DeRoche is legendary for numerous of its creations which have managed to interrupt the frontiers in the look at creating custom, with their extremely challenging mechanisms and intensely

Autore Contenuto
huff01
Data di invio: 12/9/2012 2:37  Aggiornato: 12/9/2012 2:37
Senior
Iscritto: 5/9/2012
Da:
Inviati: 164
 replica concord watches
here from Haitian capital PortauPrince replica watches fake rolex watch for sale fake rolex watch for sale philip stein replica watches philip stein replica watches , Mulet said that the UN Stabilization Mission in Haiti (Minustah) is only helping victims of cholera in Haiti, which has killed at least 1, 186 people in the previous weeks. The UN official explained that the violent protests in PortauPrince and in Cabo Haitiano, the second largest city, had prevented doctors from attending to the thousands who are affected by the epidemic. replica glashutte watches replica glashutte watches aigner replica aigner replica Visualizza immagine originale Also on Friday, the World Health Organization (WHO) said that the recent riots in Haiti are undermining international efforts to control the cholera outbreak there, replica guess watches replica guess watches replica iwc replica iwc and health facilities in the country may have to halt services due to blocked supply deliveries. The violent protests against Minustah have killed two people in Cap Haitien in northern Haiti, replica rolex replica rolex and one in
Sostieni XoopsItalia!
Ultimi Tutorial
Ultime Traduzioni
XOOPS ITALIA © 2002-2012 - Powered by XOOPS