Zend Framework Database

Introduzione
Zend Framework fornisce classi per il supporto del database. Il nome di tale classe è Zend_Db. Altri benefici utilizzando questa classe e le classi correlate sono le caratteristiche che offre un’interfaccia semplice per il database SQL.
Se parliamo di database in Zend Framework, possiamo parlare di ciò che è Zend_Db_Adapter. Questa è classe di base da utilizzare per connettere l’applicazione PHP e il RDBMS. Come sappiamo, c’è una classe diversa di adattatori per ogni tipo di RDBMS. Lo Zend_Db_Adapters è un ponte da parte del fornitore estensioni specifiche di PHP per un interfaccia comune. Con questa classe, è possibile scrivere applicazioni PHP per per molti RDBMS (con il minimo sforzo).
Si può ricordate ci sono dell’estensioni in PHP che hanno come delle funzioni similare a Zend_Db_Adapter, PHP Data Object (PDO). PDO fornire un’interfaccia per database multipli in PHP 5. In PHP 4, c’è una libreria, ADOdb.
Nel seguente esercizio, useremo PDO per mysql (pdo_mysql). Prima fare una prova per verificare se pdo_mysql è disponibile nel vostro sistema. Controllare il file php.ini. Decommentare extension = php_pdo.dll, extension = php_pdo_mysql.dll e riavviare il server Apache.
Ok, basta ricordare gli esercizi di base sui nostri post precedenti nei capitoli Zend Framework Intro e Struttura URL e Action. Quindi, assicuratevi di aver capito tali capitoli.
Per questo esempio, creare un database denominato “zend“. Quindi creare una tabella denominata “user“. È possibile utilizzare la seguente query:
Copia codice

CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `user_name` varchar(50) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `user_name` (`user_name`)
);
Creazione Modulo di input
Primo passo, creeremo un modulo per l’input dei dati. Creiamo questo modulo dentro de la classe User Controller. Dobbiamo solo aggiungere un metodo denominato “registerAction” come azione per questo controller.
Aprire “UserController.php” sotto la cartella application/controllers. Aggiungere il seguente metodo:
Copia codice

  public function registerAction()
  {
    $request = $this->getRequest();
	$this->view->assign('action',"process");
    $this->view->assign('title','Registrazione Membri');
	$this->view->assign('label_fname','Nome');
	$this->view->assign('label_lname','Cognome');
	$this->view->assign('label_uname','Nome Utente');
	$this->view->assign('label_pass','Password');
	$this->view->assign('label_submit','Registra');
	$this->view->assign('description','Compilare questo modulo completamente:');
  }
Come sappiamo, se creiamo un’azione con il nome “registerAction“, dobbiamo creare una vista con il nome “register.phtml“. Ok, allora creare un file denominato “register.phtml” sotto la cartella application/views/scripts/user. Inserire il seguente codice:
Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <div id="description">
    <?=$this->escape($this->description);?>
  </div>
  <form name="register" method="post" action="<?=$this->escape($this->action)?>">
  <table>
    <tr>
	  <td><?=$this->escape($this->label_fname)?></td>
	  <td><input type="text" name="first_name"></td>
	</tr>
    <tr>
	  <td><?=$this->escape($this->label_lname)?></td>
	  <td><input type="text" name="last_name"></td>
	</tr>
    <tr>
	  <td><?=$this->escape($this->label_uname)?></td>
	  <td><input type="text" name="user_name"></td>
	</tr>
    <tr>
	  <td><?=$this->escape($this->label_pass)?></td>
	  <td><input type="password" name="password"></td>
	</tr>
  </table>
  <input type="submit" name="submit" value="<?=$this->escape($this->label_submit);?>">
  </form>
<? include "footer.phtml"; ?>
Ora, puntare il browser su http://localhost/test/zend/ciaoMondo/web_root/user/register

Inserendo i dati nel database
Dopo di aver creato il modulo, ora, creiamo l’azione per inserire i dati nel database. Per questo lavoro, aprire il file “UserController.php” sotto la cartella application/controllers. Aggiungere un metodo denominato “processAction“, come nel seguente codice:
Copia codice

  public function processAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
    $request = $this->getRequest();
	$sql = "INSERT INTO `user`
			(`first_name` , `last_name` ,`user_name` ,`password`)
			VALUES
			('".$request->getParam('first_name')."', '".$request->getParam('last_name')."', '".$request->getParam('user_name')."', MD5('".$request->getParam('password')."'))";
	$DB->query($sql);
    $this->view->assign('title','Processo di registrazione');
	$this->view->assign('description','Registrazione avvenuta');  	
  }
È semplice da capire, non è vero?

