Micro guida a PHP

juzam@autistici.org




1.0 Introduzione

In origine il significato dell' acronimo "PHP" era "Personal Home Page Tools": ma la grossa espansione di questo linguaggio di scripting ha reso necessario un nuovo significato (Hypertext Preprocessor).

Php è un potente linguaggio di web scripting opensource.
Esso è compatibile con tutti i più famosi server Web, ma sicuramente si sente a casa propria a lavorare con Apache.
Php gira su la gran parte degli Unix e su Windows.
Come già detto esso è compatibile con Apache per Unix e Windows, nonchè con Microsoft Internet Information Server e Netscape Enterprise Server; oltre a questi popolarissimi webserver è compatibile con altri meno conosciuti e diffusi, quali ad esempio AOLServer e fhttpd.

Il codice php può essere incluso in normali pagine html: successivamente esso viene interpretato dall'interprete php ed inviato al browser dell'utente.

--

1.1 Installazione

Installazione di PHP + Apache sotto Win

Questo documento spiega semplicemente come installare e configurare apache e php su un sistema windows.

Installazione di PHP + Apache - Sistemi Unix/like
Innanzitutto bisogna procurarsi i sorgenti di Php ed Apache

Quindi scompattiamo:

	tar xvfz apache_x.y.z.tar.gz
	tar xvfz php-x.y.z.tar.gz

Configuriamo apache:

	cd apache_x.y.z
	./configure --prefix=/usr/local

E php:

	cd php-x.y.z
	./configure --with-apache=/percorso/completo/apache_x.y.z --enable-track-vars --with-xml
	make
	make install
Copiamo il file php.ini:
	cp php.ini-dist /usr/local/lib/php.ini
	
Ancora apache:

	./configure --prefix=/usr/local/apache \
        	    --activate-module=src/modules/php4/libphp4.a
	make
	make install
E, finalmente, ultimo passo - decommentiamo le seguenti righe in /usr/local/apache/conf/httpd.conf

	AddType application/x-httpd-php .php .php3 .phtml
	AddType application/x-httpd-php-source .phps
Lanciamo apache:

	apachectl start
Ok, dovremmo essere a posto!

--

1.2 Editor

Per programmare è sempre necessario uno strumento: l'editor di testi.
Ovviamente questo è vero anche per PHP :).
Per quanto riguarda Windows il fido blocco note potrebbe andare bene per iniziare.
Ma probabilmente, dopo un pò di esperienza, diventerete semi-pazzi a scrivere script di righe e righe, magari confondendo le parole risvervate del php con i commenti etc...
Per questo è molto conveniente utilizzare un editor con syntax highlight, ovvero la colorazione della sintassi. Esempio di codice con sintassi colorata:


<HTML>
<HEAD>
<TITLE> Questo è un esempio di syntax highlight </TITLE>
</HEAD>
</HTML>



Di seguito viene presentata una breve lista di editor.

LINUX:


WINDOWS:

--

1.3 Hello world!

Ed eccoci al nostro primo programma in PHP.
Armati di un
editor scriviamo quanto segue:
	
	
	
	<HTML>
		<HEAD>
		<TITLE>Ciao Mondo!</TITLE>
		<BODY>
			<?php // questo è il tag che segnala l'inizio del codice php
				echo "Hello World"; 
			 ?> /* e questo è il tag che segnala la fine del codice php */
		</BODY>
	</HTML>
	
	
Salviamo questo piccolo scriptino con (ad esempio) il nome index.php nella directory root del nostro web server.

A questo punto possiamo ammirare l'output del nostro primo script php andando con un browser su:
http://ip.del.server/index.php


2.0 Sintassi

Per quanto riguarda la sintassi, se conoscete il C siete già praticamente a posto.
Sono infatti numerose le analogie sintattiche tra i due linguaggi.

In caso contrario, non c'è comunque da preoccuparsi: infatti php non è affatto cattivo.

Trovandosi di fronte a codice poco chiaro, l'interprete cercherà comunque di caprici qualcosa, a differenza di un programma in C, che in caso di errori di scrittura del codice proprio non vuole saperne di compilare.
Ovviamente ci sono alcuni casi in cui l'interprete php non sa proprio che pesci pigliare... :)))

Ma veniamo al dunque:

