PHP + bases de dades (Mysql)
Contingut
Objectius
La gran majoria de les aplicacions PHP que tens a l'abast (Wordpress, Joomla, Drupal, Mediawiki,...) treballen juntament amb una base de dades per emmagatzemar la informació. Mysql acostuma ser la base de dades escollida (tot i que es podria utilitzar altres SGBD). Saber connectar-se a una base de dades, inserir informació, consultar, filtrar i presentar la informació és cabdal. Es tracta d'ajuntar tota la potència del PHP amb tots els coneixements que tens de bases de dades relacionals, per poder fer aplicacions professionals.
Documentació
Referència de les funcions disponibles (amb exemples):
- http://php.net/manual/es/book.mysql.php
- http://php.net/manual/es/book.mysqli.php (Extensió millorada: improved)
A aquestes altures ja ets un expert de Mysql, per tant la introducció a Mysql només l'has de repassar. Recorda que vam fer una pràctica per introduir el Mysql:
Desenvolupament
El primer de tot és instal.lar les llibreries necessàries. Suposant que ja tens instal.lat PHP i Mysql, potser encara et falta el connector entre tots dos. A Ubuntu/Debian:
$ sudo apt-get install php-mysql
Farem el curs PHP Mysql de w3schools:
PHP MySQL, que inclou:
- MySQL Introduction: http://www.w3schools.com/php/php_mysql_intro.asp
- MySQL Connect: http://www.w3schools.com/php/php_mysql_connect.asp
- MySQL Create: http://www.w3schools.com/php/php_mysql_create.asp
- MySQL Insert: http://www.w3schools.com/php/php_mysql_insert.asp
- MySQL Select: http://www.w3schools.com/php/php_mysql_select.asp
- MySQL Where: http://www.w3schools.com/php/php_mysql_where.asp
- MySQL Order By: http://www.w3schools.com/php/php_mysql_order_by.asp
- MySQL Update: http://www.w3schools.com/php/php_mysql_update.asp
- MySQL Delete: http://www.w3schools.com/php/php_mysql_delete.asp
- PHP ODBC (no cal fer-ho): http://www.w3schools.com/php/php_db_odbc.asp
Nota. No us limiteu a treballar amb una base de dades local (localhost). Teniu accés a la base de dades langtrainer que està a 192.168.0.15:
$ mysql -h 192.168.0.15 -u alumne -pkeiL2lai -D langtrainer mysql>
Nota: per habilitar els warnings i errors en la pantalla del navegador, llegir Llenguatges_de_guions_de_servidor._PHP._Introducció#Gesti.C3.B3_dels_errors_i_logging
Exemple vist a classe
Inserció, consulta, modificació, consulta, esborrat i consulta a la base de dades langtrainer.
<?php //insert, select, update, select, delete, select $servername = "localhost"; $username = "alumne"; $password = "keiL2lai"; $dbname = "langtrainer"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "insert into word values (13,1,1,'rogue',100,'2016/12/16',NULL)"; if (!mysqli_query($conn, $sql)) echo "Error inserting: " . mysqli_error($conn) . "<br />"; $sql = "insert into translation values (15,2,13,'murri','n',NULL)"; if (!mysqli_query($conn, $sql)) echo "Error inserting: " . mysqli_error($conn) . "<br />"; $sql = "select word,translation from word w,translation t where w.id_word=t.id_word and w.id_language=1"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { // output data of each row while($row = mysqli_fetch_assoc($result)) { echo $row["word"]. " - " . $row["translation"]. "<br />"; } } else { echo "0 results"; } echo "<br />"; $sql = "update translation set translation='murri, pillo, pillastre' where id_translation=15"; if (!mysqli_query($conn, $sql)) echo "Error inserting: " . mysqli_error($conn) . "<br />"; $sql = "select word,translation from word w,translation t where w.id_word=t.id_word and w.id_language=1 and w.id_word=13"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($result); echo $row["word"]. " - " . $row["translation"]. "<br />"; $result = mysqli_query($conn, $sql); echo "<br />"; $sql = "delete from translation where id_translation=15"; if (!mysqli_query($conn, $sql)) echo "Error deleting: " . mysqli_error($conn) . "<br />"; $sql = "delete from word where id_word=13"; if (!mysqli_query($conn, $sql)) echo "Error deleting: " . mysqli_error($conn) . "<br />"; $sql = "select word,translation from word w,translation t where w.id_word=t.id_word and w.id_language=1"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { // output data of each row while($row = mysqli_fetch_assoc($result)) { echo $row["word"]. " - " . $row["translation"]. "<br />"; } } else { echo "0 results"; } mysqli_close($conn); ?>
Protectora d'animals. Formulari complet
A classe hem vist i explicat el següent exemple. És un petit formulari d'una protectora d'animals. Recollim les dades del formulari, i les fiquem en una petita taula de la base de dades. Els problemes que ens hem trobat són:
- el valor del checkbox (yes o res) l'hem de convertir a true/false (es correspon a un boolean a la base de dades).
- accents en PHP i a la base de dades.
- què passa quan posem un apòstrof en els comentaris? (hem d'utilitzar str_replace)
radiobutton_checkbox.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"> <head> <meta charset="utf-8"></meta> <title>Protectora d'animals</title> </head> <body> <h1>Formulari amb radio button, check box, select box i textarea</h1> <form action="radiobutton_checkbox2.php" method="post"> El teu nom:<br /> <input type="text" name="nom" value=""><br /><br /> Animal preferit?<br /> <input type="radio" name="animal" value="Granota">Granota<br /> <input type="radio" name="animal" value="Ratolí">Ratolí<br /> <input type="radio" name="animal" value="Marmota">Marmota<br /><br /> Acceptes rebre informació sobre la nostra protectora d'animals? <input type="checkbox" name="rebreinfo" value="yes"><br /><br /> Com vols rebre informació?<br /> <select name="formainfo"> <option value="correu">Correu electrònic</option> <option value="newsletter">Newsletter</option> <option value="whatsup">Whatsup</option> </select> <br /><br /> Comentaris:<br /> <textarea name="comentaris" width="50" height="30"></textarea><br /><br /> <input type="submit" name="submit" value="Submit"><br> </form> </body> </html>
NOTA: pots introduir en els comentaris accents i apòstrofs per comprovar que funcionen bé.
radiobutton_checkbox2.php:
<?php /* USE jbalmes; CREATE TABLE protectora ( id MEDIUMINT NOT NULL AUTO_INCREMENT, nom VARCHAR(30) NOT NULL, animal VARCHAR(20) NOT NULL, rebreinfo BOOLEAN, formainfo VARCHAR(20), comentaris VARCHAR(200), PRIMARY KEY (id) ); Per inicialitzar la taula: DELETE FROM protectora; ALTER TABLE protectora AUTO_INCREMENT = 1; */ ?> <?php header('Content-type: text/html; charset=utf-8'); //http://www.phpforkids.com/php/php-forms-get-post-checkbox-radio-data.php if (isset($_POST['submit'])) { $nom = str_replace("'","''",$_POST['nom']); $animal = $_POST['animal']; $rebreinfo = $_POST['rebreinfo']; if ($rebreinfo=="yes") { $rebreinfo = "true"; } else { $rebreinfo = "false"; } $formainfo = $_POST['formainfo']; $comentaris = str_replace("'","''",$_POST['comentaris']); echo "<br />"; echo "Nom: ".$nom."<br />"; echo "Animal preferit: ".$animal."<br />"; echo "Accptes rebre info: ".$rebreinfo."<br />"; echo "Forma enviament: ".$formainfo."<br />"; echo "Comentaris: ".$comentaris."<br />"; } else { echo "Please submit the form."; } ?> <?php $servername = "localhost"; $username = "alumne"; $password = "keiL2lai"; $dbname = "jbalmes"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } mysqli_query($conn, "SET NAMES 'utf8'"); $sql = "INSERT INTO protectora (nom, animal, rebreinfo, formainfo, comentaris) VALUES ('".$nom."','".$animal."',".$rebreinfo.",'".$formainfo."','".$comentaris."')"; //echo $sql; if (mysqli_query($conn, $sql)) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>
Anem a recuperar la informació que tenim a la base de dades:
llista_animals.php:
<?php header('Content-type: text/html; charset=utf-8'); $servername = "localhost"; $username = "alumne"; $password = "keiL2lai"; $dbname = "jbalmes"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } mysqli_query($conn, "SET NAMES 'utf8'"); $sql = "select * from protectora"; $resultset = mysqli_query($conn,$sql); while($row = mysqli_fetch_array($resultset)) { echo $row['animal']." - Comentaris: ".$row['comentaris']."<br />"; } mysqli_close($conn); ?>
Exemple vist a classe (09/01/2020)
provincies_v1.php:
<html> <head> <title>Provincias de España</title> <meta charset="utf-8"> </head> <body> <h1>Provincias de España</h1> <?php $servername = "localhost"; $username = "alumne"; $password = "keiL2lai"; $dbname = "municipis"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } mysqli_set_charset($conn,"utf8"); $sql = "select provincia,comunitat from provincies p, comunitats c where c.id_com = p.id_com"; //echo $sql; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { // output data of each row while($row = mysqli_fetch_assoc($result)) { echo $row["provincia"]. " (" . $row["comunitat"]. ")<br />"; } } else { echo "0 results"; } mysqli_close($conn); ?> </body> </html>
provincies_v2.php:
<html> <head> <title>Provincias de España</title> <meta charset="utf-8"> </head> <body> <h1>Provincias de España</h1> <?php $servername = "localhost"; $username = "alumne"; $password = "keiL2lai"; $dbname = "municipis"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } mysqli_set_charset($conn,"utf8"); $sql = "select provincia,comunitat from provincies p, comunitats c where c.id_com = p.id_com order by comunitat, provincia"; //echo $sql; $result = mysqli_query($conn, $sql); $comunitat = ""; if (mysqli_num_rows($result) > 0) { // output data of each row while($row = mysqli_fetch_assoc($result)) { if ($comunitat != $row["comunitat"]) { echo "<h2>".$row["comunitat"]."</h2>"; $comunitat = $row["comunitat"]; } echo $row["provincia"]. "<br />"; } } else { echo "0 results"; } mysqli_close($conn); ?> </body> </html>
provincies_v3.php:
Fem un petit canvi, volem filtrar les províncies per comunitat. Ara cridarem el script amb el filtre:
provincies_v3.php?comunitat=Catalunya
<html> <head> <title>Provincias de España</title> <meta charset="utf-8"> </head> <body> <h1>Provincias de España</h1> <?php //recollim el filtre //http://www.iaw.org/provincies_v3.php?comunitat=Galicia $filtre_comunitat = $_GET['comunitat']; //echo $filtre_comunitat; $servername = "localhost"; $username = "alumne"; $password = "keiL2lai"; $dbname = "municipis"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } mysqli_set_charset($conn,"utf8"); $sql = "select provincia,comunitat from provincies p, comunitats c where c.id_com = p.id_com and comunitat='".$filtre_comunitat."' order by comunitat, provincia"; //echo $sql; $result = mysqli_query($conn, $sql); $comunitat = ""; echo "<ul>"; if (mysqli_num_rows($result) > 0) { // output data of each row while($row = mysqli_fetch_assoc($result)) { if ($comunitat != $row["comunitat"]) { echo "<h2>".$row["comunitat"]."</h2>"; $comunitat = $row["comunitat"]; } echo "<li>".$row["provincia"]." (<a href=\"https://es.wikipedia.org/wiki/Provincia_de_".$row["provincia"]."\">wikipedia</a>)". "</li>"; } echo "</ul>"; } else { echo "0 results"; } mysqli_close($conn); ?> </body> </html>
Entrega
La pràctica consta de dues parts. D'una banda pràcticar PHP+MySQL a través dels exemples mostrats al tutorial i explicats a classe. D'altra banda, implementar el formulari de la tenda del Balmes en una base de dades.
Prova a més l'exemple de la protectora d'animals vist a classe, i implementa alguna millora. Per exemple, afegeix més camps a la base de dades; formata la sortida de llista_animals.php en una taula HTML.
Tota la documentació generada (scripts PHP bàsicament) la inclouràs en un fitxer comprimit i l'entregaràs en el Schoology. No t'has de restringir als exemples que proposa el tutorial, sinó que també inclouràs totes les proves que fas. El professor també demana incloure el fitxer LLEGEIX-ME.txt on expliquis les dificultats i descobertes que has realitzat.
Recorda la normativa per entregar les pràctiques al Google Classroom: ASIX-M10-UF2#Normativa_d.27entrega_de_les_pr.C3.A0ctiques_al_Google_Classroom
Exercici de classe (09-01-2020)
Programar un script php que mostri per pantalla tots els municipis de Catalunya (n'hi ha uns 800), i la província a què pertanyen. Consta de les següents parts:
- Establir una connexió correcta
- executar la sentència SQL adequada, i mostrar la informació bàsica per pantalla.
- Fer una llista HTML (ul-li)
- També pots fer una taula HTML.
- Volcar la informació al fitxer municipis_catalunya.txt
- Feina per casa: omplir una llista desplegable amb totes les comunitats (a partir d'una consulta a la base de dades), i quan seleccionis una comunitat, per exemple Extremadura, que es mostrin les províncies.
Referència:
- https://www.w3schools.com/php/php_mysql_select.asp
- https://stackoverflow.com/questions/5189662/populate-a-drop-down-box-from-a-mysql-table-in-php
Solució vista a classe:
Durarda
2 hores
creat per Joan Quintana Compte, octubre 2019