PHP + bases de dades (Mysql)

De Wikijoan
Dreceres ràpides: navegació, cerca

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

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);
?> 

Formulari de la tenda del Balmes. Inserció i consulta a la base de dades

En la pràctica anterior vas treballar el formulari de la tenda del Balmes, a nivell de disseny, maquetació i validació de les dades. Ara ja és el moment de ficar les dades del formulari en la base de dades. Un cop logat ja pots fer login i obrir una sessió web en l'aplicatiu. La sessió es manté oberta quan navegues per les diferents pàgines de l'aplicatiu. L'usuari es recorda entre sessions gràcies a l'ús de les cookies.

En el següent enllaç tens l'explicació de com s'implementa la inserció de l'usuari a la base de dades; com es comprova que el login i password siguin correctes; i com es gestiona una sessió i les cookies amb PHP. Aquest no pretén ser un curs de programació PHP. L'alumne ha de ser capaç de fer funcionar el codi i entedre'l, sense haver d'entrar en els detalls.

NOTA: En la pràctica anterior has modificat el formulari afegint un radio button, una llista desplegable, i un text area. Si volem ser coherents, hem de modificar la base de dades per tal de què aquesta informació també quedi emmagatzemada a la base de dades.

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:

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''':
<pre>
<?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 (18/01/2019)

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 (11-01-2019)

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 (
  4. ). També pots fer una taula HTML.
  5. Volcar la informació al fitxer municipis.txt

Referència: https://www.w3schools.com/php/php_mysql_select.asp

Durarda

2 hores



creat per Joan Quintana Compte, octubre 2019

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines