Enrera
Mòdul 5

Creació i gestió d'entorns web dinàmics (PHP)

  Pràctica
Pràctica_1
Pràctica_2
Pràctica_3
Pràctica_4
   
Exercicis
Exercicis
 
   Plantilla de connexió    
 
  Intentareu establir un sistema per modularitzar la connexió a les bases de dades, ja que es tracta d'un dels passos més laboriosos quan s'ha d'implantar l'aplicació en un sistema que incorpora un motor de base de dades diferent a l'original.
 
Desenvolupament de la pràctica
   
A grans trets, l'estructura per accedir a una base de dades consisteix en els passos següents:
 
  • Incloure el fitxer que conté la capa d'abstracció.
  • Crear una instància a l'objecte Nova connexió, on definiu el tipus de base de dades amb què voleu treballar.
  • Establir connexió amb la base de dades.
  • Executar la seqüència SQL (consulta, inserció, supressió de dades).
  • Tractar les dades.
  • Tancar la connexió.
 

Detallem ara cadascun d'aquest apartats:

 
Com ja s'ha vist al mòdul 2, la sentència include cerca el fitxer passat com a paràmetre i insereix els mètodes definits al fitxer receptor.
 

include ("adodb.inc.php");

 
Arribats a aquest punt, seria bo recordar la normalització per indicar al programa el camí que ha de seguir per trobar un fitxer determinat. Si el fitxer que voleu cridar es troba a la mateixa carpeta que el programa que el crida, simplement heu de posar el nom, com en el codi anterior.
 
Ara bé, si es troba en una carpeta superior, heu d'utilitzar ../adodb.inc.php. Fixeu-vos en els dos punts; el seu significat és el d'informar que torni a la carpeta superior, i allí busqui el fitxer php. Si us voleu referir a una carpeta inferior (subordinada a la que us trobeu), heu d'utilitzar el punt ./connexio/nom_del_fitxer.
 
En el vostre cas, si el fitxer que heu d'executar es troba a la carpeta /m5/, llavors segons la disposició de carpetes que es mostra en la figura 5.2.1, seria:
 

include ("../adodb/adodb.inc.php");

 
 

