Hur får man en sådan där kort url?
Har du en lång och ful url och vill skicka över en kortare variant. Använder du http://www.shorturl.com/ ? Undrar du hur dom gör det? Nu ska du få veta.
Vi kommer att skapa lite filer och en databas och snart vara igång.
Jag kommer köra från en mapp som heter KortUrl i min xampp-installation. Så min bas-url kommer vara http://localhost/KortUrl
Det första vi gör är att skapa en databas och en tabell. Så här kommer lite sql-kod
CREATE DATABASE `shorturl` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `shorturl`;CREATE TABLE IF NOT EXISTS `links` (
`l_id` int(11) NOT NULL AUTO_INCREMENT,
`l_url` varchar(500) NOT NULL,
`l_title` varchar(500) NOT NULL,
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`l_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1
Så här skapas en databas som heter shorturl och en tabell som heter links i den. Links innehåller 1 id, url:en som vi vill länka till. title som ska innehålla titeln på sidan vi länkar till. samt ett “skapat” datum
Skapa en .htaccess-fil först. så att vi kan göra så kort länk som möjligt.
Den får se ut som följande:
RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-])$ includes/loadUrl.php?lid=$1
Vad som händer är att om jag knappar in http://localhost/KortUrl/1 kommer den att köra http://lovalhost/KortUrl/includes/loadUrl.php?lid=1
Så i loadUrl kommer vi ha tillgång till $_GET[‘lid’] som vi kan använda till något roligt. 1:an är vår unika identifierare.
Vi går vidare till att skapa en index.php i rot-mappen. Den får ha följande innehåll. inget direkt komplicerat
<?php
include ‘includes/config.php’;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Korta URL:er</title>
</head>
<body>
<h1>Skapa din korta URL</h1>
<form method="post" action="includes/addLink.php">
<label>Länk: <input type="text" name="l_url"/></label><br>
<input type="submit" value="Skapa kort länk"/><input type="reset" value="rensa"/>
</form>
<?php
include ‘includes/listtenlatest.php’;
?>
</body>
</html>
Som vi ser i koden har vi en bra tanke om vad vi ska göra härnäst. Vi hänvisar till 3 filer som vi ännu inte har byggt. config.php, addLink.php (som ska ta hand om datat från vårt formulär), och en listtenlatest.php som är lite uppenbar.
Vi börjar med config.php som vi lägger i mappen includes.
<?php
$db_host = "localhost";
$db_user = "root";
$db_password = "";
$db_name = "shorturl";
$link = mysql_connect($db_host, $db_user, $db_password) or die(mysql_error());
?>
Nu tar vi en titt på addLink (som vi lägger i includes). Där kommer lite rolig kod.
<?php
include(‘config.php’);
extract($_POST);
//vi kollar om vi kan få tag på sidan, annars är det onödigt att buffra massa data
if (@fclose(@fopen($l_url, "r")))
{
$file = file($l_url);
$file = implode("",$file);
// vi letar i "filen" efter <title> taggarna. Och stjäl det emellan. Sätter $l_title till det
if(preg_match("/<title>(.+)<\/title>/i",$file,$m))
$l_title = $m[1];
}
else
$l_title = $l_url;mysql_select_db($db_name,$link);
$sqlInsert = "insert into links (l_url,l_title) values (‘$l_url’,'$l_title’)";
mysql_query($sqlInsert,$link) or die(mysql_error());
$last_id = mysql_insert_id($link);$message = "<h1>Din nya länk är <a href=’../$last_id’>http://localhost/KortUrl/$last_id</a></h1>";
$message .= "<p>Din långa url var:<br> <i>$l_url</i></p>";
echo $message
?>
Så här letar vi upp titeln på sidan. Kopplar sidan url till ett id. Som vi sedan kan leta upp i loadUrl.php. Men först tar vi listtenlatest.php som vi också har i includes.
Här rapar vi helt enkelt upp dom 10 senaste länkarna och presenterar dom med kort länk, lång länk och titel.
<?php
mysql_select_db($db_name, $link);
$sqlTenLatest = "select * from links order by l_id desc limit 10";
$result = mysql_query($sqlTenLatest,$link) or die(mysql_error());$num_rows = mysql_num_rows($result);
if($num_rows >0)
{
$rows = mysql_fetch_array($result) or die(mysql_error());
do
{
extract($rows);
$link = "<p>$l_title<br>$l_url<br><i><a href=’/$l_id’>http://localhost/KortUrl/$l_id</a></i></p>";
echo $link;} while($rows = mysql_fetch_assoc($result));
}
else
{
echo "<h1>Kom igen, skapa första länken!</h1>";
}
?>
Om vi nu går in på index.php så får vi kanske följande om vi har matat in några länkar:’
Klickar vi nu på någon av våra korta länkar måste vi ju ta hand om händelsen. Så nu kollar vi på includes/loadUrl.php.
<?php
include ‘config.php’;
$lid = $_GET['lid'];
mysql_select_db($db_name, $link);
$sqlLink = "select * from links where l_id=’$lid’ limit 1";
$res = mysql_query($sqlLink, $link) or die(mysql_error());
$numRows = mysql_num_rows($res);
if($numRows == 1)
{
$row = mysql_fetch_array($res) or die(mysql_error());
extract($row);
header("location: $l_url");
}
else
{
echo "<h1>Din länk kunde tyvärr inte hittas</h1>";
}
?>
Smidigt och enkelt va? Så nu har vi hela vägen hur det går till. Hur man lägger till till hur man använder det. Så nu kan jag skicka korta länkar till mina vänner. (netonnet’s länkar är elaka i MSN då aldrig sista ) räknas in i länken)
Finns lite mer saker att ta hänsyn till i vanlig ordning. Men det är mer finlir över hur man ska skydda sin databas osv.
Bifogar filerna och sql-dump.
Man kan ju lätt utöka den här med en slumpa länk funktion t.ex. osv osv.
<?php
include "config.php";
mysql_select_db($db_name, $link);
$sqlRandom = "select l_id from links order by rand() limit 1";
$result = mysql_query($sqlRandom, $link) or die(mysql_error());
$row = mysql_fetch_array($result);
extract($row);
header("location: ../$l_id");
?>
Man kan ju även kolla om länken redan råkar finnas. Isåfall posta den gamla länken. Id behöver inte heller vara en int även om det är smidigt. Kan vara något helt annat.
PS. Någon dag ska jag skaffa ett liv istället för att skriva en guide till korta url:er en lördags-kväll DS.