Membuat Shortener URL menggunakan PHP

1
Membuat Shortener URL menggunakan PHP

Short link selalu merupakan metode yang disarankan untuk berbagi tautan. Mudah diingat dan dapat dibagikan dengan mudah di web. Ada banyak layanan Shortener URL yang tersedia yang memungkinkanmu untuk mengkonversi URL panjang ke URL pendek. Tetapi kelemahan utama dari layanan ini adalah kamu tidak akan dapat menggunakan domainmu sendiri pada short link nya. Jika Anda ingin membuat Shortener URL dengan domainmu sendiri, kamu perlu membuat Shortener URL sendiri.

Layanan Shortener URL membutuhkan URL yang panjang dan mengompresnya dalam tautan/link pendek yang lebih mudah untuk dibagikan. kamu dapat membuat Short URL secara terprogram menggunakan PHP tanpa API Shortener URL pihak ketiga mana pun. Dalam tutorial ini, saya akan kasih tutorial cara membangun pustaka URL Shortener dan membuat URL Shortener menggunakan PHP dan MySQL. Dengan library PHP URL Shortener kamu dapat mempersingkat URL panjang dan menggunakan domainmu sendiri pada short link nya.

Dalam contoh skrip ini menunjukkan proses untuk membuat tautan yang bersih dan pendek yang dapat dibagikan dengan mudah melalui email atau media sosial. Database digunakan untuk menyimpan informasi tentang URL panjang dan pendek. Kamu juga dapat melacak jumlah klik yang diperoleh URL pendek oleh pengunjung.

Membuat Table Database

Kita akan menggunakan database untuk menangani pengalihan/redirect berdasarkan short code. SQL berikut ini membuat tabel tb_short_url di database MySQL untuk menyimpan info URL (url_asli, short_code, hits, dan waktu ditambahkan).

CREATE TABLE `tb_short_url` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `url_asli` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `short_code` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
 `hits` int(11) NOT NULL,
 `ditambahkan` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Library URL Shortener (Shortener.class.php)

Class Shortener URL memungkinkan untuk membuat URL pendek secara terprogram menggunakan PHP dan MySQL. Class ini menggunakan ekstensi PDO untuk bekerja dengan database MySQL, jadi, instance objek PDO diperlukan pada inisialisasi class Shortener.

Variabel statis:

  • $chars – Karakter yang dimasukkan dalam short code. (Grup karakter dipisahkan oleh |).
  • $table – Nama tabel database untuk menyimpan URL dan short code.
  • $checkUrlExists – Atur ke TRUE, untuk memeriksa apakah URL yang asli sudah ada.
  • $codeLength – Panjang karakter short code.

Fungsi:

  • __construct() – Mengatur referensi objek PDO dan timestamp.
  • urlToShortCode() – Memvalidasi URL dan membuat short code.
  • validateUrlFormat() – Memvalidasi format URL.
  • verifyUrlExists() – Memverifikasi URL apakah sudah ada atau belum menggunakan cURL di PHP.
  • urlExistsInDB() – Memeriksa apakah URL yang panjang sudah ada di database.
  • createShortCode() – Membuat short code untuk URL panjang dan memasukkan URL panjang & short code ke dalam database.
  • generateRandomString() – Menghasilkan string acak (short code) dengan karakter yang ditentukan dalam variabel $chars.
  • insertUrlInDB() – Memasukkan URL ke dalam database menggunakan Ekstensi PDO dan MySQL.
  • shortCodeToUrl() – Mengkonversi short code menjadi URL panjang dan memasukkan jumlah hit dalam database.
  • validateShortCode() – Memvalidasi short code berdasarkan karakter yang diperbolehkan.
  • getUrlFromDB() – Mengambil URL panjang dari database berdasarkan short code.
  • incrementCounter() – Menambahkan penghitung kunjungan URL di database.
