Url brevi: realizzazione form di creazione tiny url

Posted on febbraio 26, 2010
Filed Under Appunti di Php | Leave a Comment

Oggi vedremo come realizzare un sistema analogo al famoso tinyurl per la generazione di url brevi. La tecnologia usata per lo sviluppo e’ PHP + MySQL con server Linux che supporti il rewrite delle url. E’ necessario conoscere come si crea un database in MySQL tramite il pannello PhpMyAdmin o altra utility di gestione dei database, cosa e’ il rewrite ed avere una conoscenza base di PHP.

L’obiettivo dell’articolo e’ convertire una url lunga e difficoltosa da ricordare con una url piu’ breve da comunicare ad amici e clienti.

Es.:

http://maps.google.it/maps?f=q&source=s_q&hl=it&geocode=&q=navigli&sll=45.440742,9.158692&sspn=0.012948,0.033088&ie=UTF8&radius=0.8&rq=1&ev=p&hq=navigli&hnear=&ll=45.440742,9.158692&spn=0.012948,0.033088&z=15

Convertirlo in:

http://www.urlbrevi.com/a/maps.php

Iniziamo creando la tabella url_brevi cosi’ fatta:

CREATE TABLE `url_brevi` (

`key_url` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`url` VARCHAR( 500 ) NOT NULL ,
`url_breve` VARCHAR( 20 ) NOT NULL ,
`data_ins` DATE NOT NULL) ENGINE = MYISAM

Dove:
- key_url e’ la chiave incrementale primaria;
- url e’ l’indirizzo da ridurre;
- url_breve e’ l’url breve generato dal sistema;
- data_ins e’ la data di inserimento dell’url.
La tabella verra’ utilizzata dal sistema per associare le url brevi alle url lunghe.

Iniziamo creando la pagina index.php completa contenente il form ove l’utente inserira’ la propria url e ricevera’ in risposta l’url breve da utilizzare. Questo il codice della pagina:
<?php
isset($_POST['url']) ? $urlBreve = addslashes($_POST['url']) : $urlBreve = “”;

$messaggio    = “”;

if (strlen($urlBreve)>0)
{
include(“config/db.php”);

// Crea stringa casuale…
function randomstring($len)
{
$i = 0;
$str = “”;
srand();
while($i<$len)
{
$str.=chr((rand()%26)+97);
$i++;
}

$str=$str.substr(uniqid (“”),0,22);
return $str;
}

$baseUrl    = “http://www.urlbrevi.com/“; // Sito fittizio utilizzato per il test.
$nomeTabella = “url_brevi”; // Nome della tabella presente in Database usata per il test.
$urlEsiste    = “SI”;

// Controllo la validita’ dell’url inserito…
if (filter_var($urlBreve,FILTER_VALIDATE_URL))
{
// Se l’url gia’ esiste…
while($urlEsiste == “SI”)
{
$urlRand = substr(randomstring(6),0,6);
$queryUrl = “SELECT * FROM $nomeTabella WHERE url_breve =’$urlRand’”;
$sqlBreve = @mysql_query($queryUrl);
if ($sqlBreve)
{
if (mysql_num_rows($sqlBreve)==0)
{
// Inserisco i dati in Database…
$queryInsUrl = “INSERT INTO $nomeTabella (url, url_breve, data_ins) VALUES (‘$urlBreve’, ‘$urlRand’, NOW())”;
$sqlBreveIns = @mysql_query($queryInsUrl);
$messaggio = “L’url breve da utilizzare e’:<br><a href=’”.$baseUrl.”a/”.$urlRand.”.php’ target=’_blank’>”.$baseUrl.”a/”.$urlRand.”.php</a>”;
$urlEsiste = “NO”;
}
}
else
$messaggio = “Problemi con il database. Ti invitiamo a riprovare piu’ tardi.”;
}
}
else
$messaggio = “Url inserito non valido. Deve essere nella forma: http://www.miositodaridurre.tld/stringa”;
}
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Url brevi</title>
</head>

