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
 
   Tractament de dades    
 

L'objectiu d'aquesta pràctica consisteix a donar a conèixer alguns dels avantatges que aporta l'ADODB en el tractament i l'anàlisi de les dades que manipula el programari. En aquesta pràctica només es defineixen algunes d'aquestes particularitats, però seria convenient revisar la documentació de l'ADODB per treure'n el màxim profit.

 
Treballar amb les dades
   
Obtenir característiques dels camps de la base de dades
 
És interessant, de vegades, conèixer el tipus de dada que retorna la consulta que s'ha fet, ja que segons el tipus, s'han de formatar les dades per presentar-les en pantalla.
 
FetchField($columna). Es tracta d'un mètode de la classe RecorSet que retorna un objecte que conté tres propietats fonamentals de la columna sol·licitada (nom, tipus de dada i longitud del camp).
 
Figura 5.3.1. Propietats de l'ADODBFieldObject
 
Metatype($Objecte_Camp). Codifica segons una taula predeterminada els diferents tipus de dades que conté un camp. S'utilitza per preparar formats de presentació de dades segons el tipus de dada de què es disposa.
 
Pràctica
Es presenta un programa que analitza una taula definible pel paràmete $Taula, de la base de dades tutoria, d'on extraureu les dades corresponents a les característiques dels camps que componen cada registre, a més de visualitzar les dades contingudes en el primer registre.
 
Assegureu-vos que la taula que analitzeu tingui almenys un registre.
 

Veure codi

Executar codi

