Inserire i commenti in PHP

Obiettivo del Tutorial: Imparare come si inseriscono i commenti nel linguaggio PHP.

In questo tutorial facciamo un pò di analisi sulla sintassi del linguaggio PHP, in particolare vedremo come inserire i commenti in PHP.

// Commento su una riga /* Commento su più righe */ # Commento stile Unix PHP supporta tre differenti tipologie di commento.

Inserire Commenti Multilinea in PHP

Anche in PHP è possibile inserire commenti multilinea, è lo si fà utilizzando una sintassi simile a quella del linguaggio C.

Il commento và inserito tra: “/*” e “*/

Esempio di commento multilinea in PHP:

/* Questo è un Commento */
/* Il commento multilinea 
PHP ha una sintassi
simile a quella del linguaggio C .
Questo è un esempio di commento multilinea.*/

Il commento su singola linea segue uno stile comune a molti altri linguaggi tra cui JavaScript. Le righe di commento iniziano con “//”

Inserire un Commento su singola linea in PHP

// Questo è un commento su singola linea.

Un commento su singola linea può essere inserito anche nel seguente modo:

# Commento in stile Unix

E con quest’iltimo esempio abbiamo esaurito le tipologie di commenti in php.

rand() – Generare numeri casuali con PHP

Obiettivo del tutorial: Utilizzare la funzione rand per generare numeri casuali in PHP. Realizzeremo un programma che utilizza l’esito di un evento casuale generato da rand() per compiere una scelta.

rand()

Anche in PHP come in quasi tutti gli altri linguaggi di programmazione, esistono delle funzioni precostituite per generare numeri casuali.

In PHP per generare numeri casuali si usa la funzione rand().

Dove inizio e fine sono rispettivamente i limiti minimi e massimi scelti, e tra questi viene estratto un numero a caso. Questo metodo permette di generare un numero casuale compreso tra “minimo” e un “massimo” definiti dall’utente alla chiamata della funzione.

La sintassi generale per utilizzare della funzione rand() è:

rand(minimo,massimo);

Se chiamata senza i parametri opzionali min, max, rand() restituisce un valore pseudo casuale compreso fra 0 e RAND_MAX. Se ad esempio si desidera un numero casuale compreso fra 5 e 100 (inclusi), usare:

rand (5, 15);

Proviamo un semplice esempio di funzionamento:

<?php
$code = rand(5, 30);
echo "$code";
?>

Generare password casuale con PHP

Obiettivo del tutorial: Costruire una password di 15 caratteri ognuno dei quali è generato in maniera casuale. Utilizzeremo le funzioni rand() e chr().

rand() – Un problema comune a molti programmatori è quello di generare password casuali.

In questo tutorial studieremo il modo per generare una password casuale di lunghezza 15 caratteri

L’algoritmo utilizza una politica diversa di “cifratura” a seconda se il carattere sia pari o dispari. Ai caratteri pari aggiungo una lettera casuale usando chr() in combinazione con rand() che genera un valore numerico compreso tra 97 e 122, numeri che corrispondono alle lettere dell’alfabeto nella tabella dei caratteri ASCII.

Se il carattere è dispari aggiungo un numero a caso tra 0-9.

Al termine visualizzo a video il risultato.

Forse il codice può chiarire meglio di ogni parola:

<?
// Lunghezza della password a 15 caratteri
$lunghezza_pass = 15;

// Ciclo su ogni carattere della password
for ($i=1; $i<=$lunghezza_pass; $i++)
{
// Se $i è multiplo di 2...
if ($i % 2){

/* Aggiungo una lettera casuale usando chr() 
in combinazione con rand() */

$pass_generata = $pass_generata . chr(rand(97,122));

// Se $x non è multiplo di 2...
}else{

// Aggiungo alla password un numero 
// compreso tra 0 e 9

$pass_generata = $pass_generata . rand(0,9);
}
}
// Visualizzo a video il risultato