Successivamente, creare la vista per questo processAction. creare un file denominato “process.phtml” sotto la cartella application/views/scripts/user. Inserire il seguente codice:

Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <h2><?=$this->escape($this->description);?></h2>
  <a href="list">Member List</a>
<? include "footer.phtml"; ?>
Ora, puntare il browser su http://localhost/test/zend/ciaoMondo/web_root/user/register. Quindi, immettere un informazioni utente, quali:
Now, point your browser to http://localhost:8050/test/zend/ciaoMondo/web_root/user/register. Quindi, immettere un informazioni utente, quali:
Fare clic sul pulsante di registrazione. Otterrete questo risultato:

Inserendo espressioni a una tabella
Al post precedente, abbiamo usato um’ordinaria query per i dati di input. Zend Framework ha un modo molto semplice per le query di inserimento. È una buona alternativa, perché è semplice e più pulito.
Si può usare la query in questo modo:
Copia codice

	$data = array('first_name' => $request->getParam('first_name'),
	  'last_name' => $request->getParam('last_name'),
				  'user_name' => $request->getParam('user_name'),
				  'password' => md5($request->getParam('password'))
	  );
   $DB->insert('user', $data);
LA vecchia query è come questa:
Copia codice

	$sql = "INSERT INTO `user`
			(`first_name` , `last_name` ,`user_name` ,`password`)
			VALUES (
				'".$request->getParam('first_name')."',
				'".$request->getParam('last_name')."',
				'".$request->getParam('user_name')."',
				MD5('".$request->getParam('password')."'))";
	$DB->query($sql);
Ok, sostituiamo il nostro processAction per farlo diventare come questo:
Copia codice

  public function processAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
    $request = $this->getRequest();
	$data = array('first_name' => $request->getParam('first_name'),
	  'last_name' => $request->getParam('last_name'),
				  'user_name' => $request->getParam('user_name'),
				  'password' => md5($request->getParam('password'))
	  );
    $DB->insert('user', $data);
    $this->view->assign('title','Processo di registrazione');
	$this->view->assign('description','Registrazione avventa');  	
  }
Creazione Lista dei dati
Ora, creiamo una lista per visualizzare i dati che abbiamo inseriti nella tabella. Per questo lavoro, creiamo un metodo chiamato “listAction” all’interno del controller. Quindi, creiamo una vista per questa lista.
Aprire “UserController.php” sotto la cartella application/controllers. Aggiungere il seguente metodo:
Copia codice

  public function listAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$DB->setFetchMode(Zend_Db::FETCH_OBJ);
	$sql = "SELECT * FROM `user` ORDER BY user_name ASC";
	$result = $DB->fetchAssoc($sql);
    $this->view->assign('title','Lista membri');
	$this->view->assign('description','Sotto, nostri membri:');
	$this->view->assign('datas',$result);		
  }
Quindi, creare un file chiamato “list.phtml” sotto la cartella application/views/scripts/user. Inserire il seguente codice:
Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <h2><?=$this->escape($this->description);?></h2>
  <a href="register">Registrazione</a>
  <table border="1">
    <tr>
	  <th>ID</th>
	  <th>Nome Utente</th>
	  <th>Nome</th>
	  <th>Cognome</th>
	  <th>Azione</th>
	</tr>
  <? $datas = $this->datas;
     for($i = 1; $i<= count($datas);$i++){ ?>
    <tr>
	  <td><?=$datas[$i]['id']?></td>
	  <td><?=$datas[$i]['user_name']?></td>
	  <td><?=$datas[$i]['first_name']?></td>
	  <td><?=$datas[$i]['last_name']?></td>
	  <td>
	    <a href="edit/id/<?=$datas[$i]['id']?>">Edita</a> |
		<a href="del/id/<?=$datas[$i]['id']?>">Elimina</a>
	  </td>
	</tr>
  <? } ?>
  </table>
<? include "footer.phtml"; ?>
Ora, puntare il browser su http://localhost/test/zend/ciaoMondo/web_root/user/list

Creazione form di modifica
Per creare un modulo per l’edizione, aggiungere un metodo al controller. In questo esercizio, si aggiunge una azione denominata “editAction“. Questa azione mostrerà i dati individuali filtrati dal parametro GET nel protocollo HTTP.
Aprire il file “UserController.php” sotto la cartella application/controllers. Aggiungere il seguente metodo:
Copia codice

  public function editAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
    $request = $this->getRequest();
	$id 	 = $request->getParam("id");
	$sql = "SELECT * FROM `user` WHERE id='".$id."'";
	$result = $DB->fetchRow($sql);
	$this->view->assign('data',$result);
	$this->view->assign('action', $request->getBaseURL()."/user/processedit");
    $this->view->assign('title','Modifica Membri');
	$this->view->assign('label_fname','Nome');
	$this->view->assign('label_lname','Cognome');
	$this->view->assign('label_uname','Nome Utente');
	$this->view->assign('label_pass','Password');
	$this->view->assign('label_submit','Edita');
	$this->view->assign('description','Compilare questo modulo completamente');
  }
