Archive for Php

File upload in Ajax

Con questo breve tutorial vedremo come realizzare un elementare sistema di file upload usando PHP e Ajax.
A dire la verità non è possibile realizzare un sistema di file-upload in Ajax puro a causa delle limitazioni di Javascript (su cui si basa Ajax) in campo di sicurezza.
La soluzione è quella di simulare l’effetto asincrono tramite un iframe.

Abbiamo quindi bisogno di:

  • Un form HTML
  • Un javascript che esegua una animazione, chiamato al submit del form.
  • Uno script PHP che esegua l’upload vero e proprio
  • Un iframe invisibile nella stessa pagina del form

Il form HTML è davvero semplice, c’è un campo per la scelta del file e un bottone.
Da notare il parametro enctype che indica il tipo di codifica.

<form action="upload.php" enctype="multipart/form-data" method="post"> File: <input name="myfile" type="file" />
<input name="submitBtn" type="submit" value="Upload" />
</form>

A questa pagina c’è da aggiungere un blocco che mostrerà l’animazione durante l’upload e per dare la conferma all’utente che l’operazione è riuscita. Inoltre, come già detto, aggiungiamo un iframe invisibie da usare come target del form.

<p id="f1_upload_process">Loading...
<img src="loader.gif" alt="" /></p>
<p id="result"></p>
<form action="upload.php" enctype="multipart/form-data" method="post"> File: <input name="myfile" type="file" />
<input name="submitBtn" type="submit" value="Upload" />
</form>
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>

Scriviamo adesso la semplice funzione javascript che rende il blocco contenente l’animazione visibile sulla pagina.

      function startUpload(){
      document.getElementById('f1_upload_process').style.visibility = 'visible';
      return true;
      }

E di riflesso scriviamo anche la funzione che verrà chiamata al termine del processo per mostrare un messaggio all’utente e fermare l’animazione.

      function stopUpload(success){
      var result = '';
      if (success == 1){
      document.getElementById('result').innerHTML =
      '<span class="msg">The file was uploaded successfully!< \/span><br /><br />';
      }
      else {
      document.getElementById('result').innerHTML =
      '<span class="emsg">There was an error during file upload!< \/span><br /><br />';
      }
      document.getElementById('f1_upload_process').style.visibility = 'hidden';
      return true;
      }
</span></span>

Visto che ci siamo diamo un po’ di stile al nostro form con qualche regola CSS

      #f1_upload_process{
      z-index:100;
      position:absolute;
      visibility:hidden;
      text-align:center;
      width:400px;
      margin:0px;
      padding:0px;
      background-color:#fff;
      border:1px solid #ccc;
      }
 
      form{
      text-align:center;
      width:390px;
      margin:0px;
      padding:5px;
      background-color:#fff;
      border:1px solid #ccc;
      }

Ora passiamo alla parte server.
Dovrebbe essere abbastanza semplice da capire, spieghiamo comunque qualcosa. Prima di tutto andiamo a settare il percorso di destinazione del file. Poi introduciamo una variabile che ci conterrà l’eventuale errore in fase di upload del file.
Procediamo quindi a spostare il file dalla directory temporanea alla sua destinazione finale.
Il codice PHP dovrebbe essere una cosa del genere

< ?php
$destination_path = getcwd().DIRECTORY_SEPARATOR;
$result = 0;
$target_path = $destination_path . basename( $_FILES['myfile']['name']);
if(@move_uploaded_file($_FILES['myfile']['tmp_name'], $target_path)) {
$result = 1;
}
sleep(1);
?>

Come visto nelle proprietà del form il codice PHP verrà eseguito all’interno dell’iframe nascosto. A questo punto non ci rimane che aggiungere al suo interno il codice js che chiamerà la funzione scritta precedentemente e che notificherà l’utente se l’upload è andato a buone fine o meno

      <script language="javascript" type="text/javascript">
      window.top.window.stopUpload(< ?php echo $result; ?>);
      </script>

Cosa vi avevo detto? Facile e veloce.
Se vi siete persi qualche passaggio o non vi è del tutto chiaro il funzionamento, se volete farmi i complimenti o mandarmi a cag*re, se volete invitarmi a cena fuori fatelo pure nei commenti.

Ping this!

Form con validazione in Ajax con mootols 3/3

Eccoci finalmente arrivati all’ultima parte di questo tutorial, come capirete si tratta solo di impostare la pagina HTML che conterrà i nostri scritp Ajax e PHP.

Per prima cosa creiamo un file index.php, dentro ci mettiamo prima la chiamata alla libreria mootools, poi il codice js della prima lezione.

Fatto questo possiamo mettere su un bel form html condito con un po di CSS per renderlo più attraente, l’importate è che vi ricordiate di mettere nel attributo target del tag form il valore register.php, cioè il nome della pagina creata nella seconda lezione.

Il risultato lo potete vedere qui!

Per qualsiasi informazione, dubbio, chiarimento e affini non esitate a commentare.

Technorati Tag: , , ,

Ping this!

Form con validazione in Ajax con mootools 2/3

