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 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 en el servidor. Exercici de classe (28-nov-2018)

script fwrite.php:

<html>
<body>
<h1>Exercici escriptura fitxer</h1>
<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "John Doe\n";
fwrite($myfile, $txt);
$txt = "Jane Doe\n";
fwrite($myfile, $txt);
fclose($myfile);
echo "hem creat el ftixer newfile.txt";
?>
</body>
</html>

És possible que tingueu permisos d'escriptura en executar el script. Heu de pensar que segurament el propietari de la vostra carpeta és pepito:pepito, i l'usuari www-data:www-data (usuari que executa el script PHP) no té permisos d'escriptura sobre aquesta carpeta.

1a possiblitat per solucionar problemes de permisos:

drwxrwx--x 2 joan     joan     4096 de no 28 16:34 . <- l'usuari www-data no té permisos
...
-rw-rw-r-- 1 joan     joan      181 de no 28 16:30 fwrite.php
...

Donem permisos a tothom per escriure en la carpeta actual

$ sudo chmod a+rwx .
drwxrwxrwx 2 joan     joan     4096 de no 28 16:34 . <- l'usuari www-data ja té permisos
...
-rw-rw-r-- 1 joan     joan      181 de no 28 16:30 fwrite.php
...
-rw-r--r-- 1 www-data www-data   18 de no 28 16:34 newfile.txt <- hem pogut escrire el ftixer newfile.txt en la carpeta. Veiem que el propietari és www-data.
...

2a possiblitat per solucionar problemes de permisos: Una altra possibilitat és crear el fitxer newfile.txt, donem els permisos adequats al fitxer.

$ sudo chmod a+rwx newfile.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 newfile.txt

3a possiblitat per solucionar problemes de permisos: Una altra possibilitat és crear el fitxer newfile.txt, i fer que el propietari sigui www-data:

$ sudo chown www-data:www-data newfile.txt


-rw-r--r--  1 www-data www-data   19 des  4 19:27 newfile.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. El formulari de configuració haurà de tenir com a mínim 3 items (3 variables de sessió, 3 cookies).

2. A partir de l'exemple vist més amunt (llegir i escriure fitxers en un mateix script), utilitza com a fitxer de lectura un fitxer ben gros (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);
?>

3. Partim del fitxer CSV paisos_europeus.csv (Fitxer:Paisos europeus.csv.zip), que conté tres camps: el país; la capital; i la superfície. Generar el fitxer paisos_europeus_grossos.txt que conté la informació dels països que tenen més de 250.000 Km^2, amb el format:

La capital de xxx és yyy. xxx té zzz Km^2

Per ex:

La capital de Francia és París. Francia té 547030 Km^2

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