echo $pass_generata;
?>

 

Array e PHP – Teoria ed Esempi

Obiettivo del tutorial: Familiarizzare con gli array. Vedremo la teoria necessaria e tanti esempi per utilizzare immediatamente questa struttura dati nel linguaggio PHP.

Cos’è un array?

Un array è una variabile “complessa”. Come in molti altri linguaggi in un array in php le informazioni sono immagazzinate nella forma Chiave -> Valore.

Il tipo array in php è ottimizzato in diversi modi, si può utilizzare come un lista (o vettore) o come tabella hash, cioè una tabella associativa dove i dati sono immagazzinati secondo coppie chiave -> valore.

Vediamo subito qualche esempio semplice:

$colori = array('bianco'
, 'viola' 	
, 'giallo'
, 'verde'
, 'blu'
, 'rosso');

Sopra abbiamo definito l’array “$colori”. Utilizzando questo metodo di definizione dell’array abbiamo sfruttato una ottimizzazione del php. Il php automaticamente associa un indice ad ogni valore in modo progressivo.

E’ come se avessimo scritto:

$colori[0]='bianco';
$colori[1]='viola';
$colori[2]='giallo';
$colori[3]='verde';
$colori[4]='blu';
$colori[5]='rosso';

Da notare che l’indice assegnato di default al primo elemento dell’array è l’indice 0.

Tuttavia è possibile far partire la numerazione dal valore di indice che si vuole nel seguente modo:

$colori = array(1 => 'bianco'
, 'viola'
, 'giallo'
, 'verde'
, 'blu'
, 'rosso');

Ricapitolando abbiamo visto due modi per definire un vettore in php e come modificare il valore di partenza dell’indice.

Ma se vogliamo aggiungere altri elementi ad un vettore già definito ?

Per aggiungere un elemento in coda ad un vettore esistente si usa la seguenti sintassi:

$colori[] = 'fucsia';

Per inserire un valore ad un indice ben preciso si può usare la seguente sintassi:

$colori[] = 'fucsia';
$colori[4] = 'celestino';
$colori[1] = 'nero';

Nel primo caso l’elemento è inserito in ultima posizione. I vecchi elementi presenti a quegli indici verranno sostituiti con i nuovi.

Per visualizzare gli elementi dell’array si può utilizzare la seguente sintassi, un’istruzione di visualizzazione più l’eleento da visualizzare:

print $colori[0]";
print $colori[1];

Per contare gli elementi di un’array si può utilizzare la funzione count:

$numero_elementi = count($colori);

E’ possibile concellare elementi dall’array:

unset($colori[3]); //elimina l'elemento 'verde'
unset($colori);    //elimina l'intero array $colori

La forma più generale di array è quella che utilizza la coppia chiave => valore. Vediamo la sintassi di definizione:

$a = array(  
 ’color’ => ’red’
, ’taste’ => ’sweet’
, ’shape’ => ’round’
, ’name’ => ’apple’
, 4 // in questo caso la chiave sarà 0
);

// è completamente equivalente a:

$a[’color’] = ’red’;
$a[’taste’] = ’sweet’;
$a[’shape’] = ’round’;
$a[’name’] = ’apple’;
$a[] = 4; // in questo caso la chiave sarà 0

Da notare come la forma vista nel primo esempio sia una facilitazione che il php offre della forma più generale che è quella vista nell’ultimo esempio.

Il primo esempio si sarebbe potuto definire, senza usare le semplificazioni del linguaggio, anche in questo modo:

$colori = array( 0 =>'bianco'
,1 =>'viola' 
,2 =>'giallo'
,3 =>'verde'
,4 =>'blu'
,5 =>'rosso');

Il tutorial è lontano dall’essere esaustivo, si sono presentate un pò di tecniche per avere un idea di come lavorare con gli array. Non mancherò di inserire riferimenti ad altri tutorial di webspazio in cui si usano altre tecniche.