Nel prcecedente tutorial abbiamo visto come usare la libreria js mootools e far effettuare una richiesta asincrona.

Oggi vedremo come creare il "motore" su cui si basa la validazione del nostro form; per prima cosa controlleremo se l’utente ha inserito tutti i dati, poi se le password inserite combaciano ed infine se l’indirizzo e-mail è valido.

<?php
    include(’functions.php’);

    if ($_POST['Nome']==” || strlen($_POST['Nome'])<3)
    {
        $errors[] = ‘Campo obbligatorio, il nome deve contenere almeno 3 caratteri’;
    }

    if ($_POST['Cognome']==” || strlen($_POST['Cognome'])<3)
    {
        $errors[] = ‘Campo obbligatorio, il cognome deve contenere almeno 3 caratteri’;
    }

    if ($_POST['Username']==” || alpha_numeric($_POST['Username'])==FALSE)
    {
        $errors[] = ‘Username obbligatorio, deve contenere valori alfanumerici’;
    }

    if ($_POST['Password']==” || alpha_numeric($_POST['Password'])==FALSE)
    {
        $errors[] = ‘Password obbligatoria, deve contenere valori alfanumerici’;
    }

    if ($_POST['Password']!=$_POST['re_Password'])
    {
        $errors[] = ‘Le due password non corrispondono’;
    }

    if (valid_email($_POST['Email'])==FALSE)
    {
        $errors[] = ‘Per piacere inserisci un indirizzo valido’;
    }

    if(is_array($errors))
    {
        echo ‘<p class="error"><b>Si sono verificati i seguenti errori</b></p>’;
        while (list($key,$value) = each($errors))
        {

            echo ‘<span class="error">’.$value.’</span><br />’;
        }
    }
    else {
        //fai qualcosa,
        echo ‘<p><b>OK!</b></p>’;
        echo ‘<span>La tua registrazione è avvenuta con successo!</span>’;
    }

?>

Il codice proposto include un file "functions.php" che contiene la definizione delle funzioni "alphanumeric" e "valid_email" utili alla validazione. Successivamente controlliamo che nome e cognome siano stringhe di almeno 3 caratteri, in caso contrario memorizziamo l’errore in un array chiamato "errors", controlliamo quindi che lo username e la password siano alfanumeriche e le 2 password combacino, infine controlliamo che l’e-mail sia valida mettendo la descrizione degli errori nell’array questo perchè ci potrebbero essere più errori contemporaneamente e quindi alla fine conviene mostrare il contenuto dell’array tramite un ciclo while, altrimenti se l’array non è stato creato (e quindi non ci sono errori) mostriamo un messaggio che indica all’utente l’avvenuta registrazione.

Come detto vengono utilizzate 2 funzioni per la validazione di utente, password ed email, eccovi il codice:

<?php

    function alpha_numeric($str)
    {
        return ( ! preg_match("/^([-a-z0-9])+$/i", $str)) ? FALSE : TRUE;
    }

    function valid_email($str)
    {
        return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
    }

?>

semplicemente valutano la stringa che viene loro passata tramite con una espressione regolare e restituiscono il relativo valore di verità.

Per un approfondimento sulle espressioni regolari in PHP fate riferimento a questi articoli qui e qui.

La prossima volta metteremo tutto insieme e vedremo all’opera quanto creato fin’ora, vi aspetto!

Technorati Tag: , , , ,

Ping this!

Un semplice esempio di geo-tagging

per Geotagging si intende il processo di aggiunta di una identificazione geografica ai dati (o metadati).

Quello che faremo però sarà un semplice sistema che sfruttando le API di HostIp ci fornirà le informazioni riguardo la nazione e la città dei visitatori del nostro sito web.

Gli ingredienti necessari sono:

  • PHP
  • Web server per provare il nostro script
  • Le API di HostIp reperibili qui
  • Un editor di testo
  • Sale e pepe quanto basta :D

Cominciamo da HostIp, è un progetto nato al fine di geo-localizzare gli ip il cui database è disponibili al pubblico tramite l’utilizzo di semplici API.

Vogliamo quindi realizzare un script che ci indichi la provenienza del nostro visitatore, quindi per prima cosa ci serve conoscere il suo ip, niente di più semplice
$ip=$_SERVER['REMOTE_ADDR'];
poi se avete dato un occhiata alle API avrete notato come HostIp costruisce un URL del tipo http://api.hostip.info/get_html.php?ip= indirizzo del client.
Quindi costruiamo l’URL e la mettiamo in una variabile
$url = "http://www.hostip.info/api/get.html?ip=".$ip;
vi sembrerà strano ma il più è fatto, ora ci basta acquisire il contenuto della nostra URL in un vettore i cui elementi sono una riga del file tramite la funzione file (che fantasia)
$result = file($url);
e adesso stampiamo il tutto con un ciclo
foreach($result as $line_num=>$line){
echo ($line."<br/>");
}

