class DB

Classe Pubblica senza dipendenze.

I Metodi:

  1. Connect()
  2. query()
  3. fetch()
  4. result()
  5. n_table_rows()
  6. get_last_id()
  7. limit()
  8. truncate()
  9. drop()
  10. name_column()

Questa classe viene utilizzata per generare una connessione tramite PDO con un database (SqLite, MariaDb, MySql, PostgreSql).

RGL non utilizza ORM per le operazioni sul Database, ma Sql puro (in base al database configurato).

Le impostazioni di connessione sono situate all'interno del file ./Config/config.php alla voce Db connect:

'_DB_' => array(
    '_PREFIX_' => 'rgl_',
    # DB -> PDO ---------
    '_TIPO_DB_' => 'SQLITE', # MYSQL, SQLITE, PGSQL
    '_HOST_DB_' =>  str_replace("//", "/", ROOT_PATH.'/').'db/'
    '_USER_DB_' => '',
    '_PASS_DB_' => '', 
    '_NAME_DB_' => 'base.sqlite',
    '_PORT_DB_' => '',

Le impostazioni inserite fanno riferimanto ad una connessione a SqLite, ma possiamo modificarle per utilizzare altri DB.

La costante _TIPO_DB_ dovrà contenere obbligatoriamente una delle tre tipologie di dati:

  • MYSQL se la connessione avviene con un Database MySql o MariaDB
  • SQLITE se la connessione avviene con un Database SqLite
  • PGSQL se la connessione avviene con un Database PostgreSql

Note: Ho notato negli anni, che la connessione PDO con PostgreSql è più lenta rispetto la funazione nativa pg_connect(). Se avete intenzione di utilizzare PostgreSql vi consiglio di utilizzare il blocco PgSql().

Ora creiamo una nuova tabella dal nome rgl_rubrica:

CREATE TABLE rgl_rubrica (
    id       INTEGER       PRIMARY KEY AUTOINCREMENT,
    nome     VARCHAR (255),
    cognome  VARCHAR (255),
    telefono VARCHAR (255) 
);

Perfetto siamo pronti per le spiegazioni.


Connect():

Questo metodo non ha bisogno di essere richiamato ed effettua automaticamente la connessione con il Database configurato. In base alla tipologia di database collegato (MYSQL, SQLITE, PGSQL) effettuerà una connessione differente.


query():

Questo metodo effettua una query al Database, selezionando, modificando, cancellando o inserendo un dato.  Ora inseriremo alcuni dati nella nostra rubrica.

Aprire il file ./Model/testModel.php e modificare il metodo test() precedentemente creato con:

function test(){
   DB::query("INSERT INTO "._CONFIG_['_DB_']['_PREFIX_']."rubrica(nome, cognome, telefono) VALUES('Leo','Lo Tito','09876543');");
   DB::query("INSERT INTO "._CONFIG_['_DB_']['_PREFIX_']."rubrica(nome, cognome, telefono) VALUES('Leonardo','Lo Tito','12345678');");
   DB::query("INSERT INTO "._CONFIG_['_DB_']['_PREFIX_']."rubrica(nome, cognome, telefono) VALUES('Altro','nome','12345678');");
}

La costante _CONFIG_['_DB_']['_PREFIX_'] è stata definita all'interno del config, ma come sempre siamo liberi di utilizzarla oppure scrivere il prefisso della tabella direttamente all'interno della query.

Perfetto, ora apriamo il file ./View/testView.php ed inseriamo il metodo parent::test() all'interno di view_page():

function view_page(){
        parent::test(); 
        
        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'test.php',
            $GLOBALS["Rgl"],
            array(
                'hello' => '',
            )
        );
    }

Ora aggiorniamo la pagina del nostro browser e controlliamo il Database. Dovremmo aver popolato la tabella rgl_test con tre nuovi dati.

In poche parole il metodo query() effettua una richiesta al database, sia questa di Inserimento, Modifica, Cancellazione o Visualizzazione dei dati.
Effettueremo altri esempi nel corso di questo capitolo analizzando gli altri metodi.


fetch():

Questo metodo letteralmente significa "andare a prendere", quindi spiega bene il suo compito. Effettuando una query di selezione dati potremmo utilizzare questo metodo per stampare a video la nostra rubrica. Il metodo fetch() utilizza 4 tipologie per esporre il risultato:

  1. row: fetch('row')
  2. assoc: fetch('assoc')
  3. obj: fetch('obj')
  4. array: fetch('array')

row restituisce i valori con un indice numerico. È in assoluto il metodo più veloce. Array ([0] => 1 [1] => Leo [2] => Lo Tito [3] => 09876543)
assoc restituisce i valori con un indice nominativo. È più lento rispetto al row ma anche più leggibile. Array ([id] => 1 [nome] => Leo [cognome] => Lo Tito)
obj restituisce i valori con un indice nominativo ma invece di un array restituisce un oggetto. stdClass Object( [id] => 1 [nome] => Leo [cognome] => Lo Tito)
array restituisce sia un indice numerico che descrittivo. Array ([id] => 1 [0] => 1 [nome] => Leo [1] => Leo [cognome] => Lo Tito [2] => Lo Tito)

Facciamo subito un esempio concreto.

Apriamo il nostro file ./Model/testModel.php ed aggiungiamo un metodo dal nome leggi_rubrica():