Visualizzare un’immagine presa a caso da un array ogni volta che si apre la pagina web

Obiettivo del tutorial: Definizione del codice PHP necessario per visualizzare un’immagine presa a caso da un array ogni volta che si apre la pagina web.

In questo tutorial vedremo il codice PHP che permette di caricare una immagine casuale tra tutte quelle immagazzinate in un vettore.

Prima di iniziare con il codice di questo tutorial vi segnalo due risorse che potrebbero esservi utili:

Generare numeri casuali con PHP rand() – Generare numeri casuali con PHP

Numeri casuali con PHP – Utilizziamo il metodo rand math per generare numeri casuali nel linguaggio PHP.

Come utilizzare gli array in PHP Array e PHP – Teoria ed Esempi

Teoria sugli array e tanti esempi di utilizzo per utilizzare immediatamente questa struttura dati nel linguaggio PHP.

Se già conoscete array e generazione di numeri casuali, potete partire direttamente con questo tutorial.

Il codice per visualizzare un’immagine casuale presa da un array con PHP

$img = array('immagine1.jpg'
, 'immagine2.jpg' 	
, 'immagine3.jpg'
, 'immagine4.jpg');  

$link_siti = array('www.webspazio.it'
, 'www.bitportal.it'
, 'www.hostingsitoweb.it'
, 'www.lavorare-da-casa.net');

/*Estraggo un numero casuale 
 tra 1 e 4 e la salvo in $ran*/
$ran = rand(1,4)-1;

echo "<a href=\"http://$link_siti[$ran]\"><img src=\"$img[$ran]\" alt=\"Visita il sito dell'autore\" target=\"blank\" border=\"0\" /></a>";

Spiegazione algoritmo di funzionamento

Come struttura dati per memorizzare l’indirizzo web delle immagini è stato usato un vettore, nel quale ho inserito un link per ogni “cella” del vettore. Successivamente utilizzando “$ran” (numero casuale tra 1 e 4) faccio la scelta dell’immagine da visualizzare.

Attenzione: Le immagini sono salvate dalla posizione 0 alla 3, quindi al numero casuale trovato bisogna sottrarre “1”.

Nella fase di visualizzazione dell’immagine uso rand() per “pescare” nell’array delle immagini.

Non è ancora finito, nell’esempio ho agginto la possibilità di linkare una pagina diversa a seconda della pagina che viene visualizzata.

In pratica l’esempio sopra funziona come un circuito di rotazione banner dove i banner dei siti web da pubblicizzare vengono visualizzati in modo random.

Lo script sopra potrebbe essere ulteriormente migliorato aggiungendo qualche riga di javascript per fargli svolgere una rotazione banner random.

<?php
$img = array('immagine1.jpg'
, 'immagine2.jpg' 	
, 'immagine3.jpg'
, 'immagine4.jpg');  

$link_siti = array('www.webspazio.it'
, 'www.bitportal.it'
, 'www.hostingsitoweb.it'
, 'www.lavorare-da-casa.net');

/*Estraggo un numero casuale 
 tra 1 e 4 e la salvo in $ran*/
$ran = rand(1,4)-1;
print "document.write('<center>')
document.write('"<a href=\"http://$link_siti[$ran]\">
   <img src=\"$img[$ran]\" alt=\"Visita il 
   sito dell'autore\" target=\"blank\" border=\"0\" /></a>";')
document.write('</center>')";   
?>

Salvando lo script sopra come “banner.php” sarà possibile richiamare la rotazione nei file dove si necessita nel seguente modo:

<script src="https://www.tuosito.com/banner.php"></script>

Bene con quest’ultima considerazione l’esempio dovrebbe essere chiaro, siamo anche riusciti a realizzare uno script per far girare i banner in modo casuale.

Visualizzare una query al database dividendola in pagine

Obiettivo del tutorial: Definizione del codice PHP necessario per Visualizzare una query al database dividendola in pagine.

