Diferència entre revisions de la pàgina «PHP MySQL select»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(tags #fipinfor)
 
(Hi ha 14 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
 
Utilitzarem les [http://es2.php.net/manual/en/book.mysql.php funcions PHP] per accedir al SGBD MySQL. Consulteu-les [http://es2.php.net/manual/en/book.mysql.php aquí].
 
Utilitzarem les [http://es2.php.net/manual/en/book.mysql.php funcions PHP] per accedir al SGBD MySQL. Consulteu-les [http://es2.php.net/manual/en/book.mysql.php aquí].
  
A grans trets, el proceś general per atacar un SGBD és aquest:
+
#FpInfor #Daw #DawMp07 #DawMp07Uf3 #DawMp07Uf03
 +
 
 +
A grans trets, el procés general per atacar un SGBD és aquest:
 
#Connexió a la BBDD
 
#Connexió a la BBDD
 
#Crear i enviar query
 
#Crear i enviar query
Línia 41: Línia 43:
  
 
== Codi font de l'exemple ==
 
== Codi font de l'exemple ==
Utilitzarem l'exemple de la base de dades del videoclub [[Fitxer:Videoclub.sql]].
+
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
  
Per crear i importar la base de dades d'exemple pots consultar [[SQL creacio]].
+
Examineu a fons i proveu aquest codi:
  
 
+
<syntaxhighlight lang="php">
<html>
+
<html>
 
  <head>
 
  <head>
 
  <title>Exemple de lectura de dades a MySQL</title>
 
  <title>Exemple de lectura de dades a MySQL</title>
Línia 58: Línia 61:
 
  </style>
 
  </style>
 
  </head>
 
  </head>
 
+
 
  <body>
 
  <body>
  <nowiki><h1>Exemple de lectura de dades a MySQL</h1></nowiki>
+
  <h1>Exemple de lectura de dades a MySQL</h1>
 
+
 
  <?php
 
  <?php
 
  # (1.1) Connectem a MySQL (host,usuari,contrassenya)
 
  # (1.1) Connectem a MySQL (host,usuari,contrassenya)
  mysql_connect('localhost','enric','enric');
+
  $conn = mysqli_connect('localhost','enric','enric123');
 
   
 
   
 
  # (1.2) Triem la base de dades amb la que treballarem
 
  # (1.2) Triem la base de dades amb la que treballarem
  mysql_select_db('enric_video');
+
  mysqli_select_db($conn, 'world');
+
 
  # (2.1) creem el string de la consulta (query)
 
  # (2.1) creem el string de la consulta (query)
  $consulta = "SELECT * FROM films;";
+
  $consulta = "SELECT * FROM city;";
 
   
 
   
 
  # (2.2) enviem la query al SGBD per obtenir el resultat
 
  # (2.2) enviem la query al SGBD per obtenir el resultat
  $resultat = mysql_query($consulta);
+
  $resultat = mysqli_query($conn, $consulta);
+
 
  # (2.3) si no hi ha resultat (0 files o bé hi ha algun error a la sintaxi)
 
  # (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
 
  #    posem un missatge d'error i acabem (die) l'execució de la pàgina web
 
  if (!$resultat) {
 
  if (!$resultat) {
     $message  = 'Consulta invàlida: ' . mysql_error() . "\n";
+
     $message  = 'Consulta invàlida: ' . mysqli_error($conn) . "\n";
 
     $message .= 'Consulta realitzada: ' . $consulta;
 
     $message .= 'Consulta realitzada: ' . $consulta;
 
     die($message);
 
     die($message);
 
  }
 
  }
 
  ?>
 
  ?>
+
  <nowiki><!-- (3.1) aquí va la taula HTML que omplirem amb dades de la BBDD --></nowiki>
+
  <!-- (3.1) aquí va la taula HTML que omplirem amb dades de la BBDD -->
  <nowiki><table></nowiki>
+
  <table>
  <nowiki><!-- la capçalera de la taula l'hem de fer nosaltres --></nowiki>
+
  <!-- la capçalera de la taula l'hem de fer nosaltres -->
  <nowiki><thead><td colspan="5" align="center" bgcolor="cyan">Llistat de films disponibles</td></thead></nowiki>
+
  <thead><td colspan="4" align="center" bgcolor="cyan">Llistat de ciutats</td></thead>
 
  <?php
 
  <?php
 
  # (3.2) Bucle while
 
  # (3.2) Bucle while
  while( $registre = mysql_fetch_assoc($resultat) )
+
  while( $registre = mysqli_fetch_assoc($resultat) )
 
  {
 
  {
 
  # els \t (tabulador) i els \n (salt de línia) son perquè el codi font quedi llegible
 
  # els \t (tabulador) i els \n (salt de línia) son perquè el codi font quedi llegible
Línia 96: Línia 99:
 
  # (3.3) obrim fila de la taula HTML amb <tr>
 
  # (3.3) obrim fila de la taula HTML amb <tr>
 
  echo "\t<tr>\n";
 
  echo "\t<tr>\n";
 
+
 
  # (3.4) cadascuna de les columnes ha d'anar precedida d'un <td>
 
  # (3.4) cadascuna de les columnes ha d'anar precedida d'un <td>
 
  # després concatenar el contingut del camp del registre
 
  # després concatenar el contingut del camp del registre
 
  # i tancar amb un </td>
 
  # i tancar amb un </td>
  echo "\t\t<td>".$registre["titol_original"]."</td>\n";
+
  echo "\t\t<td>".$registre["Name"]."</td>\n";
  echo "\t\t<td>".$registre['titol_traduit']."</td>\n";
+
  echo "\t\t<td>".$registre['CountryCode']."</td>\n";
  echo "\t\t<td>".$registre["director"]."</td>\n";
+
  echo "\t\t<td>".$registre["District"]."</td>\n";
  echo "\t\t<td>".$registre['productora']."</td>\n";
+
  echo "\t\t<td>".$registre['Population']."</td>\n";
+
 
  # (3.5) tanquem la fila
 
  # (3.5) tanquem la fila
 
  echo "\t</tr>\n";
 
  echo "\t</tr>\n";
 
  }
 
  }
 
  ?>
 
  ?>
   <nowiki><!-- (3.6) tanquem la taula --></nowiki>
+
   <!-- (3.6) tanquem la taula -->
 
  </table>
 
  </table>
 
  </body>
 
  </body>
 
+
</html>
</html>
+
</syntaxhighlight>
 
 
  
 
== Exercicis ==
 
== Exercicis ==
 
Posa en marxa aquest exemple en la teva màquina Linux. Hauràs de:
 
Posa en marxa aquest exemple en la teva màquina Linux. Hauràs de:
*Instal·lar apache2 i php5
+
* Instal·lar apache2 i php5
*Comproveu que el servidor Apache funciona apuntant el ''browser'' a http://localhost
+
* Comproveu que el servidor Apache funciona apuntant el ''browser'' a http://localhost
*Rearrencar apache amb
+
* Rearrencar apache amb
*:    '''$> sudo apache2ctl restart'''
+
*:    '''$ 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]]
+
* 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
+
* Si no us deixa haureu de donar permisos a la carpeta per poder escriure amb
*:    '''$> sudo chmod 777 /var/www'''
+
*:    '''$ sudo chmod 777 /var/www'''
*Copiar i enganxar el codi PHP de l'exemple de més amunt a l'arxiu /var/www/ex1.php
+
*:    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:
 +
# Pàgina 1: Comença per fer un llistat dels països utilitzant la taula COUNTRY.
 +
# 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.
 +
# 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.
 +
# Puja aquest projecte a Github i crea un README.md que expliqui com posar en marxa l'exercici perquè funcioni correctament.
 +
# 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.
 +
# Afegeix les banderes dels països al formulari (caldrà cercar-les per internet).
 +
# Afegeix un formulari que permeti afegir noves ciutats. Els països s'han de poder entrar amb un desplegable.
 +
 
 +
<br>
  
 +
=== Exercicis de queries ===
  
Realitza els següents exercicis amb la [[Fitxer:Ufs.sql base de dades de UFs]]. Si no saps com crear-la pots consultar-ho a [[SQL_creacio]].
+
Realitza els següents exercicis amb la [[Fitxer:Ufs.sql|base de dades de UFs]]. 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.
 
*'''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.
 
*'''ex3.php''': mostra les assignatures de la ESO.
 
*'''ex4.php''': mostra el nom dels tots els alumnes.
 
*'''ex4.php''': mostra el nom dels tots els alumnes.
  
Exercicis amb el videoclub:
+
Exercicis amb el videoclub [[Fitxer:Videoclub.sql]]:
 
*'''ex5.php''': mostra tots els lloguers ordenats descendentment per data de sortida.
 
*'''ex5.php''': mostra tots els lloguers ordenats descendentment per data de sortida.
 
*'''ex6.php''': mostra els diferents gèneres disponibles ordenats alfabèticament.
 
*'''ex6.php''': mostra els diferents gèneres disponibles ordenats alfabèticament.
Línia 140: Línia 164:
 
=== Exercicis amb JOIN ===
 
=== Exercicis amb JOIN ===
 
IMPORTANT:
 
IMPORTANT:
*Tituleu adeqüadament cada pàgina perquè quedi clar quina consulta estem realitzant.
+
*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.
 
*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.
 
*A totes les consultes ha d'aparèixer, com a mínim, totes les dades que apareixen a l'enunciat.

Revisió de 18:35, 11 nov 2021

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[modifica]

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[modifica]

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[modifica]

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[modifica]

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[modifica]

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[modifica]

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".