function leggi_rubrica(){
    DB::query("SELECT * FROM "._CONFIG_['_DB_']['_PREFIX_']."rubrica");
    $R = DB::fetch('assoc');
    return $R;
}

Perfetto. Ora passiamo alla View:

function view_page(){
        $rubrica = parent::leggi_rubrica();

        ### stampo la pagina dei contenuti
        KuiperBelt::get_template(
            'test.php',
            $GLOBALS["Rgl"],
            array(
                'rubrica' => $rubrica,
            )
        );
    }

Infine modifichiamo anche il template:

<code class="language-html">
    <?php print_r($_['rubrica']) ?>
</code>

Aggiornando la pagina, dovremmo visualizzare qualcosa di simile:

Array ( [id] => 1 [nome] => Leo [cognome] => Lo Tito [telefono] => 09876543 )

Qualcuno più attento si sarà già chiesto... ma i dati non erano tre? Bene, questo accade perchè il fetch() così utilizzato preleva solo la prima richiesta. Per poter visualizzare tutti i dati dovremmo inserirlo in un ciclo. Armiamoci di pazienza e modifichiamo nuovamente il model:

function leggi_rubrica(){
    DB::query("SELECT * FROM "._CONFIG_['_DB_']['_PREFIX_']."rubrica");
    $R = array();
    while($V = DB::fetch('assoc')) {
        $R[] = $V;
    }
    return $R;
}

Bene, ora sembra tutto più coerente! Per facilitare tale operazione è stato creato un metodo apposito result().


result():

Questo metodo semplifica la scrittura del codice per effettuare "Selezioni" dal Database.

Ancora una volta modifichiamo il file model:

function leggi_rubrica(){
    DB::query("SELECT * FROM "._CONFIG_['_DB_']['_PREFIX_']."rubrica");
    $R = DB::result();
    return $R;
}

Semplice vero? Abbiamo ridotto il nostro codice ottenendo il medesimo risultato.


n_table_rows():

Questo metodo conta il numero di righe presenti in una tabella. Possiamo usare il metodo in due modalità la prima più semplice:

function numero_colonne(){
    $n = DB::n_table_rows(_CONFIG_['_DB_']['_PREFIX_'].'rubrica');
    return $n;
}

Restituisce il numero complessivo delle righe delle righe della tabella rgl_rubrica;

L'altra modalità un pochino più complessa:

function numero_colonne(){
    $n = DB::n_table_rows(_CONFIG_['_DB_']['_PREFIX_'].'rubrica', array("count"=>"id", "where"=>" nome LIKE '%leo%'"));
    echo $n;
}

Dovrebbe fornire il numero di righe della tabella rgl_rubrica il cui nome contiene leo; Se avete seguito la guida dovrebbe apparire il numero 2.

Ora analizziamo in dettaglio il secondo elemento del metodo.

Per prima cosa si tratta di un array, con chiavi obbligatorie:

  • count
  • where

La chiave count dovrà avere come valore un nome di una delle colonne della tabella richiesta. In questo caso abbiaro richiesto id;

La chiave where dovrà avere una sezione di ricerca della query, in questo caso abbiamo richiesto di estrarre tutti i nomi che contenessero la parola leo al loro interno.

Per essere più chiari, nulla ci vieta di scrivere qualcosa di simile:

nome = 'leo'

oppure

id IN(1,3)

 Spero sia stato più chiaro... il mio consiglio... sperimentate!!!


get_last_id():

Il metodo restituisce l'ultimo id in ordine decrescente di una tabella. Potremmo utilizzarlo ad esempio per estrarre l'id dell'ultimo dato inserito:

function read_last_id(){
    DB::query("INSERT INTO "._CONFIG_['_DB_']['_PREFIX_']."rubrica(nome, cognome, telefono) VALUES('xxx','yyy','12345678');");
    $last_id = DB::get_last_id('id');
    echo $last_id;
}

Dovrebbe essere facile capire cosa è stato fatto.


limit():

Il metodo permette di inserire un limite numerico nella restituzione dei dati. In sostanza aggiunge per l'appunto il Valore LIMIT alla query.

function leggi_rubrica(){
    DB::query("SELECT * FROM "._CONFIG_['_DB_']['_PREFIX_']."rubrica".DB::limit('0,2'));
    $R = DB::result();
    return $R;
}

Questo ci permette di utilizzare il LIMIT sia che si tratti di MariaDB (MySql), sia che si tratti di PostgreSql, sia per SqLite utilizzando sempre lo stesso metodo e stessa scrittura. 


truncate():

Semplicemente questo metodo effettua un truncate (svuotamento) della tabella selezionata.

Potremmo utilizzarlo in due modi. La prima permette di resettare l'id della tabella:

DB::truncate("._CONFIG_['_DB_']['_PREFIX_']."rubriba");

La seconda opzione permette di svuotare la tabella ma lasciare l'id così come impostato attualmente:

DB::truncate("._CONFIG_['_DB_']['_PREFIX_']."rubriba", 0);

Tutto qui!


drop():

Questo metodo, cancella la tabella specificata.

DB::drop("._CONFIG_['_DB_']['_PREFIX_']."rubrica");


name_column():

Ultimo, ma non meno importante metodo, ci permette di conoscere il nome delle colonne di una tabella:

function nomi_colonne(){
    $nome = DB::name_column("._CONFIG_['_DB_']['_PREFIX_']."rubrica");
    print_r($nome);
}

Abbiamo terminato questo capitolo... è stato lungo?


Lista dei Blocchi