08 Zend Framework adatbázisok kezelése, csatlakozás, adatfelvitel

Default book

Az adatbázisok kezelése során zudni kell, hogy minden PDO driverrel ellátott adatbázist képes kezelni. Két osztály a Zend_Db és a Zend_Adapter osztály tartozik alapvetően ebbe a körbe. A Zend Framework a PHP PDO driverein keresztül képes kezelni az alábbi adatbáziskezelőket:

  • IBM DB2 és Informix Dynamic Server (IDS),  pdo_ibm PHP extension
  • MySQL, a pdo_mysql PHP extension segítségével
  • Microsoft SQL Server, a pdo_dblib PHP extension segítségével
  • Oracle, a pdo_oci PHP extension segítségével
  • PostgreSQL, using the pdo_pgsql PHP extension segítségével
  • SQLite, pdo_sqlite PHP extension segítségével

További adatbázis elérési lehetőségek, amelyekhez a Zend_Db-nek van Adapter osztálya:

  • MySQL, a mysqli PHP extension segítségével
  • Oracle, a oci8 PHP extension segítségével
  • IBM DB2 és DB2 I5, az ibm_db2 PHP extension segítségével
  • Firebird (Interbase), a php_interbase PHP extension segítségével
  • MSSQL - Sqlsrv adapterrel, ami támogatja az UNICODE adatok tárolását (Window szerveren) ehhez a letölthető dolgok innen szedhetők le: SQL Natív kliens, ami kell azon a gépen, ahol a webszerver és a PHP fut és a PHP driverek innen tölthetők le. A megfelelő verziójút kell használni a PHP 5.2.x vagy 5.2,  a webszerver típusától függően (Apache, modulként VC6, thread safe=TS, FastCGI esetén Non Thread Safe=NTS, IIS7 esetén VC9 és Non Thread Safe FastCGI használatával (az ajánlott).

A Zend Framework esetén a Zend_Db_Adapter jelenti az adatbázis kezelőhöz szükséges csatolót.

Hozzunk létre egy adatbázis kezelőben (a példában MySQL) egy ilyen szerkezetű táblát:

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`)
);

Ennek a táblának készítsünk egy adatbeviteli ?rlapot.

A production/controllers/UserController.php fájlban létrehozzuk a register Akciót, ami egy user felvételét jelenti. az eddig is szerkesztett fájlban hozzuk létre az alábbi metódust.

public function registerAction()
{
   $request = $this->getRequest();

   $this->view->assign('action',"process");
   $this->view->assign('title','Member Registration');
   $this->view->assign('label_fname','First Name');
   $this->view->assign('label_lname','Last Name');
   $this->view->assign('label_uname','User Name');
   $this->view->assign('label_pass','Password');
   $this->view->assign('label_submit','Register'); 
   $this->view->assign('description','Please enter this form completely:'); 
}

A registerAction() függvényhez hozzá kell illeszteni az application/views/scripts/user könyvtárban a register.phtml fájlt az alábbi kóddal:

<? 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"; ?>

A böngészőben az alábbi oldalt kell megnyitni: http://hostname/user/register

Miután készen vagyunk az űrlappal, az adatbevitelre kell egy Action készíteni.

Az application/controllers/UserController.php osztályában a processAction() függvényt adjuk hozzá. Ez fogja a beérkező kérést feldolgozni.

public function processAction()
{
   $params = array('host'  =>'localhost',
      'username' =>'root',
       'password'  =>'admin',
       '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','Registration Process');
   $this->view->assign('description','Registration succes'); 
}

Hozzunk létre ehhez egy View-t is az application/views/scripts/user/process.phtml néven

<? include "header.phtml"; ?>
  <h1><?=$this->escape($this->title);?></h1>
  <h2><?=$this->escape($this->description);?></h2>
  <a href="list">Member List</a>
<? include "footer.phtml"; ?>

Egyéb adatbeviteli lehetőségek

A hagyományos SQL alapú adatbevitelt már láttuk. Ennek alternatívájaként lehet használni az alábbi processAction() függvényt:

public function processAction()
{

   $params = array(
       'host'  =>'localhost',
       'username' =>'root',
       'password'  =>'admin',
       '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','Registration Process');
   $this->view->assign('description','Registration succes');  
}

Nyilván mind a két esetben az adatbázis kapcsolathoz szükséges paraméterek itt be vannak drótozva, de később meglátjuk, hogyan lehet ezeket a paramétereket módosítani és mondjuk ini fájlokból betölteni az adatokat.