PHP MySQL select

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Utilitzarem les funcions PHP per accedir al SGBD MySQL. Consulteu-les aquí.

#FpInfor #Daw #DawMp07 #DawMp07Uf3 #DawMp07Uf03

A grans trets, el procés general per atacar un SGBD és aquest:

  1. Connexió a la BBDD
  2. Crear i enviar query
  3. Obtenir resultats i mostrar-los per pantalla


En aquest darrer pas (obtenir i mostrar resultats) cal fixar-se especialment en l' estructura de control que necessitarem:

  • Bucle de registres: (while) iterarà per cadascuna de les files de la taula. Haurà de ser un bucle tipus while ja que no sabem quan arribarem a la darrera fila.


Procés detallat per extreure dades de MySQL

Per obtenir dades d'una taula MySQL i visualitzar-la utilitzant PHP seguirem les següents passes:

  1. Connexió
    1. Connectar a MySQL amb l'ordre mysql_connect()
    2. Triar la BBDD de treball amb mysql_select_db()
  2. Crear i enviar consulta (query):
    1. Crear la consulta i desar-la en una variable, típicament $query = "SELECT ... FROM ... WHERE ..."
    2. Enviar la consulta al sistema (SGBD) per obtenir el resultat amb mysql_query()
    3. Si no hi ha resultat (0 files o bé hi ha algun error a la sintaxi) posem un missatge d'error i acabem l'execució de la pàgina web amb die($missatge)
  3. Obtenir resultats i mostrar-los:
    1. Obrim taula HTML amb <table> i la capçalera amb <thead>
    2. Bucle while pels registres de la taula: com que poden haver-ne varis, farem un bucle (loop). Típicament s'utiltiza un while perquè no sabem quan arribarem a la darrera fila
      (Dins del while) Extreure les dades d'un registre (fila de la BBDD) i emmagatzemar-les en un array amb alguna d'aquestes funcions:
      • mysql_fetch_row(): extreu els camps de la fila en un array numèric clàssic.
        Per exemple: echo $registre[0]
      • mysql_fetch_assoc(): extreu els camps de la fila en un array associatiu.
        Per exemple: echo $registre["titol_original"]
      • mysql_fetch_object(): extreu els camps en un objecte.
        Per exemple: echo $registre->titol_original;
    3. Obrim la fila de la taula HTML amb <tr>
    4. Mostrem dades dins de cel·les d'una taula HTML. Haurem de concatenar diverses cadenes de caràcters:
      • Obrir la cel·la de la taula utiltizant <td>
      • Imprimir resultat amb les dades de l'array. Per exemple, $registre["titol_original"]
      • Tancar la cel·la de la taula utiltizant </td>
    5. Tanquem la fila de la taula HTML amb </tr>
    6. Tanquem la taula amb </table>


Codi font de l'exemple

Per crear i importar la base de dades d'exemple pots consultar SQL creacio. Utilitzarem la BBDD d'exemple "World" que hi ha a la pàgina oficial de MySQL. La podeu descarregar d'aquí:

https://dev.mysql.com/doc/index-other.html

Examineu a fons i proveu aquest codi:

<html>
 <head>
 	<title>Exemple de lectura de dades a MySQL</title>
 	<style>
 		body{
 		}
 		table,td {
 			border: 1px solid black;
 			border-spacing: 0px;
 		}
 	</style>
 </head>
 
 <body>
 	<h1>Exemple de lectura de dades a MySQL</h1>
 
 	<?php
 		# (1.1) Connectem a MySQL (host,usuari,contrassenya)
 		$conn = mysqli_connect('localhost','enric','enric123');
 
 		# (1.2) Triem la base de dades amb la que treballarem
 		mysqli_select_db($conn, 'world');
 
 		# (2.1) creem el string de la consulta (query)
 		$consulta = "SELECT * FROM city;";
 
 		# (2.2) enviem la query al SGBD per obtenir el resultat
 		$resultat = mysqli_query($conn, $consulta);
 
 		# (2.3) si no hi ha resultat (0 files o bé hi ha algun error a la sintaxi)
 		#     posem un missatge d'error i acabem (die) l'execució de la pàgina web
 		if (!$resultat) {
     			$message  = 'Consulta invàlida: ' . mysqli_error($conn) . "\n";
     			$message .= 'Consulta realitzada: ' . $consulta;
     			die($message);
 		}
 	?>
 
 	<!-- (3.1) aquí va la taula HTML que omplirem amb dades de la BBDD -->
 	<table>
 	<!-- la capçalera de la taula l'hem de fer nosaltres -->
 	<thead><td colspan="4" align="center" bgcolor="cyan">Llistat de ciutats</td></thead>
 	<?php
 		# (3.2) Bucle while
 		while( $registre = mysqli_fetch_assoc($resultat) )
 		{
 			# els \t (tabulador) i els \n (salt de línia) son perquè el codi font quedi llegible
  
 			# (3.3) obrim fila de la taula HTML amb <tr>
 			echo "\t<tr>\n";
 
 			# (3.4) cadascuna de les columnes ha d'anar precedida d'un <td>
 			#	després concatenar el contingut del camp del registre
 			#	i tancar amb un </td>
 			echo "\t\t<td>".$registre["Name"]."</td>\n";
 			echo "\t\t<td>".$registre['CountryCode']."</td>\n";
 			echo "\t\t<td>".$registre["District"]."</td>\n";
 			echo "\t\t<td>".$registre['Population']."</td>\n";
 
 			# (3.5) tanquem la fila
 			echo "\t</tr>\n";
 		}
 	?>
  	<!-- (3.6) tanquem la taula -->
 	</table>	
 </body>
</html>

Exercicis