<?php
/*-----------------------------------------------------------------
* Mòdul: 5 Pràctica: 3 Fitxer: m5p31.php
* Autor: D116 Data:
* Descripció: Identificar estructura de dades d'una fila de la BD
* 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 31</title>
</head><body>
<?php

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

// Establim paràmetres regionals en català dies,hora,moneda,numèrics
// CA -> Català SP -> Castellà .....
setlocale(LC_ALL,"CA");

$Taula= "entrevista";
$sql="select * from ".$Taula;
$resultat=$ConTut->Execute($sql)or DIE($ConTut->ErrorMsg()) ;

if (!$resultat->EOF){
print '<H3> Descripció dels camps de la taula '.$Taula.'</h3><BR>';

// Tantes vegades com camps hi ha en un registre.
for ($i=1;$i< $resultat->FieldCount();$i++) {

$Camp=$resultat->FetchField($i);
$Tipus= $resultat->MetaType($Camp);
print 'Nom del camp : '.$Camp->name.'<BR>';
print 'Tipus de camp : '.$Camp->type.'<BR>';
print 'Cod. tipus camp: '.$Tipus.'<BR>';
print 'Longitud del camp:'.$Camp->max_length.'<BR> ';

if ($Tipus=='D' && $Camp->max_length>7) {
// Convertim una data en un número per utilitzar strftime
// Aquesta funció pertany a PHP i lliga amb Setlocale...
$calcul=strtotime($resultat->fields[$i]);
print strftime(" Data en lletres : %A, %d de %B de %Y",$calcul).'<BR>';
}

print '<h4> Valor del camp : '.$resultat->fields[$i]. '</h4><BR> <BR>';
}
}

$resultat->Close();
$ConTut->Close();
?>
</body>
</html>

Llistat 5.3.1. Codi del fitxer m5p31.php
 
Fixeu-vos que en aquest fitxer (m5p31.php) només llegiu un registre de la BD; per veure'n l'estructura mai llegiu el segon registre, no hi ha cap MoveNext(). El que sí que es fa al bucle for és desplaçar-se pels camps que componen un registre, per descobrir-ne l'estructura i les dades que contenen.
 
Afegir dades a les taules
 
Pràctica
Ara inserireu un nou professor a la base de dades tutoria. Utilitzareu el mètode GetInsertSQL de la llibreria ADODB, que a partir de l'objecte RecorSet que teniu i d'un array de valors, és capaç de crear la sentència SQL adequada.
 
En un primer moment, potser no trobareu la necessitat d'utilitzar un mètode que creï la sentència SQL. Però, i si us diem que no totes les BD compleixen els estàndards SQL? Ara ja té més importància, oi?
 

Veure codi

Executar codi

<?php
/*-----------------------------------------------------------------
* Mòdul: 5 Pràctica: 3 Fitxer: m5p32.php
* Autor: D116 Data:
* Descripció: Insercció d'un nou registre a la taula 'professor'
* 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 32</title>
</head><body>
<?php
include("../adodb/adodb.inc.php");
include("./connexio/tutoria_con.php");

// iden=-1, ens posiciona en el primer registre buit.
$sql="select * from professor where iden=-1";
//$ContTut->debug=true;
$resultat=$ConTut->Execute($sql)or DIE($ConTut->ErrorMsg()) ;

$reg=array(); // Incialitzem Array

// Entrem les dades del professor
// Recorda que 'Iden' és un camp autonumèric (automàtic)
$reg['Iden']="";
$reg['Codi']="TGUASH";
$reg["Nom"]="Tomé";
$reg["Cognom1"]="Guash";
$reg["Cognom2"]="Roma";
$reg["Sexe"]=1;
$reg["Email"]="pp@hotmail.com";
$reg["AnyALta"]="1999-01-01";
$reg["AnyBaixa"]="2003-01-01";
$reg["contrasenya"]=MD5("pp"); // MD5 Funció d'encriptació
$reg["Nivell_Seg"]=5;

// ADODB ens crea amb aquesta funció las sentència SQL
$SQL_insert= $ConTut->GetInsertSQL($resultat,$reg);

// Visualitzem SQL creada per ADODB
print 'sentència SQL creada per ADODB :<BR>'.$SQL_insert.'<BR>';

$ConTut->Execute ($SQL_insert); // Executem sentència insercció.
print 'Valor IDEN autonumèric :'.$ConTut->Insert_ID();

?>
<script language="JavaScript">
alert("Registre insertat a la Base de Dades");</script>
<?php

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

Figura 5.3.2. Codi del fitxer m5p32.php
 
I per modificar dades?
 
Pràctica
Ara s'ha de modificar el nom i el sexe del professor que heu entrat; igual que abans, us valdreu d'un mètode, la classe connexió de l'ADODB, que crea la sentència SQL per fer aquesta modificació, GetUpdateSQL($recordSet, $array_valors).
 

Veure codi

Executar codi

<?php
/*-----------------------------------------------------------------
* Mòdul: 5 Pràctica: 3 Fitxer: m5p33.php
* Autor: D116 Data:
* Descripció: Modificació d'un registre de la taula 'professor'
* 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 33 </title>
</head><body>

<?php
include("../adodb/adodb.inc.php");
include("./connexio/tutoria_con.php");

// Seleccionem el professor amb codi = TGUASH
$sql="select * from professor where codi='TGUASH'";
$ContTut->debug=true;
$resultat =$ConTut->Execute($sql)or DIE($ConTut->ErrorMsg()) ;
$reg=array();

// Modifiquem Nom i Sexe
$reg["Nom"]="Tatiana";
$reg["Sexe"]=2;

// ADODB ens crea amb aquesta funció las sentència SQL
$SQL_update= $ConTut->GetUpdateSQL($resultat,$reg);

print 'sentència SQL creada per ADODB :<BR>'.$SQL_update.'<BR>';
// Executem sentència SQL d'insercció.
$ConTut->Execute ($SQL_update);

?>
<script>alert("Registre modificat a la Base de Dades");</script>
<?php

$resultat->Close();
$ConTut->Close();
?>
</body>
</html>

Figura 5.3.3. Codi del fitxer m5p33.php
 
Aspectes que s'han de tenir en compte
 
En casos extrems, us podeu trobar que el servidor de base de dades sigui més lent que el servidor web; aquest fet pot sobrecarregar molt el sistema si hi ha moltes sessions obertes. Aleshores, utilitzareu la sentència CacheExecute, en comptes d'Execute, ja que, a diferència de l'anterior, manté les dades un temps determinat sobre un directori del servidor, i si el client intenta fer la mateixa consulta, no se sol·licita a la base de dades, sinó que es descarrega del fitxer guardat, sempre que no se superi el temps establert de memòria cau (cache), que el definim a cacheSecs.
 

Veure codi

Executar codi

<?php
/*-----------------------------------------------------------------
* Mòdul: 5 Pràctica: 3 Fitxer: m5p34.php
* Autor: D116 Data:
* Descripció: Exemple de memòria cahé de resultat de la BD
* 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 34</title>
</head><body>

<?php
include("../adodb/adodb.inc.php");
include("../adodb/tohtml.inc.php"); //Necessari per Rs2Html()
include("./connexio/tutoria_con.php");

$ADODB_CACHE_DIR ='./'; // Directori per guardar dades cache
$ConTut->cacheSecs = 15; // Guarda a la cache 15 segons les dades
// de la consulta

$sql="select codi,nom,cognom1,email, anybaixa from professor";
$recordSet =$ConTut->CacheExecute($sql)or DIE($ConTut->ErrorMsg());

if (!$recordSet->EOF){
rs2html($recordSet); // Automatizació de visualització ADODB
}

$recordSet->Close();
$ConTut->Close();
?>
</body>
</html>

Figura 5.3.4 Codi del fitxer m5p34.php
 
Atenció !
Només utilitzeu CacheExecute amb setències SQL del tipus SELECT, mai sobre una inserció o modificació de dades. En sistemes ràpids, la utilització d'aquest metòde pot provocar un alentiment del sistema.
 
De vegades, es dóna el cas que s'han d'inserir massivament dades sobre una taula, i el mètode d'inserció d'una a una pot provocar un alentiment i/o blocatge temporal de la base de dades.
 
Atenció !
Internament, no totes les bases de dades poden suportar aquesta particularitat. Si és així, la funció fa una emulació, que no es diferencia en temps del mètode habitual. El MySQL no ho suporta, però sí l'Oracle, l'Interbase i alguns ODBC. Consulteu la informació a la documentació referent al mètode Prepare($sql).
 
   
Atenció !
Observeu que les dades que obteniu com a resposta del servidor, en aquest últim exemple, no les assigneu a la variable $resultat, sinó a un altra variable, que s'ha anomenat $recordSet. Aquest nom l'hem possat nosaltres i podria ser qualsevol, però arribats aquí, hem cregut convenient modificar-lo. La paraula recordSet significa "conjunt de registres", que no és més que el resultat que dóna Execute o CacheExecute. I en principi apunta al primer registre que compleix la sentència SQL sol·licitada, tot i que l'objecte $recordSet conté tots els registres que compleixen l'SQL introduïda.
 
Atenció !
També heu pogut observar que s'ha utilitzat una funció de lADODB anomenada rs2html, que si llegiu literalment diu: "recordset to html". Amb aquesta sola instrucció podeu simplificar el codi, per la visualització de dades en pantalla. A la pròxima pràctica se'n parlarà amb més detall.
   
 
Amunt
Pràctica
pràctica_1
Pràctica_2
Pràctica_3
Pràctica_4
Exercicis
Exercicis