TUTORIEL PHP 
Créer un lien raccourci
Un script complet vous permettant d'émuler TinyURL, et de stocker vos liens courts sur votre propre site. (29/07/2004)
Présentation
Les services gratuits de gestion d'URL raccourcies sont légion : TinyURL, ShortURL, SnipURL ou MakeAShorterLink sont très utilisés dès que l'utilisateur souhaite transmettre une URL longue ou compliquée sans crainte de la voir coupée par le logiciel de messagerie, ou mal retranscrite.

Un de leurs défauts, cela étant, est que vous êtes dépendant de leurs services pour la bonne redirection de vos liens. Nous vous proposons donc ici un script vous permettant d'héberger sur votre propre site vos liens courts.

Le script est facilement modifiable pour ajouter une section d'administration afin d'effacer ou modifier des liens stockés...

Le code
<?php
$conn = mysql_connect("localhost", "root", "")
  or die("Impossible de se connecter");
$db = mysql_select_db("test", $conn)
  or die(mysql_error());
$table = "petiturl";

function enregistrer($url)
  {
  global $table;
  if ( !ereg('^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:
[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-]
{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]
{1}[09]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|
[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4]
[0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|
([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.
(com|edu|gov|int|mil|net|org|biz|arpa|info|name|
pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|
[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*$', $url) )
    {
    ?>Cet URL n'est pas valide.<?
    }
  else
    {
    $req = "INSERT INTO $table (id, url) ";
    $req .= "VALUES ('', '$url');";
    if (mysql_query($req))
      {
      $adresse = "http://" . $_SERVER['HTTP_HOST'] .       $_SERVER['PHP_SELF'] . "?id=" . mysql_insert_id();
      echo "Votre petitURL est :<pre><a href='$adresse'>$adresse</a></pre>";
      }
    else
      {
      ?>Raté!<?
      }
    }
  }

function renvoyer($num)
  {
  global $table;
  $req = "SELECT * FROM $table WHERE id = '$num';";
  $res = mysql_query($req)
    or die("Query failed");
  if (mysql_num_rows($res) == 0)
    {
    ?>Cet ID ne se trouve pas dans notre base.<?
    }
  else
    {
    header("Location: " . mysql_result($res, 0, "url"));
    }
  }

function affichage()
  {
  if ( (isset($_REQUEST['creer']) && $_REQUEST['creer'] == 'oui')
&& (isset($_REQUEST['url']) && !empty($_REQUEST['url']) ) )
    {
    enregistrer($_REQUEST['url']);
    }
  elseif ( (isset($_REQUEST['id']) && !empty($_REQUEST['id']) ) )
    {
    renvoyer($_REQUEST['id']);
    }
  else
    {
?>
<form action="<?=$_SERVER['PHP_SELF'];?>" method="GPOST">
  <input type="hidden" name="creer" value="oui">
  URL: <input type="text" name="url" value="http://">
  <input type="submit" name="action" value="Réduire">
</form>
<?php
    }
  }
?>
<html>
  <head>
    <title>petitURL</title>
  </head>
  <body>
    <?php affichage(); ?>
  </body>
</html>



Quelques explications
Notez que l'expression régulière n'est pas de notre cru, mais du site RegExLib.com.

Nous avons simplifié au maximum : la table comprend deux champs : id et url :
CREATE TABLE `tinyurl` (
  `id` int(11) NOT NULL auto_increment,
  `url` varchar(255) NOT NULL default '',
  PRIMARY KEY (`id`)
  )

  Forum

Réagissez dans les forums de JDN Développeurs

L'id sert donc à la fois de spécification de l'URL, et à trouver l'URL dans la base. L'URL récupérée depuis la base de donnée modifie aussitôt la page visualisée par l'utilisation de la fonction header().
Pour parfaire la chose, on pourrait créer un fichier .htaccess renvoyant les URL du type http://serveur/url/53 vers http://serveur/dossier/ptiturl/index.php?id=53...

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages