Llenguatges de guions de servidor. PHP Avançat

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Objectius

Documentació

Desenvolupament

Exercicis de la teoria

Farem els exercicis més avançats de PHP i que hem explicat a classe. Es troben a:

Llegir i Escriure en fitxers en el servidor

llegir_fitxer.php

<?php
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file))
  {
  echo fgets($file). "<br>";
  }
fclose($file);
?> 

escriure_fitxer.php

<?php
$file = fopen("welcome.txt", "a") or exit("Unable to open file!");
//Output a line of the file until the end is reached
echo fwrite($file,"Hello World. Testing!");
fclose($file);
?> 

Per poder escriure de forma correcta s'ha de donar permisos adequats. El més correcte és que el propietari de l'arxiu welcome.txt sigui l'usuari www-data, que és l'usuari amb què s'executa el Apache.

$ sudo chown -R www-data:www-data welcome.txt

drwxr-xr-x  2 root     root     4096 nov 27 20:03 proves_php
-rw-r--r--  1 www-data www-data   19 des  4 19:27 welcome.txt

Exemple aclaridor $_POST, $_COOKIE, $_SESSION

Nota: per tal de què funcionin les cookies, les has d'acceptar en el navegador. També pot ser que el servidor Apache no accepti cookies. En aquest cas, la configuració del fitxer php.ini ha de quedar:

session.use_cookies = 1

i reiniciar el servidor Apache.

Aquest és un exemple pràctic. Hem agafat el codi i l'hem simplificat fins a la mínima expressió de http://arthropoda.joanillo.org. La idea bàsica, que es pot extendre a moltes altres aplicacions web, és:

Hem reduït aquest problema a la mínima expressió: 2 pàgines i una sola variable (que pot agafar 3 valors: "1", "3" i "totes").

fitxer index.php

<?php
session_start();

//Retrieve and set default cookies
if (!isset($_COOKIE['num_fotos'])) {
	$_SESSION['num_fotos']="3";
	setcookie ("num_fotos", "3", time() + 3600*24*365);
}
else{
	$_SESSION['num_fotos'] = $_COOKIE['num_fotos'];
}
?>

<html>
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
		<title>Arthropoda | joanillo.org</title>
	</head>
	<body>
		<h1>Arthropoda | Galeria de cuques</h1>
		<a href="index.php">Index</a> | <a href="configuration.php">Configuració</a><br />
		<h2>Pàgina inicial</h2>	
		Número de fotos a mostrar de cada espècie: <?php echo $_SESSION['num_fotos']; ?>

	</body>
</html>

fitxer configuration.php

<?php
	session_start();
?>
<html>
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=utf-8">
		<title>Arthropoda | joanillo.org</title>
	</head>
	<body>
		<h1>Arthropoda | Galeria de cuques</h1>
		<a href="index.php">Index</a> | <a href="configuration.php">Configuració</a><br />
		<h2>Configuració</h2>

		<?php
		if (isset($_POST['num_fotos'])) {
			if ($_POST['num_fotos'] != $_SESSION['num_fotos']) { //nou valor, actualitzem la variable de sessió
				//$num_fotos=$_POST['num_fotos'];
				$_SESSION['num_fotos'] = $_POST['num_fotos'];
				setcookie ("num_fotos", $_POST['num_fotos'], time() + 3600*24*365); //guardem la cookie
			}
		}

		echo "<b>Resum</b><br />";
		echo "<ul>";
		echo "<li>Número de fotos a mostrar de cada espècie: ".$_SESSION['num_fotos']."</li>";
		echo "</ul>";
		?>

		<form action="configuration.php" method="POST">
		Número de fotos a mostrar de cada espècie:
		<select name="num_fotos">
		  <option value="1" <?php if($_SESSION['num_fotos']=="1") echo "selected=\"selected\""; ?> >1</option>
		  <option value="3" <?php if($_SESSION['num_fotos']=="3") echo "selected=\"selected\""; ?> >3</option>
		  <option value="totes" <?php if($_SESSION['num_fotos']=="totes") echo "selected=\"selected\""; ?> >Totes</option>
		</select>
		<input type="submit" value="Enviar" />
		</form>

	</body>
</html>

Exemple llegir i escriure fitxers

Anem a llegir des de PHP el fitxer webdictionary.txt:

AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language

Escriurem per pantalla i escriurem en el fitxer resultat.txt només les línies que comencin per 'S'.

script readfile.php:

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
$outfile = fopen("resultat.txt", "w") or die("Unable to open file!");

while(!feof($myfile)) {
	$cad = fgets($myfile);
	$lletra = substr($cad, 0, 1);
	if ($lletra == 'S') {
		echo $cad . "<br />";
		fwrite($outfile,$cad);
	}
}

fclose($outfile);
fclose($myfile);
?>

Per tant, el que fa el nostre script és obrir els dos fitxers, el de lectura i el d'escriptura. Recorrem el fitxer de lectura línia a línia. I si la frase comença per S, escrivim aquesta línia en el fitxer d'escriptura.

Per tal de què funcioni correctament l'escriptura no hem de tenir problemes de permisos. Recorda que l'usuari que executa el script PHP és el www-data, i per tal de no tenir problemes el millor és que el propietari de la carpeta sigui aquest usuari. Si la web de l'assignatura és /var/www/iaw, pots fer:

cd /var/www
sudo chown -R www-data:www-data iaw/

Exercici de classe (14-12-2017): PHP5 Complete Form

En aquest exercici farem funcionar en el teu servidor aquest exemple de formulari, en el qual es fa una validació del correu electrònic.

Exercicis a realitzar

  1. Fes una aplicació mínima que posi de relleu el funcionament de les variables globals $_SESSION i $_COOKIES, seguint l'exemple que se't proporciona. Per exemple, pots fer una aplicació multiidioma (català i castellà) i la informació que proporciona serà amb un dels dos idiomes segons prefereixi l'usuari. Altres idees: escollir el color de fons d'una pàgina, el tipus de lletra, el full d'estils que carregues.
  2. A partir del segon exemple (llegir i escriure fitxers en un mateix script) utilitza com a fitxer de lectura un fitxer ben gran (com a mínim 100 línies, per exemple, municipis de Barcelona) i com a resultat obté un filtre de les dades, el filtre que tu vulguis.

solució:

<?php
//anem a buscar en una llista de municipis, tots els municipis que comencen per Santa
$myfile = fopen("./municipis.txt", "r") or die("Unable to open file!");
$outfile = fopen("santa.txt", "w") or die("Unable to open file!");

while(!feof($myfile)) {
	$cad = fgets($myfile);

	$findme   = 'Santa';
	$pos = strpos($cad, $findme);

	if ($pos === 0) {
		echo $cad."<br />";
		fwrite($outfile,$cad);
	}

}

fclose($outfile);
fclose($myfile);
?>

Entrega

Tota la documentació generada (scripts PHP bàsicament) la inclouràs en un fitxer comprimit i l'entregaràs en el Google Classroom. 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

Durarda

2 hores



creat per Joan Quintana Compte, Juny 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