CONSULTES MILLORADES A BASE DE DADES MySQL AMB PHP.

 

Ara que coneixem d'una manera bàsica com interactuar amb una base de dades MySQL fent ús de diferents funcions o instruccions PHP, aprofundirem una mica més en aquestes consultes per, per exemple, recórrer tots els registres de la taula agenda i visualitzar-los de manera correcta (recordar que en apartats anteriors del curs només es mostraven els valors per al primer registre que es trobava a la base de dades).

Per aconseguir el nostre objectiu ens basarem en el mateix codi que ja hem utilitzat anteriorment i realitzarem una sèrie de canvis.

Per començar, afegeix algunes files més a la taula agenda de la base de dades perquè quedi així:

nom

cognoms

direccion

telèfon

edat

alçada

Manuel Jesús

López de la Rosa

C/ Joan Baptista Nº 3

658954875

32

1.80

Maria

Manzano Caps

C/ Arc del triomf Nº 7

695001002

19

1.99

Pedro Somoza Castro C/ Solera nº88, B 88834321 44 1.66
Juana Pérez Rozas AV Luarcato # 22 888111222 22 1.77

El primer que anem a tractar de veure és com una invocació de mysqli_fetch_array retorna un registre (una fila) dels resultats obtinguts en una consulta a la taula de la base de dades. Què fila dels resultats és la que ens torna? Si la fila ha estat establerta usant mysqli_data_seek, ens retornarà la fila que hàgim especificat. Si no fem servir mysqli_data_seek ens torna la primera fila dels resultats.

Si mysqli_fetch_array torna a ser invocada sense especificar la fila a extreure, torna el següent registre o fila, seguint l'ordre que tenen els resultats de la consulta. Diem que mysqli_fetch_array té vinculat un punter o referència a la fila que ha de tornar. Aquest punter o referència pot definir usant data seek, o en cas de no definir-se, és inicialment 0 (el que significa que ens tornarà inicialment la fila 0). Un cop invocada mysqli_fetch_array i retornats els resultats de la fila 0, el punter queda apuntant al següent registre, és a dir, a la fila 1. Aquest procés es pot repetir tantes vegades com es vulgui i per cada trucada mysqli_fetch_array va avançant una fila. Quan ja no hi ha més files en els resultats de la consulta la funció retorna NULL (no hi ha resultats).

Per comprendre el funcionament que hem descrit executa aquest codi (que podem anomenar "brut", però no hi fa per l'eficiència del codi, centra't en entendre el funcionament de mysqli_fetch_array). Recorda que has de canviar les dades relacionades amb la base de dades (nom de servidor, nom de base de dades, usuari, password) i escriure els que estiguis usant tu.

<Html> <head> <meta charset = "utf-8"> </head>

<ody>

<? Php

// Exemple

mostrarDades function($resultats) {

if($resultats! = NULL) {

echo "- Nom:" $resultats['nom'] "<br/>";.

echo "- Cognoms:". $resultats['cognoms']. "<br/>";

echo "- Adreça:" $resultats['adreça'] "<br/>";.

echo "- Telèfon:" $resultats['telefon'] "<br/>";.

echo "- Edat:". $resultats['edat']. "<br/>";}

else {echo "No hi ha mes <br/> Dades: <br/>". $resultats;}

}

$link=mysqli_connect ("sql203.byethost7.com","b7_10356956","*****");

mysqli_select_db($enllaç, "b7_10356956_mevabasededades");

$titlles=$link-> query("SET NAMES 'utf8'"); // Perquè es mostrin els accents correctament

$resultat=mysqli_query($enllaç,"SELECT * FROM agenda");

$extret1=mysqli_fetch_array($resultat);

mostrarDades($extret1);

$extret2=mysqli_fetch_array($resultat);

mostrarDades($extret2);

$extret3=mysqli_fetch_array($resultat);

mostrarDades($extret3);

$extret4=mysqli_fetch_array($resultat);

mostrarDades($extret4);

$extret5=mysqli_fetch_array($resultat);

mostrarDades($extret5);

$extret6=mysqli_fetch_array($resultat);

mostrarDades($extret6);

mysqli_free_result($resultat);

mysqli_close($enllaç);

?>

</body>

</html>

En aquest exemple només tenim quatre registres. Si tinguéssim més registres el llistat s'allargaria per mostrar-los tots ells. Què passa si la informació existent en base de dades comprèn molts registres? En aquest cas la informació s'haurà emmagatzemat en memòria i això consumeix recursos del sistema. Per alliberar aquesta memòria s'utilitza la instrucció mysqli_free_result($result);

Escriu ara aquest codi i fixa't com hem sintetitzat el procés eliminant variables auxiliars. Recorda que has de canviar les dades relacionades amb la base de dades (nom de servidor, nom de base de dades, usuari, password) i escriure els que estiguis usant tu.