Posa en marxa aquest exemple en la teva màquina Linux. Hauràs de:

  • Instal·lar apache2 i php5
  • Comproveu que el servidor Apache funciona apuntant el browser a http://localhost
  • Rearrencar apache amb
    $ sudo apache2ctl restart
  • Importar la base de dades Fitxer:Videoclub.sql al vostre servidor MySQL. Si no sabeu com fer-ho, consulteu-ho a SQL_creacio
  • Si no us deixa haureu de donar permisos a la carpeta per poder escriure amb
    $ sudo chmod 777 /var/www
    ULL! Aquesta és una mesura molt poc segura. Només ho fem per anar ràpid. No ho feu mai en un servidor en producció. Si voleu poder escriure en un directori d'usuari es recomana activar el mòdul userdir de l'apache amb la comanda
    $> sudo a2enmod userdir
  • Copiar i enganxar el codi PHP de l'exemple de més amunt a l'arxiu /var/www/ex1.php
  • Apunta el browser a la direcció: http://localhost/ex1.php

Opcionalment pots esborrar l'arxiu /var/www/index.html . Així l'apache ens mostrarà els arxius continguts a la carpeta.


Exercici de filtratge amb WORLD

Amplia l'exemple de les ciutats amb la BBDD World de forma que puguem filtrar les ciutats mostrades amb un menú desplegable (SELECT).

Guia:

  1. Pàgina 1: Comença per fer un llistat dels països utilitzant la taula COUNTRY.
  2. La FK que lliga la taula CITY i la taula COUNTRY és el CountryCode. El formulari select (ja sigui desplegable o radio button) ha de mostrar el nom del país, però ha d'enviar el CountryCode com a value a través de GET o POST a la pagina 2.
  3. Pàgina 2: Agafa el país enviat per l'usuari (GET o POST) i fes una query que filtri els resultats de la taula CITY i que només mostri les ciutats del país seleccionat.
  4. Puja aquest projecte a Github i crea un README.md que expliqui com posar en marxa l'exercici perquè funcioni correctament.
  5. Indica també el nom del país de la ciutat. No ens val el CountryCode, volem el nom del país literal (per exemple, no ens val "FRA" sinó que haria de sortir "France"). Per a fer això caldrà que facis un JOIN.
  6. Afegeix les banderes dels països al formulari (caldrà cercar-les per internet).
  7. Afegeix un formulari que permeti afegir noves ciutats. Els països s'han de poder entrar amb un desplegable.


Exercicis de queries

Realitza els següents exercicis amb la Fitxer:Ufs.sql. Si no saps com crear-la pots consultar-ho a SQL_creacio.

  • ex2.php: mostra les assignatures de 2n de SMX. Cal, doncs, tenir instal·lada la base de dades.
  • ex3.php: mostra les assignatures de la ESO.
  • ex4.php: mostra el nom dels tots els alumnes.

Exercicis amb el videoclub Fitxer:Videoclub.sql:

  • ex5.php: mostra tots els lloguers ordenats descendentment per data de sortida.
  • ex6.php: mostra els diferents gèneres disponibles ordenats alfabèticament.


Exercicis amb JOIN

IMPORTANT:

  • Tituleu adequadament cada pàgina perquè quedi clar quina consulta estem realitzant.
  • No val utilitzar IDs al WHERE (per això justament son amb JOIN). Heu de fer servir la paraula o dada tal i com apareix a l'enunciat de cada exercici.
  • A totes les consultes ha d'aparèixer, com a mínim, totes les dades que apareixen a l'enunciat.
    Per exemple, si demanem totes els alumnes matriculats a la ESO ha d'aparèixer no només al nom dels alumnes, sinó també la titulació (ESO).
  • Poseu encapçalament a les columnes.
  • MOLT IMPORTANT: tingueu en compte que quan es fa un select amb join, poden haver camps de diverses taules amb el mateix nom de columna. A l'utiltizar arrays associatius, la clau de l'array amb la que ens adreçem pot estar superposada i llavors només visualitzarem les dades del darrer camp que apareix en els SELECT. Per solucionar-ho, utilitzeu el AS per reanomenar la columna amb un altre nom que us convingui.
    Per exemple, al exercici "join1.php", si fem un "SELECT assignatures.*, professors.* FROM ..." tindrem un conflicte entre les columnes "nom" del professor i el "nom" de l'assignatura. Per poder accedir a les dues dades, cal que les expliciteu totes dues (no valen, doncs, els *) i reanomenar-les a nom_profe i nom_assignautra amb un "AS".


Exercicis:

  1. join1.php: mostra les assignatures que imparteix el professor Enric Mieza.
    Resultat: hauria de sortir-vos només l'assignatura de Muntatge i la de Bases de Dades.
  2. join2.php: llistat de les UFs de l'assignatura "Sistemes Operatius Monolloc".
  3. join3.php: llistat d'assignatures amb la seva titulació.
  4. join4.php: nombre de matrícules del curs 2009-2010
  5. join5.php: recompte de matrícules per curs.
  6. join6.php: recompte de UFs per assignatura.
  7. join7.php: llistat de les UFs de les assignatures de SMX, ordenades per número del mòdul (assignatura).
  8. join8.php: llistat de les assignatures en què està matriculat en Pere Escribano.
  9. join9.php: llistat de qualificacions (assigntura i UF) de l'alumne Òscar Tabuada.
  10. join10.php: llistat de qualificacions aprovades dels alumnes del curs 2009-2010.
  11. join11.php: mitjana de les qualificacions de l'alumne David Dalmau.
  12. join12.php: llistat d'alumnes aprovats de les UFs de l'assignatura "Sistemes Operatius Monolloc".