Questo potrebbe già bastare in quanto mostra Nazione e Città del client (anche se a volte il risultato non è proprio preciso) ma possiamo aggiungere qualcosina, come ad esempio visualizzare la bandiera della nazione.
HostIp fornisce un semplice meccanismo per far questo sempre sottoforma di un URL costruita ad-hoc del tipo http://api.hostip.info/flag.php?ip= indirizzo del visitatore.
Quindi creiamo un immagine con il <img> e all’attributo src diamo l’URL con l’ip che ci interessa

echo("<A href=\"http://www.hostip.info\">");
echo("<IMG src=\"http://api.hostip.info/flag.php?ip=".$ip."ALT=\"IP Address Lookup\">");
echo("</A>");

Ed ecco qui un esempio.
Davvero semplice, nel prossimo tutorial spero di poter mostrare come ottenere anche longitudine e latitudine per visualizzare la posizione all’interno di Google Maps, quindi alla prossima!

Ping this!

Flickr e le sue API

Flickr offre un servizio per la condivisione di immagini con tanto di gruppi, strumenti per l’organizzazione delle proprie foto, blog…..
Oggi voglio proporvi un tutorial su come sfruttare le API messe a disposizione da Flickr (raggiungibili a questo indirizzo) tramite PHP.
Prima di tutto dobbiamo procurarci in una chiave di licenza semplicemente richiedendola a Flickr dopo essersi scritti;
quindi useremo la funzione flickr.photos.search per la ricerca di fotografie all’interno dal portale; in PHP utilizzeremo un parametro “format” con valore “php_serial” per ottenere una risposta serializzata dalle API, in seguito tale risposta verrà de-serializzata tramite la funzione unserialize().
Otterremo una struttura di tipo JASON che useremo per costruire l’URL della foto; ma passiamo subito ai fatti:

#
# creiamo i parametri da passare all' API nell'URL
#

$params = array(
'api_key' => '81e7e11aeac57ac668609d316f6388ce',
'method' => 'flickr.photos.search',
'tags' => 'italy';
'format' => 'php_serial',
);

il primo parametro è la chiave che c’è stata fornita, il parametro method indica invece quale metodo delle API verrà richiamato, tags sono i tag relativi all’immagine che stiamo cercando (in questo caso verranno fornite le immagini con tag ‘italy’) ed infine il parametro ‘format’ di cui abbiamo già detto.

$encoded_params = array();

foreach ($params as $k => $v){

$encoded_params[] = urlencode($k).’=’.urlencode($v);
}

questa funzione serve semplicemente a trasformare i parametri contenuti nell’array (sia le chiavi che i valori) in maniera d’essere interpretabili correttamente come una URL.


#
# chiama l'API e decodifica la risposta
#

$url = "http://api.flickr.com/services/rest/?".implode('&', $encoded_params);

$rsp = file_get_contents($url);

$rsp_obj = unserialize($rsp);

viene quindi costruita una URL con i parametri contenuti nell’array che chiama l’API e la cui risposta viene de-serializzata ed utilizzabile d’ora in poi nella variabile $rsp_obj.


#
# mostriamo la foto corrispondente al primo risultato
#

if ($rsp_obj['stat'] == ‘ok’){

$tmp = $rsp_obj['photos']['photo'];
$farm = $tmp[0]['farm'];
$server=$tmp[0]['server'];
$id = $tmp[0]['id'];
$secret = $tmp[0]['secret'];
$addr=”http://farm”.$farm.”.static.flickr.com/”.$server.”/”.$id.”_”.$secret.”_t.jpg”;
echo(”<img alt=\”italy\” src=\”".$addr.”\”/>”);
}

la risposta che otteniamo è in formato JSON quindi ogni elemento è rappresentato da un oggetto JSON, gli attributi dell’elemento sono membri dell’oggetto con un valore stringa mentre i suoi figli sono membri dell’oggetto e con un valore di tipo oggetto, per maggiori informazioni visitate json.org.
Da PHP JASON è visto come un’array n-dimensionale, quindi se l’elemento ’stat’ ha valore ‘ok’ vuol dire che la risposta è stata accettata. Ci spostiamo sull’elemento ‘photo’ all’interno dell’oggetto ‘photos’ e operiamo sul primo risultato (quello cioè con indice 0).
Dobbiamo quindi costruire l’indirizzo relativo all’immagine da visualizzare; gli URL di Flickr sono del tipo
http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}_[mstb].jpg
dove farm-id, server-id, id e secret sono tutti attributi dell’oggetto JASON ‘photo’ come è facilmente intuibile dal codice; mentre mstb indicano la dimensione dell’immagine:
-m, immagine di massimo 240px di lato;
-s, immagine di 75×75 px;
-t, thumbnail (100px di lato);
-b, immagine di grosse dimensioni (1024 di lato);
la foto del codice precedente sarà quindi un thumbnail.
create quindi le variabili che contengono i diversi parametri e scelta la dimensione non ci rimane altre che costruire l’URL e visualizzare la nostra bella foto!
Ecco qui un esempio di quanto appena detto.
Spero di essere stato utile a chi volesse iniziare a muovere i primi passi con queste API; la parte più difficile stà nell’interpretare correttamente la risposta JASON ma usando l’API Explorer messo a disposizione per tutti i metodi non dovrebbe essere un problema.

Ping this!
Text Link Ads