Diferència entre revisions de la pàgina «PHP MySQL select»
(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 | + | #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 == | ||
− | + | 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: | |
− | + | <syntaxhighlight lang="php"> | |
− | + | <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> | ||
− | + | <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) | ||
− | + | $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 | ||
− | + | 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 | + | $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 = | + | $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: ' . | + | $message = 'Consulta invàlida: ' . mysqli_error($conn) . "\n"; |
$message .= 'Consulta realitzada: ' . $consulta; | $message .= 'Consulta realitzada: ' . $consulta; | ||
die($message); | 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 | <?php | ||
# (3.2) Bucle while | # (3.2) Bucle while | ||
− | while( $registre = | + | 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[" | + | echo "\t\t<td>".$registre["Name"]."</td>\n"; |
− | echo "\t\t<td>".$registre[' | + | echo "\t\t<td>".$registre['CountryCode']."</td>\n"; |
− | echo "\t\t<td>".$registre[" | + | echo "\t\t<td>".$registre["District"]."</td>\n"; |
− | echo "\t\t<td>".$registre[' | + | 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"; | ||
} | } | ||
?> | ?> | ||
− | + | <!-- (3.6) tanquem la taula --> | |
</table> | </table> | ||
</body> | </body> | ||
− | + | </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''' |
− | *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''' |
− | *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 | + | *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:
- Connexió a la BBDD
- Crear i enviar query
- 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.
Contingut
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:
- Connexió
- Connectar a MySQL amb l'ordre mysql_connect()
- Triar la BBDD de treball amb mysql_select_db()
- Crear i enviar consulta (query):
- Crear la consulta i desar-la en una variable, típicament $query = "SELECT ... FROM ... WHERE ..."
- Enviar la consulta al sistema (SGBD) per obtenir el resultat amb mysql_query()
- 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)
- Obtenir resultats i mostrar-los:
- Obrim taula HTML amb <table> i la capçalera amb <thead>
- 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;
- Obrim la fila de la taula HTML amb <tr>
- 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>
- Tanquem la fila de la taula HTML amb </tr>
- 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:
- 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.
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:
- 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.
- join2.php: llistat de les UFs de l'assignatura "Sistemes Operatius Monolloc".
- join3.php: llistat d'assignatures amb la seva titulació.
- join4.php: nombre de matrícules del curs 2009-2010
- join5.php: recompte de matrícules per curs.
- join6.php: recompte de UFs per assignatura.
- join7.php: llistat de les UFs de les assignatures de SMX, ordenades per número del mòdul (assignatura).
- join8.php: llistat de les assignatures en què està matriculat en Pere Escribano.
- join9.php: llistat de qualificacions (assigntura i UF) de l'alumne Òscar Tabuada.
- join10.php: llistat de qualificacions aprovades dels alumnes del curs 2009-2010.
- join11.php: mitjana de les qualificacions de l'alumne David Dalmau.
- join12.php: llistat d'alumnes aprovats de les UFs de l'assignatura "Sistemes Operatius Monolloc".