C'è sempre più di un modo per fare la stessa cosa, in PHP.
Ad esempio, l'inclusione di codice PHP all'interno di una pagina HTML si ottiene nei seguenti modi:
	
	
		<?php
			//codice php, in questo caso un commento
		?>
		 

		<?
			//codice php
		?>

	
		<SCRIPT LANGUAGE="php">
			//codice php
		</SCRIPT>


		<%
			//codice php
		%>
	
	

--

2.1 Separazione delle istruzioni

Ogni istruzione termina con il punto e virgola.
Esempio:
	      
		<?php
			echo "ciao";
		?>
	      	
	      

--

2.2 Commenti

I commenti sono parti di codice che non vengono assolutamente considerate dall'interprete.

Commenti stile C/C++:

	//commento su una righa

	/* commento
	   su più 
	   righe */
	   
	

Commenti stile shell Unix:

	#commento stile unix

--

2.3 Variabili



Le variabili in PHP sono identificate dal prefisso '$' (simbolo del dollaro).
Esistono differenti tipi di variabili. Semplificando un pochino distinguiamo tra:

Normali
Per "normali" intendiamo variabili definite dal programmatore stesso.
Esempio di variabile:

	
	$var = 3;
	
	

In questo caso abbiamo assegnato alla variabile "var" il valore "3".
Come si può notare non è stato necessario dichiarare "var": questo perchè PHP implementa la dichiarazione implicita. Non ci sarà quindi bisogno di specificare che la nostra "var" conterrà un intero, basterà semplicemente associare ad essa un valore di tipo intero.

Se successivamente accadesse una cosa del genere:

	
	$var = "sto assegnando una stringa";
	

Non ci sarebbe alcun problema.
PHP "capirebbe" che var è ora diventata una variabile di tipo stringa. ;)

Ed ecco i tipi di dati possibili:

TIPOCOSA CONTIENEESEMPIOCODICE
integerIntero5$intero = 5;
doubleVirgola Mobile3.214$double = 3.214;
stringStringa"Sono una stringa"$stringa = "parole parole";
   $stringa = "4";
booleanpuò assumere il valore di true o falsetrue$bool = true;
array Gli array meritano un discorso a parte. Eccolo :)



E' importante notare l'esempio di codice relativo alle stringhe.
Infatti, le due assegnazioni


		$variabile = 12;
		$variabile = "12";
		
		
sono nettamente differenti: nel primo caso variabile conterrà un intero, nel secondo caso una stringa.


Predefinite
PHP fornisce un buon numero di variabili predefinite.
Vi rimando alla relativa
pagina di manuale.

--

2.3.1 Array

Possiamo immaginare un array (vettore) come una cassettiera.
	 
	 MATERIE
      /------------------\	
      |	matematica |  0  |
      |------------|-----|  	
      |	  storia   |  1  | 
      |------------|-----|
      |	 inglese   |  2  |
      |------------|-----|
      |	 italiano  |  3  |
      \------------------/
       

I numeri a fianco ad ogni materia non corrispondono al voto (per fortuna) :)
Rappresentano invece la posizione degli elementi all'interno dell'array.

Il nostro array "materie", contiene ovviamente dei dati di tipo stringa; possiamo quindi dire che materie è un array di stringhe.

Ecco questo concetto tradotto in PHP:
		
		
		$materie = array("matematica", "storia", "inglese", "italiano");
		
		
		
Materie è un array.
Per accedere ad uno dei "cassetti" è necessario specificarne la posizione.
Ovvero:
		
		
		$una_materia = $materie[3];
		$altra_materia =$materie[1];
		
		
	
Abbiamo assegnato alla variabile una_materia il contenuto "italiano", mentre ad altra_materia il contenuto "storia".

--

2.4 Caratteri speciali