<?php
class Shortener
{
    protected static $chars = "abcdfghjkmnpqrstvwxyz|ABCDFGHJKLMNPQRSTVWXYZ|0123456789";
    protected static $table = "tb_short_url";
    protected static $checkUrlExists = false;
    protected static $codeLength = 6;

    protected $pdo;
    protected $timestamp;

    public function __construct(PDO $pdo){
        $this->pdo = $pdo;
        $this->timestamp = date("Y-m-d H:i:s");
    }

    public function urlToShortCode($url){
        if(empty($url)){
            throw new Exception("Tidak ada URL yang diberikan.");
        }

        if($this->validateUrlFormat($url) == false){
            throw new Exception("URL tidak memiliki format yang valid.");
        }

        if(self::$checkUrlExists){
            if (!$this->verifyUrlExists($url)){
                throw new Exception("URL tidak ditemukan.");
            }
        }

        $shortCode = $this->urlExistsInDB($url);
        if($shortCode == false){
            $shortCode = $this->createShortCode($url);
        }

        return $shortCode;
    }

    protected function validateUrlFormat($url){
        return filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED);
    }

    protected function verifyUrlExists($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch,  CURLOPT_RETURNTRANSFER, true);
        curl_exec($ch);
        $response = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return (!empty($response) && $response != 404);
    }

    protected function urlExistsInDB($url){
        $query = "SELECT short_code FROM ".self::$table." WHERE url_asli = :url_asli LIMIT 1";
        $stmt = $this->pdo->prepare($query);
        $params = array(
            "url_asli" => $url
        );
        $stmt->execute($params);

        $result = $stmt->fetch();
        return (empty($result)) ? false : $result["short_code"];
    }

    protected function createShortCode($url){
        $shortCode = $this->generateRandomString(self::$codeLength);
        $id = $this->insertUrlInDB($url, $shortCode);
        return $shortCode;
    }

    protected function generateRandomString($length = 6){
        $sets = explode('|', self::$chars);
        $all = '';
        $randString = '';
        foreach($sets as $set){
            $randString .= $set[array_rand(str_split($set))];
            $all .= $set;
        }
        $all = str_split($all);
        for($i = 0; $i < $length - count($sets); $i++){
            $randString .= $all[array_rand($all)];
        }
        $randString = str_shuffle($randString);
        return $randString;
    }

    protected function insertUrlInDB($url, $code){
        $query = "INSERT INTO ".self::$table." (url_asli, short_code, ditambahkan) VALUES (:url_asli, :short_code, :timestamp)";
        $stmnt = $this->pdo->prepare($query);
        $params = array(
            "url_asli" => $url,
            "short_code" => $code,
            "timestamp" => $this->timestamp
        );
        $stmnt->execute($params);

        return $this->pdo->lastInsertId();
    }

    public function shortCodeToUrl($code, $increment = true){
        if(empty($code)) {
            throw new Exception("Tidak ada short code yang diberikan.");
        }

        if($this->validateShortCode($code) == false){
            throw new Exception("Short code tidak memiliki format yang valid.");
        }

        $urlRow = $this->getUrlFromDB($code);
        if(empty($urlRow)){
            throw new Exception("Short code tidak ditemukan.");
        }

        if($increment == true){
            $this->incrementCounter($urlRow["id"]);
        }

        return $urlRow["url_asli"];
    }

    protected function validateShortCode($code){
        $rawChars = str_replace('|', '', self::$chars);
        return preg_match("|[".$rawChars."]+|", $code);
    }

    protected function getUrlFromDB($code){
        $query = "SELECT id, url_asli FROM ".self::$table." WHERE short_code = :short_code LIMIT 1";
        $stmt = $this->pdo->prepare($query);
        $params=array(
            "short_code" => $code
        );
        $stmt->execute($params);

        $result = $stmt->fetch();
        return (empty($result)) ? false : $result;
    }

    protected function incrementCounter($id){
        $query = "UPDATE ".self::$table." SET hits = hits + 1 WHERE id = :id";
        $stmt = $this->pdo->prepare($query);
        $params = array(
            "id" => $id
        );
        $stmt->execute($params);
    }
}