In questo tutorial vedremo il codice PHP che permette di fare una query al database per prelevare dati, di scegliere quante righe del database visualizzare per pagina, e come fare la navigazioen tra le pagine create.

Preliminari:
Partirò dal presupposto che abbiate un database nel quale avete creato una tabella come la seguente:

$query = 'CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
username VARCHAR(30) NOT NULL,
password VARCHAR(20) NOT NULL,
email VARCHAR(40) NOT NULL)';

Quindi creata la tabella nel database il codice per raggiungere quanto ci si era prefissati è:

Il codice:

<?php
// Connessione al database.
$dbhost='';
$dbusername='';
$dbuserpass='';
$dbname='';

// Connessione al database
mysql_connect ($dbhost, $dbusername, $dbuserpass);

if (!mysql_select_db($dbname)) die(mysql_error());

echo "<h2>Visualizza record</h2>";

$rowsPerPage = 2; // Righe per pagina
$pageNum = 1; // Pagina iniziale di default

// Settaggio pagina corrente
if(isset($_GET['page']))
{
$pageNum = $_GET['page'];
}

// determinazione offset
$offset = ($pageNum - 1) * $rowsPerPage;

$query = " SELECT id,username,email FROM users " .
" ORDER BY id LIMIT $offset, $rowsPerPage"; 
$result = mysql_query($query) or die('Error, query failed');

echo "<table border=1>
<tr><td>ID</td><td>Name</td>
                     <td>Email</td></tr>";
// Visualizzo le informazioni
while($row = mysql_fetch_array($result))
{
echo "<tr><td>".$row['id']."</td><td>
      ".$row['username']."</td>
        <td>".$row['email']."</td></tr>";
}
echo "</table>";

$query = "SELECT COUNT(id) AS numrows FROM users";
$result = mysql_query($query) or die('Error, query failed');
$row = mysql_fetch_array($result, MYSQL_ASSOC);
$numrows = $row['numrows'];

// numero di pagine
$maxPage = ceil($numrows/$rowsPerPage);

$self = $_SERVER['PHP_SELF'];
$nav = '';

for($page = 1; $page <= $maxPage; $page++)
{
if ($page == $pageNum)
{
$nav .= " $page ";
}
else
{
$nav .= " <a href=\"$self?page=$page\">$page</a> ";
}
}
//creazione dei link next e prev  
// e il link per andare direttamente in ultima pagina

if ($pageNum > 1)
{
$page = $pageNum - 1;
$prev = " <a href=\"$self?page=$page\">[Prev]</a> ";

$first = " <a href=\"$self?page=1\">[First Page]</a> ";
}
else
{
$prev = ' ';
$first = ' ';
}

if ($pageNum < $maxPage)
{
$page = $pageNum + 1;
$next = " <a href=\"$self?page=$page\">[Next]</a> ";

$last = " <a href=\"$self?page=$maxPage\">[Last Page]</a> ";
}
else
{
$next = ' ';
$last = ' ';
}

//Stampa i link di navigazione
echo $first . $prev . $nav . $next . $last;
?>

Spiegazione algoritmo di funzionamento

Leggendo i commenti nel codice il funzionamento dovrebbe essere abbastanza chiaro.

Lasciando le impostazioni di default, vengono visualizzate due righe per pagina e la barretta di navigazione.

strcmp, strcasecmp: Funzioni per comparare stringhe in PHP

Obiettivo del tutorial: Imparare ad utilizzare due importanti funzioni PHP per la comparazione di stringhe: strcmp() e strcasecmp().

Php mette a disposizione degli sviluppatori diverse funzioni per comparare stringhe. Nel tutorial di seguito esamineremo le funzioni strcmp() e strcasecmp().
Le funzioni sopra dopo aver confrontato le stringhe passate come parametri ritornano diverse informazioni utili.