Quindi, creare un file chiamato “edit.phtml” sotto la cartella application/views/scripts/user. Inserire il seguente codice:
Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <div id="description">
    <?=$this->escape($this->description);?>
  </div>
  <form name="edit" method="post" action="<?=$this->escape($this->action)?>">
  <input type="hidden" name="id" value="<?=$this->data['id']?>">
  <table>
    <tr>
	  <td><?=$this->escape($this->label_fname)?></td>
	  <td><input type="text" name="first_name" value="<?=$this->data['first_name']?>"></td>
	</tr>
    <tr>
	  <td><?=$this->escape($this->label_lname)?></td>
	  <td><input type="text" name="last_name" value="<?=$this->data['last_name']?>"></td>
	</tr>
    <tr>
	  <td><?=$this->escape($this->label_uname)?></td>
	  <td><input type="text" name="user_name" value="<?=$this->data['user_name']?>"></td>
	</tr>
  </table>
  <input type="submit" name="submit" value="<?=$this->escape($this->label_submit);?>">
  </form>
<? include "footer.phtml"; ?>
Ora, aprire un’altra volta la tabella puntando il browser su http://localhost/test/zend/ciaoMondo/web_root/user/list Clicca il link edit in una delle righe. La pagina aprirà il modulo per per la sua modifica come segue:

Aggiornamento dei dati
In questo post, creeremo un’azione per l’aggiornamento dei dati. Aprite il vostro “UserController.php” sotto la cartella application/controller. Inserisci la seguente nuova azione:
Copia codice

  public function processeditAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$request = $this->getRequest();
	$sql = "UPDATE `user` SET  `first_name` = '".$request->getParam('first_name')."',
	   `last_name` = '".$request->getParam('last_name')."',
							   `user_name` = '".$request->getParam('user_name')."'
	  WHERE id = '".$request->getParam('id')."'";
	$DB->query($sql);
    $this->view->assign('title','Processo di modifica');
	$this->view->assign('description','Modifica eseguita');  	
  }
Quindi, creare un file chiamato “processedit.phtml” sotto la cartella views/scripts/user. Inserire poi il seguente codice:
Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <h2><?=$this->escape($this->description);?></h2>
  <a href="list">Lista membri</a>
<? include "footer.phtml"; ?>
Ok, tenta ora di aggiornare i dati dal modulo di modifica.
Così come le query di inserimento, Zend Framework ha un’altra possibilità per creare delle query di aggiornamento. È più semplice e ordinato. Si può usare in questo modo:
Copia codice

$data = array(
			'first_name' => $request->getParam('first_name'),
			'last_name' => $request->getParam('last_name'),
			'user_name' => $request->getParam('user_name'),
			'password' => md5($request->getParam('password'))
		);
$DB->update('user', $data,'id = 1');
Di seguito il codice completo per il metodo processeditAction:
Copia codice

  public function processeditAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$request = $this->getRequest();
	$data = array(
				'first_name' => $request->getParam('first_name'),
				'last_name' => $request->getParam('last_name'),
				'user_name' => $request->getParam('user_name'),
				'password' => md5($request->getParam('password'))
			);
    $DB->update('user', $data,'id = '.$request->getParam('id'));	
    $this->view->assign('title','Processo di modifica');
	$this->view->assign('description','Modifica eseguita');  	
  }
Eliminazione di dati
Ultima azione di questa serie è la cancellazione dei dati. Per questo lavoro, creare un nuovo metodo nel controller.
Apriree il file “UserController.php” sotto la cartella application/controllers. Aggiungere un nuovo metodo per l’azione di eliminazione alla classe (io darei il nome “delAction“):
Copia codice

  public function delAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$request = $this->getRequest();
	$sql = "DELETE FROM `user` WHERE id='".$request->getParam('id')."'";
	$DB->query($sql);
    $this->view->assign('title','Eliminazione Dati');
	$this->view->assign('description','Eliminazione avvenuta');
    $this->view->assign('list',$request->getBaseURL()."/user/list");
Quindi, creare una nuova view per questa azione con un file chiamato “del.phtml” sotto la cartella application/views/scripts/user. Inserire poi il seguente codice:
Copia codice

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <h2><?=$this->escape($this->description);?></h2>
  <a href="<?=$this->escape($this->list);?>">Member List</a>