<html> <head> <meta charset = "utf-8"> </ head>

<body>

<? Php

// Exemple

mostrarDades function($resultats) {

if($resultats!=NULL) {

echo "- Nom:" $resultats['nom'] "<br/>";.

echo "- Cognoms:". $resultats['cognoms']. "<br/>";

echo "- Adreça:" $resultats['adreça'] "<br/>";.

echo "- Telèfon:" $resultats['telefon'] "<br/>";.

echo "- Edat:". $resultats['edat']. "<br/>";}

else {echo "No hi ha <br/> Mas dades !!! <br/>";}

}

$link=mysqli_connect ("sql203.byethost7.com","b7_10356956","*****");

mysqli_select_db($ enllaç, " b7_10356956_mibasededatos ");

$titlles=$link->query("SET NAMES 'utf8'"); // Perquè es mostrin els accents correctament

$resultat=mysqli_query($enllaç,"SELECT * FROM agenda");

mostrarDades(mysqli_fetch_array($resultat));

mostrarDades(mysqli_fetch_array($resultat));

mostrarDatos (mysqli_fetch_array($resultat));

mostrarDades(mysqli_fetch_array($resultat));

mostrarDades(mysqli_fetch_array($resultat));

mostrarDades(mysqli_fetch_array($resultat));

mysqli_free_result($resultat);

mysqli_close ($enllaç);

?>

</body>

</html>

Fixa't com mysqli_fetch_array($result) ens torna un array amb les dades d'una fila de les obtingudes com a resultat i cada vegada que ho invoquem ens torna la següent fila fins que ja no existeixen més files de resultats, moment en què ens retorna NULL o buit.

Amb una expressió com mostrarDatos (mysqli_fetch_array($result)); estem passant-li a la funció mostrarDatos l'array que ens retorna mysqli_fetch_array. Si la consulta ens ha 4 files, podem fer 4 invocacions obtenint en cada invocació una fila. En la cinquena invocació, ja obtenim NULL (buida) com a resultat.

 

 

ÚS DE WHILE PER TREURE TOTS ELS RESULTATS D'UNA CONSULTA

Fins ara hem tractat de comprendre el funcionament de mysqli_fetch_array. Però òbviament anar recuperant resultats un a un no resulta eficient. Pensa que el resultat d'una consulta poden ser centenars o milers de files i no seria eficient escriure línia a línia una extracció de dades.

Anem a recórrer per tant a crear un bucle de manera que s'extreguin de forma automatitzada tots els registres que ens retorna una consulta.

La sintaxi que emprarem és d'aquest tipus:

while ($fila=mysqli_fetch_array($resultat)) {

// Operacions amb els resultats que tenim en $fila

}

Aquesta expressió és una forma compacta on es fan diverses coses al mateix temps. D'una banda, s'executa $fila=mysqli_fetch_array($result) amb la qual cosa $fila pren un valor que pot ser un array resultat o buit.

Després s'avalua el while. while ($ variable) el que fa és entrar al bucle si $variable existeix (no està buit). while ($fila=mysqli_fetch_array($result)) dóna lloc a l'entrada al bucle mentre no s'hagin extret totes les files del resultat.

Aquesta expressió sintètica és útil perquè ens permet recórrer moltes files escrivint un mínim de codi. També podríem escriure això:

$hahaResultats=true; // Forcem l'entrada al bucle

while($hihaResultats==true) {

$fila=mysqli_fetch_array($resultat);

if($fila){// operacions a realitzar

} Else {$hihaResultats=false;}

}

O també això:

while(($fila=mysqli_fetch_array($resultat))!=NULL) {

// Operacions a realitzar

}

De les diverses alternatives plantejades la que requereix menys codi i un cop s'entén resulta més clara és while ($fila=mysqli_fetch_array($result)), per això és la que farem servir. Escriu el següent codi i comprova els resultats. Recorda que has de canviar les dades relacionades amb la base de dades (nom de servidor, nom de base de dades, usuari, password) i escriure els que estiguis usant tu.

D'una forma o una altra cada vegada que invoquem la funció mysql_fetch_array ($result) obtenim un array associatiu amb índex de l'array els noms de les columnes, per exemple $fila['nom'], $fila['cognoms'], $fila['adreça'], $fila['telefon'], $fila['edat'], $fila['altura']. Si ja s'han extret totes les files es produeix la sortida del bucle while. Els programadors solen anomenar la variable on es van extraient els resultats $row (en anglès, row és fila). Amb mysql_fetch_array($result) també podem accedir a través d'índexs numèrics, com ara $fila[0], $fila[1], $fila[2], $fila[3], $fila[4], $fila[5].

<html> <head> <meta charset = "utf-8"> </head>

<body>

<? Php

// Exemple

