23. Recerques i recuperació de valors
Índex
Operacions bàsiques de recerca en una taula
Quan volem obtenir dades contingudes en una taula, cal fer dues operacions successives:
- Delimitar les dades que ens interessen (tota la taula, només les files que compleixen tal condició, només tal i tal columna, etc.). Això s'aconsegueix amb la funció mysql_query().
- Col·locar les dades obtingudes, fila a fila, en un vector associatiu intel·ligible per a PHP. Això s'aconsegueix amb la funció mysql_fetch_array().
De moment cal saber que si volem obtenir totes les dades de la taula, l'argument de mysql_query() és
- ("SELECT * FROM Nom_de_la_taula")
Explotació de les dades obtingudes
Es fa servir una combinació de la funció mysql_fetch_array(), que llegeix les dades obtingudes i les col·loca en un vector, i el bucle while(), que en fa la lectura seqüencial:
- $dades = mysql_query("Instruccions que delimitin la recerca",$con);
- while($fila = mysql_fetch_array($dades)){
- echo $reg['camp_1'];
- echo $reg['camp_2'];
- ...
- }
Les denominacions $dades i $fila són arbitràries.
El programa que acabem d'indicar presentaria seqüencialment les dades, sense distinció de files ni de columnes, ni tan sols salts de línia.
Però podem, per exemple, situar un echo "<table>" abans de la funció mysql_query() i un echo "</table>" al final, iniciar cada bucle amb un echo "<tr>" i concloure'l amb un echo "</tr>" i envoltar cada valor amb <td> ... </td>, amb la qual cosa obtindrem una presentació en forma de taula. És el que fem en l'exemple següent.
També podríem situar les dades en una estructura <ul><li>..., o qualsevol altra.
O podríem, també, no presentar les dades, sinó fer-les servir a conveniència en altres parts del programa.
- Taula MySQL anomenada celtiques, amb els camps Id, Llengua, Ambit i Notes.
- <?php
-
- $con=mysql_connect("localhost","xxxxxxxxxx","xxxxxx") or
- die("Ha fallat la connexió"); // Connexió amb l'espai MySQL
- mysql_select_db("albert_curs",$con) or
- die("Ha fallat la tria de la base de dades"); // Tria de la Base de Dades
- $dades = mysql_query("SELECT * FROM celtiques") or
- die("Problemes de lectura"); // Lectura de totes les dades
- while($fila = mysql_fetch_array($dades)){ // Dades traslladades al vector $fila
- echo "<tr>";
- echo "<td class='e'>" . $fila['Id'] . "</td>"; // Aprofitament de les dades
- echo "<td class='e'>" . $fila['Llengua'] . "</td>";
- echo "<td class='e'>" . $fila['Ambit'] . "</td>";
- echo "<td class='e'>" . $fila['Notes'] . "</td>";
- echo "</tr>";
- }
- mysql_close($con); // Tancar la connexió
-
- ?>
Nota: per raons òbvies, el nom d'usuari i la contrassenya han estat emmascarats en aquesta reproducció de l'exemple.
Vegeu-ne el resultat.
Obtenció de les dades
Per a l'obtenció de les dades cal establir les condicions de la recerca; per a això es fan servir els arguments de la funció mysql_query(), que corresponen a les preguntes bàsiques de la recerca. Són els que s'exposen a continuació:
| SELECT |
Quins camps dels registres seleccionats interessen? |
| FROM |
A quina taula hi ha les dades desitjades? |
| WHERE |
Quins registres se n'han de seleccionar? (tal camp ha de tenir tal valor) |
| ORDER BY |
En quin ordre cal disposar els registres seleccionats? |
Aquestes operacions tenen el format general
- $resultat = mysql_query("SELECT ... FROM ... [ WHERE ... ORDER BY ..." ]);
SELECT i FROM són obligatoris; els altres paràmetres són optatius.
SELECT ... FROM ...
El format general és el següent:
- SELECT nom_de_camp, [nom_de_camp, nom_de_camp] FROM nom_de_la_taula
És obligatori almenys un nom de camp. L'ordre en què s'indiquen els noms dels camps és rellevant per al resultat (i no té res a veure amb l'ordre dels camps en la taula).
Si volem tots els camps, podem indicar
- SELECT * FROM nom_de_la_taula
i en aquest cas els camps es donen en l'ordre en què es troben dins la taula.
WHERE
El format general de WHERE és el següent:
- WHERE camp operador valor
El valor pot ésser indicat literalment o mitjançant una variable. En un i altre cas cal respectar el caràcter textual o numèric del camp; en el primer cas, cal usar les cometes, encara que estigui representat per una variable.
Els operadors de WHERE són
| = |
Igualtat |
| != |
Desigualtat |
| > |
Més gran que |
| < |
Més petit que |
| >= |
Més gran o igual que |
| <= |
Mes petit o igual que |
| BETWEEN |
Valors compresos entre dos extrems, inclosos aquests |
| LIKE |
Valors que contenen el patró indicat |
| AND |
Uneix dues o més condicions concurrents |
| OR |
Uneix dues o més condicions alternatives |
| IS NOT NULL |
Tots els valors no nuls |
Si volem tots els registres de la taula, simplement prescindim del paràmetre WHERE.
- Taula MySQL anomenada diccionari, amb els camps Id, cat i eng.
- Document HTML amb un formulari
- <?php
-
- ...
-
- $terme = $_POST['cat']; // Recull la dada tramesa pel formulari
-
- ...
-
- $dades = mysql_query("SELECT Id, cat, eng FROM diccionari WHERE cat = '$terme'") or
- die("Problemes de lectura"); // S'imposa una condició d'igualtat
- while($fila = mysql_fetch_array($dades)){
- echo "<p>" . $terme . ": " . $fila['eng'] . "</p><br />"; // Presentació de les dades
- }
-
- ...
-
- ?>
Vegeu-ne el resultat.
Ús de fragments de cadena a WHERE
Podem fer servir fragments de cadena (mat, tar o taró en lloc de mataró); en aquest cas cal fer servir el comodí %:
- $tros_camp_n="%" . $_POST[nom] . "%";
- $registres=mysql_query("select camp_1, camp_2, camp_3, camp_4 from nom_de_taula where camp_n LIKE '$tros_camp_n'",$con)
- or die("Problemes en el select");
- Taula MySQL anomenada diccionari, amb els camps Id, cat i eng.
- Document HTML amb un formulari
- <?php
-
- ...
-
- $terme = $_POST['cat'] . '%'; // Recull la dada tramesa pel formulari i hi afegeix el comodí
- ...
-
- $dades = mysql_query("SELECT Id, cat, eng FROM diccionari WHERE cat LIKE '$terme'") or
- die("Problemes de lectura"); // S'imposa una condició de coincidència amb el patró
- while($fila = mysql_fetch_array($dades)){
- echo "<p>" . $fila['cat'] . ": " . $fila['eng'] . "</p><br />"; // Presentació de les dades
- }
-
- ...
-
- ?>
Vegeu-ne el resultat.
ORDER BY
Amb ORDER BY ordenem els registres:
Per exemple,
- SELECT Nom, Cognoms FROM Alumnes WHERE Curs = 'preparatori' ORDER BY Cognoms
Podem ordenar d'acord amb dos o més camps; en aquest cas els noms dels camps es separen amb comes.
Si s'afegeix al final el modificador DESC, l'ordenació serà inversa.
- Taula MySQL anomenada pins.
- <?php
-
- ...
-
- $dades = mysql_query("SELECT Id, Nom FROM pins ORDER BY Nom") or
- die("Problemes de lectura"); // Selecciona l'identificador i el nom a tots els registres, i els ordena alfabèticament
- while($fila = mysql_fetch_array($dades)){
- echo "<a href='23c.php?id=" . $fila['Id'] . "' >" . $fila['Nom'] . "</a><br />"; // Presenta les dades en forma d'enllaços, amb Id a punt per a ésser tramès via GET.
- }
- mysql_close($con); // Tancar la connexió
-
- ?>
- <?php
-
- ...
-
- $dades = mysql_query("SELECT Id, Nom, NC, Ambit FROM pins WHERE id = $n") or
- die("Problemes de lectura"); // Cerca només un registre, l'identificat pel valor d'id
- while($fila = mysql_fetch_array($dades)){
- echo "<h3>" . $fila['Nom'] . " <em>(" . $fila['NC'] . ")</em></h3>"; // Presentació dels camps Nom i NC
- echo "<p>" . $fila['Ambit'] . "</p>"; // Presentació del camp Ambit
- }
- mysql_close($con);
-
- ?>
Vegeu-ne el resultat.