strcmp() strcmp()
Compara due stringhe passate come parametri e ritorna un valore positivo se il primo parametro č maggiore del secondo, negativo se minore. Se invece le due stringhe sono uguali la funzione ritornerā “0”.

strcasecmp() strcasecmp()
Svolge un lavoro uguale a quello svolto dalla “strcmp()” con la differenza che strcasecmp() non fā distinzione tra caratteri maiuscoli e minuscoli.

Esempio comparazione stringhe

<?php
  $a = 'PHP';
  $b = 'php';
  echo 'strcmp(): ' . strcmp($a, $b) . '<br>';
  echo 'strcasecmp(): ' . strcasecmp($a, $b);
?>

L’output prodotto dal codice sopra sara’:

strcmp(): -1
strcasecmp(): 0

Verificare username e password in PHP.

Obiettivo del tutorial: Approfondire la conoscenza delle funzioni PHP per la comparazione di stringhe: strcmp() e strcasecmp() utilizzandole nell’esempio che verificare username e password in PHP.

In questo tutorial PHP vediamo come realizzare uno script PHP per la validazione di username e password.

Supponiamo di voler verificare username e password inseriti in un form di login HTML.

Due standard de facto presenti sul web sono:

  • Lo username non è case sensitive
  • La password è case sensitive

Per poter fare uno script di validazione fedele agli standard che comunemente si trovano sul web possiamo utilizzare la funzione strcasecmp() per la comparazione degli username e strcmp() per la comparazione delle password.

Supponendo che il form HTML passi i dati allo script utilizzando il metodo GET (nota: non è una buona idea passare dati sensibili con il metodo GET) possimamo utilizzare lo script di seguito per la validazione:

<?php
  //recupero user e pass dal form di login
  $user = (isset($_GET['user'])) ? $_GET['user'] : '';
  $pass = (isset($_GET['pass'])) ? $_GET['pass'] : '';

  //verifico user e pass
  if ((strcasecmp($user, 'webSPAZIO') == 0 
              && strcmp($pass, 'Secret') == 0)
  ) {
    echo 'Login effettuto.';
  } else {
    echo 'Login fallito.';
  }
?>

nota che la password è case sensitive, quindi deve essere scritta con la ‘S’ di secret maiuscola, lo user invece non è case sensitive.

Notate in alto, nella barra degli indirizzi del browser, come utilizzando il metodo GET per passare i dati questi siano visibili nell’indirizzo. Vedrete una cosa simile a:

https://www.webspazio.it/tutorial_php/verifica_form.php?user=webspazio&pass;=Secret

htmlspecialchars, htmlentities, strip_tags: Alcune funzioni PHP da utilizzare per difendersi dal Cross Site Scripting – XSS.

Obiettivo del tutorial: Mostrare l’importanza dell’utilizzo delle funzioni htmlspecialchars , htmlentities e strip_tags per scrivere codice non vulnerabile con attacchi di cross site scripting.

Nel tutorial PHP seguente vedremo quanto sia importante, quando si scrivono script che elaborano input dell’utente, convertire le stringhe di input inserite dall’utente in html.

Se si tralascia questo passaggio si è potenzialmente esposti al codice dannoso che l’utente potrebbe inserire attraverso la casella di input.

Guardate l’esempio seguente:

<?php
// Supponiamo che l'utente inserisca l'input
// contenuto nella seguente variabile.
  $input = '<script type="text/javascript">
alert("Attenzione input non controllato");
 </script>';

// se l'input non viene gestito correttamente 
// l'utente potrà eseguire codice arbitrario 
// da quella casella di input.
  echo htmlspecialchars($input) . '<br>';
  echo htmlentities($input);
// Le due funzioni sopra stampano l'input 
// dell'utente convertendolo prima in html.
// Quindi nessun codice dannoso inserito 
// dall'utente sarà eseguito.
  echo $input;
// Se non faccio nessun controllo il codice 
// sarà esposto ad attacchi XSS.

?>