Abbiamo detto che per indicare una stringa sono necessari i doppi apici (").
Bene, quindi questo è corretto:

		
		$stringa = "ciao ciao";
		
		
e questo?

		$stringa = "ciao "john" smith";
		
		
Con tutte le migliori intenzioni abbiamo provato a inserire dei doppi apici all'interno di una stringa.
Ovviamente, però, così facendo incasiniamo l'interprete PHP, il quale è convinto che la nostra stringa finisca dopo la parola ciao.
Ed ecco dunque che possiamo parlare di escape.
Il carattere di escape in PHP è il backslash (\).

Questo è dunque corretto:


		
		$stringa = "ciao \"john\" smith";
		
		

Anteponendo il backslash ad un carattere, evitiamo che PHP cerchi di "lavorarci sopra". Per esempio:

		
		<?php
			echo "micro\$oft è il \"demonio\";
		 ?>
		
		
produce il seguente output:
		micro$oft è il "demonio"
		


3.0 Flusso di esecuzione e cicli

Uno script in PHP è una serie di istruzioni, che vengono eseguite una dopo l'altra.
Ma noi vogliamo qualcosa in più, vogliamo poter effettuare una certa cosa solo se si verifica un qualche evento, oppure ripetere la stessa cosa più volte e via di seguito.
Vediamo come si può variare il comportamento del nostro script:

--

3.1 Istruzioni di scelta (o condizionali)

Istruzione "if"
		
		<?php
			if ($os == "Linux")
			{
			 echo "Alè il pinguino!";
			}
	         ?>
		
		
		
In questo semplice esempio abbiamo confrontato il valore della variabile "os" (supponendo che in essa fosse stato precedentemente inserito il nome del sistema operativo) con la stringa "Linux".
Nel caso in cui il contenuto di "os" fosse proprio "Linux" otterremmo in output il messaggio "Alè il pinguino!".
E se il contenuto fosse diverso? Ecco subentrare l' else.
Istruzione "else"
		
		<?php
			if ($os == "Linux")
			{
				echo "Alè il pinguino!";
			}
			else
			{	
				echo "Accidenti";
			}
	         ?>
		
		
		
In questo caso se $os è uguale a "Linux" l'output sarà Alè il pinguino, altrimenti sarà "Accidenti".

Istruzione "elseif"
Ipotizziamo di avere, a differenza della situazione precedente, un'altra scelta.
Mi spiego meglio: se il s.o. è linux scriviamo "Alè il pinguino", se è FreeBSD "Alè il diavoletto", altrimenti scriviamo "Accidenti".
		
		<?php
			if ($os == "Linux")
				echo "Alè il pinguino!";
			elseif ($os == "Freebsd")
				echo "Alè il diavoletto!";
			else
				echo "Accidenti";
		 ?>
		
		
		
Parentesi graffe? O no?
In quest' ultimo esempio ho volutamente omesso le parentesi graffe ("{", "}").
Questo perchè, nel caso in cui il blocco di istruzioni da eseguire sia ridotto unicamente ad una istruzione, le parentesi graffe possono essere evitate.

Attenzione però:
	
	<?php
		if ($os == "Linux")
			echo "Alè il pinguino!"; // prima istruzione
			$prova = 2;		 /* 
			                            seconda istruzione, ma 
						    l'if è già terminato ! 
						    :((
						  */
	?>
	
	
	
La seconda istruzione NON verrà eseguita all'interno dell' if.
Il codice corretto per eseguire entrambe le istruzioni nel caso in cui la condizione sia verificata è:
		
		<?php
			if ($os == "Linux")
			{ // notare la parentesi graffa
			 	echo "Alè il pinguino!"; // prima istruzione
				$prova = 2; 		 /* seconda istruzione,
							    questa volta all'
							    interno dell'if :))
							  */
			}
		 ?>
		
		
		
Istruzione "switch"
Se è necessario effettuare parecchi controlli sulla stessa variabile, per evitare di utilizzare una successione interminabile di if, else, elseif, utilizziamo l'istruzione switch.
Esempio:
		
		
		<?php
			switch ($os) 
			{
			 case "Linux":
			 	echo "Alè il pinguino";
				break;
			 case "Freebsd":
			 	echo "Alè il diavoletto";
				break;
			 case "Windows":
			 	echo "buuuuuuuuuuuuuuuh";
				break;
			 case "Mac/OS":
			 	echo "Apple";
				break;
			 default:
			 	echo "s.o. non menzionato";
				break;
			}
			
		 ?>
		
		
		
Molto semplicemente, a seconda del contenuto della variabile "$os", viene eseguito del codice differente.

Da notare il default. Nel caso in cui nessuno dei case soddisfi il contenuto della variabile, viene eseguito il "default".

--

3.2 Istruzioni iterative (o cicli)

Ciclo "for"
Il ciclo for ci consente di eseguire più volte lo stesso blocco di istruzioni. Il numero di volte viene definito dalla "condizione di controllo del ciclo".
Finchè essa risulta vera, il for viene ripetuto.
	
	
	for ($i=0; $i<5; $i++) // for ($i=valore_di_partenza; condizione su $i; istruzione su $i)
		{
		 echo "<BR>";
		 echo "Alè il pinguino";
		}
	
	
	
Quindi:
Il valore di partenza di "$i" è zero.
La condizione che deve essere vera per restare dentro al ciclo è: $i DEVE essere MINORE di 5.
L'istruzione che si verifica ad ogni ciclo è $i++, ovvero l'INCREMENTO della variabile $i.

Il risultato di questo codice è la scritta "Alè il pinguino" ripetuta per 5 volte.

--

Cicli "while" e "do-while"
	
		<?php
			while ($i < 5)
			{
				echo "<br>Alè il pinguino";
		                $i++;
			}
		 ?>
		
	
	
Il ciclo while ha la prerogativa del "controllo in testa".
La condizione viene verificata prima del blocco delle istruzioni: se essa non è verificata il blocco delle istruzioni non viene eseguito.
Quindi, di fronte a del codice di questo tipo:
	
	
	<?php
		$i = 10;
		while ($i < 5)
		{
			echo "<br>Alè il pinguino";
			$i++;
		}
	?>
	
	
	

possiamo star certi che la scritta "Alè il pinguino" non comparirà, essendo il valore di $i maggiore di 5 già prima del while.


Invece, il do-while viene anche detto "a controllo in coda".
Il blocco delle istruzioni viene quindi eseguito almeno una volta, e poi, in coda viene verificata la condizione.

Esempio:
	
		<?php
			$i = 10;
			do
			{
			 echo "Alè il pinguino";
			 $i++;
			}while ($i < 5);
		 ?>
		
	
	
In questo caso abbiamo inizializzato $i a 10.
Inizia il do-while, viene prodotto l'output "Alè il pinguino", viene incrementato il valore di $i e quindi in coda viene verificata la condizione: essendo $i superiore a 5 si esce dal ciclo.
La scritta appare dunque una volta, differentemente da quanto visto poco fa con l'esempio del while.


4.0 Funzioni

Le funzioni ci consentono di mantenere più leggibile il nostro script e (nel caso di operazioni che si ripetono più volte) di riutilizzare delle parti di codice che altrimenti dovremmo riscrivere a manina.
Esse risultano veramente comode nel caso di script di dimensioni considerevoli, facilitando la vita del povero sviluppatore.

Possiamo pensare ad una funzione come ad una "scatola", che elabora dei dati ricevuti in input e quindi produce un output.


		/----------\
dati in input	|	   | output	
------------->	| FUNZIONE | ----->
		| 	   | 
		\----------/

Ecco una funzione che somma due valori.
"a" e "b" sono i valori in input, "c" è il nostro output.
               /---------------\
	A -->  |      	       |		
	       |     Somma     | C --> 	
	B -->  |   c = a + b   |    
	       |	       |
	       \---------------/
Vediamo la nostra semplice funzione "somma" realizzata in php:

<?php
		function somma($a,$b)
		{
		 $risultato = $a + $b;
		 print ("somma = $risultato");
		}
	
	
/* 
   richiamiamo la funzione "somma", passando come argomenti
   i valori 5 e 12
 */
		somma(5,12);
	
	
?>
	

Abbiamo dunque creato la funzione "somma", alla quale vengono passati due argomenti, ovvero il primo e il secondo valore da sommare.
Una funzione può avere uno o più argomenti, cosi come nessuno.

Inoltre, una funzione può restituire un valore.
Per consentire ad una funzione di restituire un valore utilizziamo l'istruzione return.
Facciamo si che l'esempio di prima restituisca la somma:

<?php
		function somma($a,$b)
		{
		 return $a+$b;
		 }
	
	
/* 
 	stampiamo "il risultato è:" con il risultato ritornato dal richiamo 
	della funzione somma	
 */
	print "Il risultato è:". somma(5,12);
	
?>
	

N.B. E'importante notare come delle variabili su cui siano state effettuate delle operazioni all'esterno della funzione non sono visibili all'interno della funzione stessa. Esempio:


	<?php
		$nick = "juzam";
		
		function ciao()
		{
		 echo("ciao".$nick);
		}
	?>


La variabile $nick è stata definita fuori dalla funzione, la quale NON la vede.
Per ovviare a questo problema usiamo "global".



	<?php
		$nick = "juzam";
		
		function ciao()
		{
		 global $nick;
		 echo("ciao".$nick);
		}
	?>


La variabile $nick viene ora vista dalla nostra funzione.


5.0 Passaggio di variabili


Spesso uno script php è composto da più pagine.
Come fare dunque a "passare" una variabile da una pagina all'altra?

5.1 Metodi get e post

L' HTML ci fornisce i FORM come potente strumento per consentire all'utente di inserire dei dati.
Dal sito del w3c possiamo ottenere maggiori informazioni in merito:
http://www.w3.org/TR/html4/interact/forms.html.

Bene, supponiamo di voler inviare ad una pagina username e password.
Con molta fantasia la pagina si chiamerà login.php
Ecco come dovrà essere strutturato il form:


<form action=login.php method=post>
	<input type="text" name=username>
	<input type="password" name=pwd>
	<input type="submit" value=send>
</form>


A questo punto, all'interno di login.php, potremo riferirci alle variabili
$username
$pwd
e farne cio' che vogliamo.
Abbiamo quindi passato due variabili da una pagina all'altra.
Come detto i due metodi sono post e get: la differenza sta nel fatto che i form con metodo get passano le variabili come query string, mentre quelli con post non mostrano nulla nella barra degli indirizzi.

Gli array associativi $HTTP_GET_VARS e $HTTP_POST_VARS contengono il valore delle variabili passate tramite form.
Quindi: $HTTP_POST_VARS[pwd] nel nostro caso conterrà la password.

5.2 Query string

Molto, molto semplicemente...
il link seguente:
<a href="index.php?variabile1=prova1&variabile2=prova2&variabile3=prova3">indice</a>


passa allo script index.php le variabili variabile1, variabile2, variabile3 con contenuto prova1, prova2 e prova3.
Questo tipo di passaggio di variabili comporta un difetto: così come per il metodo get, il nome e il contenuto delle variabili passate compaiono nella barra degli indirizzi del browser.


6.0 File & Directory


Esempio di apertura di un file:

	<?
	  $file_da_aprire = "/percorso/completo/nomefile.txt";
	  $fp = fopen($file_da_aprire, 'r');
	  $buffer = fread($fp, filesize($file_da_aprire));
	  echo $buffer;
	  fclose($fp);
	?>
	
	
In questa maniera apriamo il file in lettura, ne memorizziamo il contenuto in $buffer e lo stampiamo.
Da notare che alla funzione fopen vanno passati nell'ordine: il percorso completo del file e la modalità di apertura dello stesso.

E se volessimo scrivere su un file?


	<?
		$file_da_aprire = "/percorso/completo/nomefile.txt";
		$testo_da_scrivere = "questo sarà il contenuto del file";
		$fp = fopen($file_da_aprire, 'w');
		fwrite ($fp, $testo_da_scrivere);
		fclose($fp);
	>?
      


Ovviamente i permessi del file in questione debbono essere tali da consentirci di modificarlo. :P


MODALITA'STRINGA
sola letturar
lettura / scritturar+
sola scritturaw
scrittura / letturaw+
solo appenda
append / letturaa+


La modalità append apre il file in scrittura, ma posizionando il file pointer alla fine del file, in maniera da non sovrascriverne il contenutò, bensì "appenderlo".

Sul manuale ufficiale è presente la lista delle funzioni di filesystem

Per quanto riguarda le directory ecco come si lista il contenuto:



	<?
		$handle = opendir('$nomedir');
		echo "Contenuto della directory $nomedir<br>";
		while ($element = readdir($handle))
			echo "<br>$element";
		closedir($handle);
	?>


Sul manuale è presente la lista delle funzioni relativa alle directory.

7.0 Links

Ecco un elenco di url, relativi a php ma non solo:


Introduzione | Sintassi | Flusso di esecuzione e cicli | Funzioni | Passaggio di variabili | File & Directory | Links
Spinhacker404 Hacklab Genova