<? include "footer.phtml"; ?>
Ora, provate a verificare dai dati della tabella. Clicca il link presso una delle righe.
Eliminazione di dati stile query
Come le query per l’inserimento e aggiornamento, Zend Framework ha un’altra opzione per le query di eliminazione. È possibile utilizzare questo stile, e sono sicuro che sarà come:
Copia codice
>
$DB->delete('user', 'id = 3');
Ok, tenta di aggiornare il vostro delAction per farlo diventare come questo:
Copia codice

  public function delAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$request = $this->getRequest();
    $DB->delete('user', 'id = '.$request->getParam('id'));	
    $this->view->assign('title','Eliminazione Dati');
	$this->view->assign('description','Eliminazione avvenuta');
    $this->view->assign('list',$request->getBaseURL()."/user/list");  
  }
Ok, ora, siete pronti a documentarvi di più sullo stile di Zend Framework per le query consultando la guida a Zend Framework.
Riassumendo Action Controller
Questo è all’ultimo post del capitolo Zend Framework Database. In questo post, si può guardare l’azione completa che avevamo parlato.
Copia codice

<?php
require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
require_once 'Zend/Controller/Action.php';
class UserController extends Zend_Controller_Action
{
  public function indexAction()
  {
    $this->view->assign('name', 'Manager');
    $this->view->assign('title', 'Ciao');
  }
  public function nameAction()
  {
    $request = $this->getRequest();
    $this->view->assign('name', $request->getParam('username'));
    $this->view->assign('gender', $request->getParam('gender'));	  
    $this->view->assign('title', 'Nome Utente');
  }  
  public function registerAction()
  {
    $request = $this->getRequest();
	$this->view->assign('action',"process");
    $this->view->assign('title','Registrazione Membri');
	$this->view->assign('label_fname','Nome');
	$this->view->assign('label_lname','Cognome');
	$this->view->assign('label_uname','Nome Utente');
	$this->view->assign('label_pass','Password');
	$this->view->assign('label_submit','Registra');
	$this->view->assign('description','Compilare questo modulo completamente:');
  }
  public function editAction()
  {
    $params = array('host'	=>'localhost',
	'username'	=>'root',
		    'password'  =>'password',
		    'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
    $request = $this->getRequest();
	$id 	 = $request->getParam("id");
	$sql = "SELECT * FROM `user` WHERE id='".$id."'";
	$result = $DB->fetchRow($sql);
	$this->view->assign('data',$result);
	$this->view->assign('action', $request->getBaseURL()."/user/processedit");
    $this->view->assign('title','Modifica Membri');
	$this->view->assign('label_fname','Nome');
	$this->view->assign('label_lname','Cognome');
	$this->view->assign('label_uname','Nome Utente');
	$this->view->assign('label_pass','Password');
	$this->view->assign('label_submit','Edita');
	$this->view->assign('description','Compilare questo modulo completamente:');
  }  
  public function processAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
    $request = $this->getRequest();
	$data = array('first_name' => $request->getParam('first_name'),
	  'last_name' => $request->getParam('last_name'),
				  'user_name' => $request->getParam('user_name'),
				  'password' => md5($request->getParam('password'))
	  );
    $DB->insert('user', $data);
    $this->view->assign('title','Processo di registrazione');
	$this->view->assign('description','Registrazione avventa');	
  }
  public function listAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$DB->setFetchMode(Zend_Db::FETCH_OBJ);
	$sql = "SELECT * FROM `user` ORDER BY user_name ASC";
	$result = $DB->fetchAssoc($sql);
    $this->view->assign('title','Lista membri');
	$this->view->assign('description','Sotto, nostri membri:');
	$this->view->assign('datas',$result);		
  }
  public function processeditAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$request = $this->getRequest();
	$data = array('first_name' => $request->getParam('first_name'),
	  'last_name' => $request->getParam('last_name'),
				  'user_name' => $request->getParam('user_name'),
				  'password' => md5($request->getParam('password'))
	  );
    $DB->update('user', $data,'id = '.$request->getParam('id'));	
    $this->view->assign('title','Processo di modifica');
	$this->view->assign('description','Modifica eseguita');
  }
  public function delAction()
  {
    $params = array('host'		=>'localhost',
	    'username'	=>'root',
					'password'  =>'password',
					'dbname'	=>'zend'
	   );
	$DB = new Zend_Db_Adapter_Pdo_Mysql($params);
	$request = $this->getRequest();
    $DB->delete('user', 'id = '.$request->getParam('id'));	
    $this->view->assign('title','Eliminazione Dati');
	$this->view->assign('description','Eliminazione avvenuta');
    $this->view->assign('list',$request->getBaseURL()."/user/list");
  }
}
?>