Notate che filtrando l’input con htmlspecialchars e htmlentities lo script si difende dagli attacchi di Cross Site Scripting. Se invece non si controlla l’input l’utente può fare in modo che lo script esegua del suo codice (dell’utente).

Come funzionano htmlspecialchars e htmlentities ?

htmlspecialchars() htmlspecialchars()

Questa funzione converte l’argomento in codice html. Ad esempio i caratteri “<” e “>” vengono convertiti in “<” e “>”.

htmlentities() htmlentities()

Questa funzione funziona sostanzialmente come la precedente, ma con qualche variante. htmlentities usa le HTML entities per le conversioni di caratteri

per eliminare i caratteri html c’è un’altra interessante funzione:

strip_tags()

strip_tags() elimina i tag HML dalle stringhe che gli vengono passate come parametri.

<?php

  $input = 'caratteri in <b>Grassetto</b> 
      <script type="text/javascript">
alert("Attenzione input non controllato");
 </script>';

// Elimina i tag html
  echo strip_tags($input);
// Elimina i tag html lasciando
// quelli passati come parametro.
  echo strip_tags($input, '<b>');

?>

In conclusione: In PHP è importanssimo controllare qualsiasi cosa l’utente inserisce nelle caselle di input.

cyrpt md5, sha1: Criptare e decriptare stringhe in php

Obiettivo del tutorial: Utilizzare le funzion crypt() md5(), sha1() per criptare e decriptare stringhe.

In un tutorial precedente abbiamo visto uno script per verificare username e password. In questo tutorial aggiungeremo altri elementi all’argomento Verifica del form di login.

Una cosa da evitare quando si costruisce uno script per l’autenticazione è di evitare di salvare testualmente le password nel database.

Conviene sempre prima criptarle e poi salvarle nel database.

Di seguito vedremo la funzione crypt() per criptare e decriptare stringhe.

crypt() usa un algoritmo di criptazione DES.

Il codice seguente recupera la password passata dal form di login con il metodo GET e la confronta con la password criptata prelevata dal database. In questo esempio non sono state inserite le funzioni per prelevare la password dal database si assume che la password criptata sia stata prelevata è immagazzinata nella variabile “$encpass”.

<?php
  $pass = (isset($_GET['pass'])) ? $_GET['pass'] :  '';
  $encpass = '$1$FK3.qn2.$Si5KhnprsRb.N.SEF4GMW0';
  
  // Se criptando $pass si ottiene $encpass
  // allora crypt ritorna $encpass.
  if (crypt($pass, $encpass) === $encpass) {
    echo 'Login effettuato.';
  } else {
    echo 'Login fallito.';
  }
?>

E’ molto importante non salvare nei database le password testualmente, senza alcun tipo di criptazione.

Altri due algoritmi di criptazione molto usati sono il Secure Hash Algorithm 1 (SHA1) e Message Digest Algorithm 5 (MD5). Php supporta questi algoritmi con le funzioni sha1() e md5.

Il codice per implementare queste funzioni è simile a quello visto per la funzione cript().

Esempio di codice con sha1()

<?php
  $pass = (isset($_GET['pass'])) ? $_GET['pass'] :'';

  $sha1pass = '61c2feed11e0e53eb8e295ab8da78150be12f301';

  if (sha1($pass) === $sha1pass) {
    echo 'Login effettuato.';
  } else {
    echo 'Login fallito.';
  }
?>

Esempio di codice con md5()

<?php
  $pass = (isset($_GET['pass'])) ? $_GET['pass'] :'';

  $md5pass = '6958b43cb096e036f872d65d6a4dc01b';

  if (md5($pass) === $md5pass) {

    echo 'Login effettuato.';
  } else {
    echo 'Login fallito.';
  }
?>

La differenza tra questi ultimi due algoritmi è il precedente è che per SHA1 e MD5 il checksum di una stringa è sempre lo stesso, per il DES cambia ogni volta.