4 commenti CodeIgniter, tutorial, php

Un ottimo modo per imparare l'uso del binomio php-mysql è, a mio parere, la realizzazione di un guestbook.

In questo secondo articolo dedicato a Code Igniter vedremo, quindi, come realizzare questo tipo di applicativo con questo framework soffermandoci su aspetti che hanno valenza generale e possoro riguardare qualsiasi altro applicativo.

 

In particolare questo ci consentirà di soffermarci su alcuni aspetti esseziali tipici dello sviluppo di applicativi in php:

  • istanza e utilizzo di classi e librerie;
  • connessione e interazione con un database (non necessariamente MySql);
  • gestione dei form (costruzione del form, variabili POST, validazione ed altro).

 

Nel caso specifico di questo guestbook molto semplice vedremo in particolare come mostrare i commenti salvati nel database e come inserirne di nuovi tramite un form.

 

I commenti di questo guestbook, ovviamente, verranno salvati in una tabella del db. Inoltre, in questa fase per eseguire i nostri primi test inseriremo alcuni commenti:

CREATE TABLE IF NOT EXISTS `guestbook` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `website` varchar(255) NOT NULL,
  `comment` text NOT NULL,
  `time_insert` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Dump dei dati per la tabella `guestbook`
--

INSERT INTO `guestbook` (`id`, `name`, `email`, `website`, `comment`, `time_insert`) VALUES
(1, 'pippo', 'pippo@email.it', 'http://www.pippo.it', 'ciao io sono pippo e questo è il mio commento,', '2011-10-18 12:27:33'),
(2, 'pluto', 'pluto@email.it', 'http://www.pluto.it', 'ciao io sono pluto e ti faccio i complimenti per questo guestbook', '2011-11-02 00:00:00');

 

Load e autoload

Anzitutto per interagire con il database dovremo impostare i parametri di connessione all'interno del file /application/config/database.php secondo quanto già detto nel precedente articolo introduttivo a CodeIgniter.

 

A questo punto per connetterci al database ed interagire con esso dovremo eseguire il load del classe Database. Con la sua istanza avremo la connessione a mysql attivata e potremo utilizzare i metodi attraversto $this->db->nome_metodo().

L'istanza e l'utilizzo dei metodi avverà attraverso i seguenti comandi:

 

// load database
$this->load->database();
// example metods
$this->db->nome_metodo();

 

Tuttavia, questo modo di istanziare la connessione al database non è "conveniente".

 

In molti degli applicativi che svilupperemo ci saranno classi e librerie di funzioni (native di code igniter, da noi visluppate o di terze parti) che potrebbero avere un uso estremamente frequente.

Questo comporterebbe che ogni qual volta si voglia utilizzarle dovremo eseguire il load di queste.

 

Per questi scopi CodeIgniter prevede il file di configurazione di autoload  /application/config/autoload.php in cui possiamo indicare quali classi, librerie e risorse dovranno essere inizializzate ad ogni richiesta.

In questo modo non sarà necessario eseguire il load di queste ad ogni occorrenza ma potranno essere usate direttamente.

 

In tale file troveremo (fra molti righi di commenti) 6 parametri:

$autoload['packages'] = array();
$autoload['libraries'] = array();
$autoload['helper'] = array();
$autoload['config'] = array();
$autoload['language'] = array();
$autoload['model'] = array();

 

Di default tutti questi parametri sono tutti array vuoti. Ovviamente l'User Guide di Code Igniter raccomanda di non eccedere nel load automatico e di limitarlo a solo ciò che è strettamente necessario.

Una configurazione "tipica" di esempio la troviamo illustrata stesso fra i commenti del file e, personalmente, mi discosto molto poco da quel tipo di configurazione.

 

Venendo alla nostra questione, la connessione al database, la classe che si occupa della connessione e interazione con il database quasi sicuramente fa parte di quelle librerie che prevederanno un uso massiccio all'interno del nostro applicativo.

Pertanto è utile impostare il seguente paramentro all'interno del file /application/config/autoload.php:

$autoload['libraries'] = array('database');

 

A questo punto non occorrerà eseguire il load del database all'interno dei modeli ma la classe database potrà essere utilizzata direttamente all'interno dei metodi previsti.

 

Integrazione con il database