<body>
<?php
if (strlen($messaggio)>0)
echo($messaggio);
?>
<br /><br />
<div>Inserisci l’url da ridurre</div>
<form method=”post” name=”modulo”>
Url: <input type=”text” name=”url” maxlength=”500″ /><br /><br />
<input type=”submit” value=”Crea url >>” />
</form>
</body>
</html>

Il form conterra’ un unico campo contenente il form da ridurre.
Una volta inserito l’url da ridurre il sistema chiamera’ la stessa pagina passando l’url inserito dall’utente in POST, si colleghera’ al Database, creera’ una url in maniera randomica lunga 6 caratteri fino a che l’url breve risultera’ univoco nel database e lo mostrera’ a video.
Se l’url non e’ valido viene mostrato a video la forma dell’url da utilizzare. L’url viene validato con l’ausilio della funzione filter_var gia’ descritta in un precedente post in questo sito.
Il file db.php dentro la cartella config (config/db.php) conterra’ i parametri di configurazione del database.
<?php
$dbhost     = ‘HOST‘;
$dbusername     = ‘USER‘;
$dbpasswd     = ‘PSW‘;
$database_name     = ‘DBNAME‘;

$connection     = mysql_connect(“$dbhost”,”$dbusername”,”$dbpasswd”) or die (“Impossibile collegarsi al server.”);

$db             = mysql_select_db(“$database_name”, $connection) or die(“Impossibile selezionare il database.”);
?>

Dove:
- HOST e’ il nome dell’host dove e’ presente il Database
- USER e’ il nome dell’utente che puo’ accedere al Database
- PSW e’ la password per accedere al Database
- DBNAME e’ il nome del Database
Sulla root del sito andremo ad inserire il file .htaccess cosi ‘fatto:
<IfModule mod_rewrite.c>
RewriteEngine On

#REDIRECT
RewriteRule ^a/(.*).php$ urlbreve.php?url=$1

</IfModule>
Una volta che accederemo al link che il sistema ci mostra a video interverra’ il sistema di rewrite che chiamera’ il file urlbreve.php passandogli in GET l’url da cercare.
Se l’indirizzo viene trovato il sistema rimanda all’url altrimenti mostra a video un messaggio di url non trovato.
Questo il codice della pagina urlbreve.php:
<?php
include(“config/db.php”);

isset($_GET['url']) ? $urlBreve = addslashes($_GET['url']) : $urlBreve = “”;

$messaggio = “Url non presente in Database.”;
$nomeTabella = “url_brevi”;

$queryUrl = “SELECT * FROM $nomeTabella WHERE url_breve =’$urlBreve’”;
$sqlBreve = @mysql_query($queryUrl);
if (($sqlBreve) AND (mysql_num_rows($sqlBreve)>0))
{
$dati = mysql_fetch_array($sqlBreve);
$url = stripslashes($dati['url']);
header(‘Location: ‘.$url);
die();
}
echo($messaggio);
?>

Se il sistema non trova l’url in Database mostra a video il messaggio di errore, altrimenti l’utente viene rimandato all’url trovato in database.
Ulteriori sviluppi che lascio a voi:
- personalizzazione url rilasciato
Inserire un nuovo campo nel form principale che l’utente puo’ compilare e sara’ il nome dell’url breve restituito (Es.: maps) se disponibile.

- scadenza url dopo 7 giorni
Bastera’ fare una routine che tramite un cronjob verifichi per ogni url creata non siano trascorsi piu’ di 7 giorni:

CREATE TABLE `test`.`url_brevi` (

`key_url` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`url` VARCHAR( 400 ) NOT NULL ,
`url_breve` VARCHAR( 20 ) NOT NULL ,
`data_ins` DATE NOT NULL

) ENGINE = MYISAM

Others Script adv

Leave a Reply