Konfigurasi Database (dbConfig.php)

Dalam file dbConfig.php, PDO (PHP Data Objects) digunakan untuk menghubungkan dan memilih database. Tentukan host database ($hostDB), username ($usernameDB), password ($passwordDB), dan nama database ($namaDB) sesuai kredensial server database MySQL kamu.

<?php
$hostDB     = "localhost";
$usernameDB = "root";
$passwordDB = "";
$namaDB     = "codingandemo";

// membuat koneksi database
try{
    $db = new PDO("mysql:host=$hostDB;dbname=$namaDB", $usernameDB, $passwordDB);
}catch(PDOException $e){
    echo "Koneksi database gagal: " . $e->getMessage();
}

Membuat URL Shortener dengan PHP

Kode berikut ini membuat short code dan menghasilkan URL pendek dengan Class Shortener URL menggunakan PHP dan MySQL.

  1. Menginisialisasi class Shortener dan meneruskan ke PDO.
  2. Menentukan URL panjang yang ingin kamu konversi dalam URL pendek.
  3. Menentukan prefix URL pendek. Jika kamu ingin menggunakan RewriteEngine untuk menulis ulang URL, tentukan hanya URI dasar. Jika tidak, tentukan URI dasar dengan query-string (?c=).
  4. Memanggil fungsi urlToShortCode() untuk mendapatkan short code dari URL panjang.
  5. Membuat URL pendek dengan prefix URI dan short code.
// Menyertakan file konfigurasi database
require_once 'dbConfig.php';

// Menyertakan file library Shortener URL
require_once 'Shortener.class.php';

// Menginisialisasi class Shortener dan meneruskan ke PDO
$shortener = new Shortener($db);

// URL asli
$longURL = $_POST['longurl'];;

// Prefix dari short URL
$shortURL_Prefix = 'http://localhost/shorten/s/'; // dengan URL rewrite
//$shortURL_Prefix = 'http://localhost/shorten/s/?c='; // tanpa URL rewrite

try{
    // Mendapatkan URL dengan short code
    $shortCode = $shortener->urlToShortCode($longURL);

    // Membuat short URL
    $shortURL = $shortURL_Prefix.$shortCode;

    // Menampilkan short URL
    echo 'Short URL: '.$shortURL;
}catch(Exception $e){
    // Menampilkan error
    echo $e->getMessage();
}

Mengalihkan ke URL asli

Kode berikut ini menangani pengalihan dari URL pendek ke URL asli.

// Menyertakan file konfigurasi database
require_once '../dbConfig.php';

// Menyertakan file library Shortener URL
require_once '../Shortener.class.php';

// Menginisialisasi class Shortener dan meneruskan ke PDO
$shortener = new Shortener($db);

// Mengambil short code URL
$shortCode = $_GET["c"];

try{
    // Mendapatkan URL dengan short code
    $url = $shortener->shortCodeToUrl($shortCode);

    // Mengalihkan ke URL asli
    header("Location: ".$url);
    exit;
}catch(Exception $e){
    // Menampilkan error
    echo $e->getMessage();
}

Rewrite URL dengan .htaccess

Jika kamu ingin membuat URL tanpa query-string, gunakan HTACCESS dengan RewriteEngine. Buat file .htaccess dan tambahkan kode berikut. Pastikan module mod_rewrite sudah aktif dalam server kamu.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)/?$ index.php/s/?c=$1 [L] 
</IfModule>

 

BAGIKAN

1
Leave a Reply

avatar
400
1 Comment threads
0 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Dubnasoft Recent comment authors
  Subscribe  
terbaru terlama vote teratas
Beritahu
Dubnasoft
Tamu

Biar sebelum menuju link asli bisa landing di page tertentu dulu dan klik button menuju link gmna ya master???
Terimakasih