Per interagire con il database abbiamo una serie di metodi. Mostro alcuni esempi tratti dal documentazione ufficiale che possono essere più chiari di tante parole.

 

// query select
$query = $this->db->query('SELECT name, title, email FROM my_table');

foreach ($query->result() as $row){
	echo $row->title;
	echo $row->name;
	echo $row->email;
	}

echo 'Total Results: ' . $query->num_rows();

// query select single result
$query = $this->db->query('SELECT name FROM my_table LIMIT 1');

$row = $query->row();
echo $row->name;

// query insert with escape string
$sql = "
	INSERT INTO mytable (title, name) 
	VALUES ('".$this->db->escape($title)."', '".$this->db->escape($name)."')";

$this->db->query($sql);

echo $this->db->affected_rows();

 

In alternativa a questo modo di operare si può ricorrere a Active Record Class che consente di ottenere diversi vantaggi:

  • la scrittura del codice sarà più sintetica;
  • permette di creare applicazioni database indipendenti (cross-database);
  • query più sicure, poiché i valori sono filtrati (escape) automaticamente dal sistema.

 

Anche in questo caso riporto alcuni semplici esempi, fra l'antro molto semplici da comprendere, tratti dalla documentazione ufficiale e a cui si rimanda per gli ulteriori approfondimenti:

// SELECT * FROM mytable
$query = $this->db->get('mytable'); 

foreach ($query->result() as $row){
	echo $row->title;
	}

// SELECT title, content, date FROM mytable
$this->db->select('title, content, date');
$query = $this->db->get('mytable');


// SELECT * FROM mytable WHERE id=5
$this->db->where('id', 5);
$query = $this->db->get('mytable'); 


// SELECT * FROM mytable LIMIT 10 (in MySQL. Other databases have slightly different syntax)
$this->db->limit(10);
$query = $this->db->get('mytable'); 


// SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
$this->db->limit(10, 20);
$query = $this->db->get('mytable'); 


// SELECT * FROM mytable ORDER BY title DESC
$this->db->order_by("title", "desc"); 
$query = $this->db->get('mytable'); 


// INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
$data = array(
	'title' => 'My title',
	'name' => 'My Name',
	'date' => 'My date'
	);
$this->db->insert('mytable', $data);
echo $this->db->insert_id();


// UPDATE mytable SET title = '{$title}', name = '{$name}', date = '{$date}' WHERE id = $id
$data = array(
               'title' => $title,
               'name' => $name,
               'date' => $date
            );

$this->db->where('id', $id);
$this->db->update('mytable', $data); 
echo $this->db->affected_rows();


// DELETE FROM mytable WHERE id = $id
$this->db->delete('mytable', array('id' => $id));
echo $this->db->affected_rows();

 

 

A questo punto abbiamo tutto ciò che ci occorre per realizzare il nostro guestbook.

Iniziamo dal model e poi vedremo il controller e la view.

 

CRUD: un "classico" model

Un model può essere definito come un gestore di dati. Nel caso di un guestbook tali dati sono costituiti dai commenti presenti all'interno del nostro database.

Tipicamente la gestione dei dati eseguita da model consisterà in:

  • Inserire nuovi dati (Create): aggiungere un commento dal database, cioè una query INSERT.
  • Leggere i dati presenti (Read): leggere dei commenti presenti nel database, cioè una query SELECT.
  • Modificare i dati presenti (Update): modificare dei commenti presenti nel database, cioè una query UPDATE.
  • Eliminare i dati presenti (Delete): eliminare i commenti presenti nel databse, cioè una query DELETE.

 

Quindi, l'acronimo CRUD sta per Read-Create-Update-Delete e costituisce un classico dei model ovvero una classica gestione dei dati.

 

Vediamo, quindi, come si andrà a strutturare il model del nostro guestbook impiengando l'Active record class che, ricordo, sara collocato in /application/models/guestbook_model.php:

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Class Guestbook_model extends CI_Model{
	
	// CREATE
	public function AddComment($name, $email, $website, $comment){
		$data = array(
				'name' 		=> $name,
				'email' 	=> $email,
				'website' 	=> $website,
				'comment' 	=> $comment,
				'time_insert'	=> date('Y-m-d H:i:s')
				);
		$this->db->insert('guestbook', $data);
		return $this->db->insert_id();
		}


	// READ
	public function GetComment($id=null){
		if(!is_null($id)){
			$this->db->where('id', $id);
			}
		$this->db->order_by('time_insert', 'desc');
		$query = $this->db->get('guestbook');
		return $query->result();
		}
	
	// UPDATE
	function update($id, $data){
		$this->db->where('id', $id);
		$this->db->update('guestbook', $data);
		}


	// DELETE
	public function DeleteCommetById($id){	
		$this->db->where('id', $id);
		$this->db->delete('guestbook');
		return $this->db->affected_rows();
		}

}