mostrarDatos funció ($ Resultats) {

if ($resultats!=NULL) {

echo "- Nom:" $resultats ['nom'] "<br/>";.

echo "- Cognoms:". $resultats ['cognoms']. "<br/>";

echo "- Direcció:" $resultats ['adreça'] "<br/>";.

echo "- Telèfon:" $resultats ['telefon'] "<br/>";.

echo "- Edat:". $resultats ['edat']. "<br/>";

echo "********************************** <br/>";}

else {echo "No hi ha <br/> Mas dades !!! <br/>";}

}

$link=mysqli_connect("sql203.byethost7.com", "b7_10356956", "*****");

mysqli_select_db($ enllaç,"b7_10356956_mibasededatos");

$titlles=$link->query("SET NAMES 'utf8'"); // Perquè es mostrin els accents correctament

$resultat=mysqli_query($enllaç,"SELECT * FROM agenda");

while($fila=mysqli_fetch_array($resultat)) {

mostrarDades($fila);

}

mysqli_free_result($resultat);

mysqli_close($enllaç);

?>

</body> </html>

El resultat esperat és que es mostrin per pantalla tots els resultats de la consulta:

- Nom: Manuel Jesús - Cognoms: López de la Rosa - Adreça: C / Joan Baptista Nº 3

- Telèfon: 658954875 - Edat: 32

**********************************

- Nom: Maria - Cognoms: Manzano Cabezas - Adreça: C / Arc del triomf Nº 7

- Telèfon: 695001002 - Edat: 19

**********************************

- Nom: Pedro - Cognoms: Somoza Castro - Adreça: C / Solera nº88, B

- Telèfon: 88834321 - Edat: 44

**********************************

- Nom: Juana - Cognoms: Pérez Rozas - Adreça: Avda. Luarcato nº22

- Telèfon: 888111222 - Edat: 22

**********************************

 

 

SINTAXI NO mysqli (NO RECOMANADA)

Recordar que si estem revisant codi antic o en servidors no actualitzades ens podem trobar que no s'usen les funcions de tipus mysqli sinó les mysql. A tall d'exemple de com seria aquesta sintaxi, mostrem aquest codi:

<Html> // Exemple php amb bases de dades

<body>

<? Php

$enllaç=mysql_connect ("sql203.byethost7.com","b7_10356956","*****");

mysql_select_db("b7_10356956_mibasededatos",$enllaç);

$resultat=mysql_query("SELECT * FROM agenda",$enllaç);

//Comença un bucle que llegirà tots els registres existents

while($row=mysql_fetch_array($resultat)) {

// $row és un array amb tots els camps existents a la taula

echo "<hr>" ;

echo "Nom:" $row['nom'] .. "a" ;

echo "Cognoms:" $row['cognoms'] .. "a" ;

echo "Adreça:" $row['adreça'] .. "a" ;

echo "Telèfon:" $row['telefon'] .. "a";

echo "Edat:" $row['edat'] .. "a" ;

echo "Alçada:" $row['altura'] .. "a" ;

} // fi del bucle d'instruccions

mysql_free_result($resultat); // Alliberem els registres

mysql_close($link); // Tanquem la connexió amb la base de dades

echo "<hr>" ;

?>

</body>

</html>

 

 

EXERCICI 1

Utilitzant la taula agenda que hem emprat en els exemples i funcions per a maneig de cadenes PHP, realitza una consulta a la base de dades per extreure tots els noms i determina quants noms a la base de dades comencen per M.

Exemple de resultats a obtenir: A la base de dades dels noms que comencen per M són: 2

 

EXERCICI 2

Utilitzant la taula << ciutats >> que hem utilitzat per a exercicis de lliuraments anteriors del curs, el contingut era:

identificació

ciutat

pares

habitants

superfície

tieneMetro

1

Mèxic DF

Mèxic

555.666

23.434,34

1

2

Barcelona

Espanya

444.333

1111.11

0

3

Buenos Aires

Argentina

888.111

333.33

1

4

Medellín

Colòmbia

999.222

888.88

0

5

Lima

Perú

999.111

222.22

0

6

Caracas

Veneçuela

111.222

111.11

1

7

Santiago

Xile

777.666

222.22

1

8

Antiga

Guatemala

444.222

877.33

0

9

Quito

Equador

333111

999.11

1

10

L'Havana

Cuba

111.222

333.11

0

Crea un arxiu php on es realitzi una consulta a la base de dades per extreure totes les dades de la taula ia continuació calcula la suma d'habitants de tots els països i quantes d'aquestes ciutats tenen metro. Mostra el resultat per pantalla.

Exemple de resultats a obtenir:

La suma d'habitants de Mèxic DF, Barcelona, ​​Buenos Aires, Medellín, Lima, Caracas, Santiago, Antiga, Quito i l'Havana és: 5663886 habitants

D'aquestes ciutats tenen metro: 5 ciutats.