PHP + bases de dades (Mysql)

De wikijoan
Salta a la navegació Salta a la cerca

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):

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:

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:

  1. Establir una connexió correcta
  2. executar la sentència SQL adequada, i mostrar la informació bàsica per pantalla.
  3. Fer una llista HTML (ul-li)
  4. També pots fer una taula HTML.
  5. Volcar la informació al fitxer municipis_catalunya.txt
  6. 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:

Solució vista a classe:

Durarda

2 hores



creat per Joan Quintana Compte, octubre 2019