/*NB: nessun tag di chiusura di php*/

 

Il controller

Il controller del nostro guestbook dovrà essere collocato in /application/controllers/guestbook.php ed avrà due metodi:

  1. il primo index() è quello che si occuperà di recuperare i commenti presenti tramite il model e passarli alla relativa view;
  2. il secondo newcomment(), che svilupperemo nel prossimo articolo, si occupera di inserire un nuovo commento.
<?php 
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

Class Guestbook extends CI_Controller {
	public function index(){
		// load model gusetbook
		$this->load->model('guestbook_model');
	
		// get data
		$data['titolo'] = 'Il mio guestbook con CodeIgniter';
		$data['commenti'] = $this->guestbook_model->GetComment();
		$data['numero_commenti'] = count($data['commenti']);

		// show view
		$this->load->view('guestbook_view', $data);
		}

	public function newcomment(){
		// inserire il commento...
		}
}

 

La view

La view che andremo a sviluppare la andremo a collocare in /application/views/guestbook_view.php, e sarà molto banalmente la seguente:

<html>
<head>
	<title><?php echo $titolo; ?></title>
</head>
<body>

<h1><?php echo $titolo; ?></h1>

<?php foreach($commenti as $single) : ?>
	<div class="comment">

		<p>
		Nome: <?php echo $single->name; ?> <br />
		Email: <?php echo $single->email; ?> <br />
		Website: <?php echo $single->website; ?> <br />
		Data : <?php echo date('d m Y h:m', strtotime($single->time_insert)); ?> <br />
		</p>
		
		<p>
		<?php echo $single->comment; ?>
		</p>

	</div>
	<hr />
<?php endforeach; ?>

<!-- qui inseriremo il nostro form --//>

</body>
</html>

 

A questo punto puntando alla pagina http://localhost/index.php/guestbook (in caso di rewrite URL possiamo rimuovere index.php e puntare a http://localhost/guestbook) visualizzeremo il nostro guestbook.

 

Conclusioni

Abbiamo visto in questo articolo come si interagisce con il database trattraverso un model.

Per concludere il presente tutorial ci manca la costruzione del form e la validazione dei dati provenienti da esso e l'inserimento nel database: tutto ciò sarà trattato nel prossimo articolo.

 

Per qualsiasi dubbio o problema non esistate a lasciarmi un commento e vi risponderò il prima possibile.

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

4 Commenti presenti

avatar nike tn requin gris

nike tn requin gris

07 November 2014 ore 19:21

Staff Xu said that night sweating runners can make sleep more appropriately secure, Professor of Endocrinology , Affiliated Hospital of Ewha Womans University also believes that , in the night exercise, sleeping brain secrete melatonin and growth hormone more adequate for young people to grow and adults improve immunity, prevent aging elderly are good ; often in Hangang Park night run of more than 40 -year-old company employee Kim said no bike at night without much pedestrians, avoid running in breathing because of avoidance generated disorder phenomena , better training effect,Two years ago, Anta abandon cooperation seven-year Chinese men's professional basketball league (CBA) contract as well. Anta was the main reason to abandon CBA sponsorship is , CBA bidding price is too high , so that input-output ratio is too low Anta ,Where the customer itself due to low commodity price , equivalent to 70% off apparel products , where the customer 's discount rate is usually not high! April Eslite more than 60 percent of the merchandise is no discount , a discount of commodities, 15% concentrated

avatar lorenza

lorenza

26 August 2013 ore 20:48

un saluto a tutti da lorenzo complimenti per lo script

avatar Marco

Marco

15 October 2012 ore 00:02

Ho seguito tutto alla lettera ed ho inserito l'autoloader del database, ma mi da errore di connessione.
Il file database ha tutti i parametri corretti, cosa potrebbe essere?

avatar Roberto

Roberto

22 May 2012 ore 11:47