Figura 5.2.1. Arquitectura de l'ADOB

 
El fitxer adodb.inc.php és el fitxer principal d'aquesta capa d'abstracció, on es defineix la jerarquia de les classes i els mètodes associats a cadascuna.(Document d' introducció a les classes i objectes en php )
 
 

Classe ADODB connection Classe ADODB Recordset

Figura 5.2.2. Arquitectura de l'ADOB

 
A més, aquest fitxer incorpora la definició de constants i variables globals.
 
El pas següent és crear una instància a la classe ADODB:
 
$conn= NewADOConnection("mysql")
 
El paràmetre que es passa a l'objecte constructor identifica el tipus de base de dades amb què treballareu. Amb aquesta dada, la llibreria decideix quin conjunt d'instruccions natives ha de fer servir per accedir-hi. Aquest fitxer, que relaciona els mètodes de la capa d'abstracció i el mateix conjunt de natives, és el fitxer ADOdb-????.inc.php; en aquest cas, si el paràmetre del constructor és mysql, el fitxer que escollirà serà ADOdb-mysql.inc.php.
 
Si no passeu paràmetre a l'objecte constructor, crea un nou objecte amb l'últim motor de BD especificat
 
De vegades, aquest paràmetre pot ser una variable que està definida en un fitxer únic de configuració. La màgia del sistema és que, en modificar aquest paràmetre, tota la resta de l'aplicatiu roman igual sense importar el motor de la base de dades.
 
Establiu la connexió: (recordeu que el simbol ' -> ' estableix propietats o mètodes del objecte . Document objectes i classes en PHP ).
 
$conn->Connect("localhost","user","passw","base_dades") or die ("Impossible connectar");
 
Aquesta connexió es pot fer amb el mètode Connect o PConnect. Aquest últim estableix una connexió persisitent amb la BD, és a dir, que la connexió amb la base de dades no es tanca físicament fins que no es fa un close, amb el qual augmenta la velocitat de resposta del sistema, mentre que el mètode Connect consumeix menys recursos, redueix el risc de sobrecàrrega del servidor web i de dades, i la connexió queda en espera. Us aconsellem que utilitzeu per defecte Connect, i en casos crítics de velocitat feu ús de la connexió persistent.
 
Executeu una consulta sobre la base de dades:
 
$sql ="SELECT * FROM alumnes"
$resultat= $conn->Execute ($sql) or die ("Error SQL : $sql");
 
L'apartat fonamental és l'execució de la consulta realitzada. Una vegada executada aquesta comanda, ja teniu a la variable $recordset el primer registre del resultat d'aquesta consulta, amb els camps que heu seleccionat a la comanda SELECT, en aquest cas, tots.
Ara ajuntareu tots aquests coneixements i els posareu en pràctica. Podeu trobar els codis del mòdul 5 a la carpeta fitxers/m5/. És recomanable que obriu el fitxer amb un editor, ja que acoloreix el codi HTML i el codi PHP, i el funcionament resulta més entenedor. També podeu utilitzar la icona de les ulleres per visualitzar el codi.
 
Veure codi

<?php
/*-----------------------------------------------------------------
* Mòdul: 5 Pràctica: 2 Fitxer: m5p21.php
* Autor: D116 Data:
* Descripció: Connexió BD utilitzant ADODB
* Pre condi.: ADODB,B.D. tutoria,
* Post cond.:
-----------------------------------------------------------------*/
?>
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html> <head>
<title>Mòdul 5 Pràctica 21</title>
</head><body>

<?php
// carreguem llibreria ADODB. Recordeu que si no està en el mateix
// directori del present fitxer, heu d'indicar el camí per accedir-hi
include("../adodb/adodb.inc.php");

$conn = ADONewConnection('mysql'); // Creem connexió a MySQL

// Connect ('Nom_servidor','usuari','contrasenya','base_de dades');
$conn->Connect("localhost", "root", "", "tutoria");

// Establim la seqüència SQL.
$sql="select * from professor";

// Establim a la variable resultat la resposta de la connexió
$resultat = $conn->Execute($sql);

// Si NO podem establir connexió retornem missatge d'error
if (!$resultat){
print $conn->ErrorMsg();
}
else{
print ' Presentem en pantalla el camp iden i el camp nom <BR>';
// Mentre el resultat de la consulta no arrivi a final de fitxer..

while (!$resultat->EOF) {

// Presentem a pantalla el contingut del camp 0 i camp 2, que
// representa el camp 'IDEN' i el camp 'NOM'
print $resultat->fields[0].' | Nom : '.$resultat->fields[2].'<BR>';
// Podem referir-nos a l'array de camps amb el seus identificadors
// Podeu substituir fields[0] per fields['iden'], i 2 per 'nom'

$resultat->MoveNext();
}
}
$resultat->Close(); // Alliberem l'array dels resultats
$conn->Close(); // Alliberem la connexió a la base de dades.
?>
</body>
</html>

Llistat 5.2.1. Codi del fitxer m5p21.php
 

Figura 5.2.3. Resultat de la pràctica m5p21.php

 
Tots els fitxer php que vulgueu connectar a la base de dades tindran una capçalera de connexió que s'anirà repetint sempre i que podeu centralitzar en un fitxer que només faci aquesta connexió. A més, això permet que en el cas que es modifiqui el nom de la base de dades, l'usuari, la contrasenya o el tipus de base de dades, tan sols s'hagi d'accedir a aquest fitxer i la resta del programari ja s'actualitzarà amb els nous paràmetres.
 
En primer lloc, creareu la carpeta /connexio/ (observeu la figura 5.2.1), on guardareu els fitxers d'automatització de connexions i altres fitxers que contenen paràmetres del vostre programari si és necessari. Creeu el fitxer tutoria_con.php; el codi font el podeu localitzar a /fitxers/m5/connexio/.
 

Veure codi

 

<?php
/*-----------------------------------------------------------------
* Mòdul: Pràctica: Fitxer: tutoria_con.php
* Autor: D116 Data:
* Descripció: Fitxer que estableix la connexió amb la BD
* Pre condi.: BD 'tutoria'
* Post cond.: Retorna un punter al mètode $ConTut
-----------------------------------------------------------------*/

$MM_ConTut_HOSTNAME = "localhost"; // Nom de la màquina o IP servidor
$MM_ConTut_DBTYPE = "mysql"; // Tipus de base de dades
$MM_ConTut_DATABASE = "tutoria"; // Nom de la base de dades
$MM_ConTut_USERNAME = "root"; // Usuari per accedir a la BD
$MM_ConTut_PASSWORD = ""; // Contrasenya per accés a la BD


$ConTut=&ADONewConnection($MM_ConTut_DBTYPE);

// Petits ajustos per connectar-nos a Acces o ODBC /IBASE / i altres.

if($MM_ConTut_DBTYPE == "access" || $MM_ConTut_DBTYPE == "odbc"){
$ConTut->Connect($MM_ConTut_DATABASE, $MM_ConTut_USERNAME,
$MM_ConTut_PASSWORD);

} else if($MM_ConTut_DBTYPE == "ibase") {
$ConTut->Connect($MM_ConTut_HOSTNAME.":".$MM_ConTut_DATABASE,
$MM_ConTut_USERNAME,$MM_ConTut_PASSWORD);

} else {
$ConTut->Connect($MM_ConTut_HOSTNAME,$MM_ConTut_USERNAME,
$MM_ConTut_PASSWORD,$MM_ConTut_DATABASE);
}

?>

Llistat 5.2.2. Codi del fitxer Tutoria_con.php
 
Si en comptes de fer una connexió al servidor MySQL, la voleu fer contra l'ODBC per accedir a la base de dades en Acces (consulteu el mòdul 4, pràctica 2), només heu de modificar les constants següents del fitxer /connexio/tutoria_con.php; trobareu el fitxer modificat a /connexio/tutoria_con_odbc.php.
 
$MM_ConTut_DBTYPE = "odbc";
$MM_ConTut_DATABASE = "d116_tutoria";
 
Recordeu que s'ha anomenat a la connexió DSN d116_tutoria. La connexió no funciona si no teniu l'Acces instal·lat a l'ordinador i creada la connexió d116_tutoria a l'ODBC.
 
Ara heu creat el fitxer m5p22.php, que fa la mateixa funció que el fitxer m5p21.php, però ara elimineu la part de connexió i feu un include del fitxer /connexio/tutoria_con.php, que s'encarrega de crear i controlar la connexió a la base de dades.
 

Veure codi

Executar codi

<?php
/*-----------------------------------------------------------------
* Mòdul: 5 Pràctica: 2 Fitxer: m5p22.php
* Autor: D116 Data:
* Descripció: Connexió BD utilitzant ADODB. Centralitzem connexió
* Pre condi.: ADODB,BD tutoria, fitxer de connexió tutoria_con.php
* Post cond.:
-----------------------------------------------------------------*/
?>
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html><head>
<title>Mòdul 5 Pràctica 22</title>
</head><body>

<?php
// carreguem llibreria ADODB. Recordeu que si no està en el mateix
// directori del present fitxer, heu d'indicar el camí per accedir-hi
include("../adodb/adodb.inc.php");

// Aquest fitxer incorpora el mètode de connexió a la Base de dades
// Retorna un punter a $ConTut.
include("./Connexio/tutoria_con.php");

// Establim la seqüència SQL.
$sql="select * from professor";

// Establim a la variable recordset el resultat de la connexió
$resultat =$ConTut->Execute($sql)or DIE($ConTut->ErrorMsg()) ;
// Si NO podem establir connexió retornem missatge d'error

if (!$resultat->EOF){
print ' Presentem en pantalla el camp iden i el camp nom <BR>';

while (!$resultat->EOF) {
// Presentem a pantalla el contingut del camp 0 i camp 2, que
// representa el camp 'IDEN' i el camp 'NOM'
print $resultat->fields[0].' ==> Nom : '.$resultat->fields[2].'<BR>';
$resultat->MoveNext();
}
}

$resultat->Close(); // Alliberem l'array dels resultats
$ConTut->Close(); // Alliberem la connexió a la base de dades.
?>
</body>
</html>

Figura 5.2.3. Codi del fitxer m5p22.php
 
Atenció !
En el cas que hàgiu d'extreure les dades de l'Acces, només heu de modificar l'include pel fitxer ./connexio/tutoria_con_odbc.php, i el sistema queda modificat pel nou motor de bases de dades. El paràmetre del tipus de base de dades el trobareu a la figura 5.1.3 (mòdul 5, pràctica 1) o en aquest enllaç .
   
   
 
Amunt
Pràctica
pràctica_1
Pràctica_2
Pràctica_3
Pràctica_4
Exercicis
Exercicis