how to make url shortener in php & MySQL?

how to make url shortener in php? Learn how to create a custom URL shortener in PHP. This custom URL shortener can can be created in a some times. free Source code download included!

how to make url shortener in php

Best PHP URL Shortener Scripts – Create the database table structure & Create Short URL using PHP URL Shortener. Also Read : Get The Full URL

Step 1 : Create Database Table

makes a short_urls table in the MySQL database
how to make url shortener in php with mysql Database.

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

URL Shortener Library

Shortener.class.php
how to make url shortener in php?

<?php
/** 
 * Class to create short URLs and decode shortened URLs
 *  how to make url shortener in php?
 * @author pakainfo.com <[email protected]> 
 * @copyright Copyright (c) 2017, pakainfo.com
 * @url https://www.pakainfo.com
 */ 
class Shortener
{
    protected static $chars = "abcdfghjkmnpqrstvwxyz|ABCDFGHJKLMNPQRSTVWXYZ|0123456789";
    protected static $table = "short_urls";
    protected static $checkUrlExists = false;
    protected static $codeLength = 7;

    protected $pdo;
    protected $timestamp;

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

    public function urlToshorterNum($url){
        if(empty($url)){
            throw new Exception("No URL was supplied.");
        }

        if($this->validateUrlFormat($url) == false){
            throw new Exception("URL does not have a valid format.");
        }

        if(self::$checkUrlExists){
            if (!$this->verifyUrlExists($url)){
                throw new Exception("URL does not appear to exist.");
            }
        }

        $shorterNum = $this->urlExistsInDB($url);
        if($shorterNum == false){
            $shorterNum = $this->createshorterNum($url);
        }

        return $shorterNum;
    }

    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 long_url = :long_url LIMIT 1";
        $stmt = $this->pdo->prepare($query);
        $params = array(
            "long_url" => $url
        );
        $stmt->execute($params);

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

    protected function createshorterNum($url){
        $shorterNum = $this->generateRandomString(self::$codeLength);
        $id = $this->insertUrlInDB($url, $shorterNum);
        return $shorterNum;
    }
    
    protected function generateRandomString($length = 6){
        $sets = explode('|', self::$chars);
        $all = '';
        $newStr = '';
        foreach($sets as $set){
            $newStr .= $set[array_rand(str_split($set))];
            $all .= $set;
        }
        $all = str_split($all);
        for($i = 0; $i < $length - count($sets); $i++){
            $newStr .= $all[array_rand($all)];
        }
        $newStr = str_shuffle($newStr);
        return $newStr;
    }

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

        return $this->pdo->lastInsertId();
    }
    
    public function shorterNumToUrl($code, $increment = true){
        if(empty($code)) {
            throw new Exception("No short code was supplied.");
        }

        if($this->validateshorterNum($code) == false){
            throw new Exception("Short code does not have a valid format.");
        }

        $urlRow = $this->getUrlFromDB($code);
        if(empty($urlRow)){
            throw new Exception("Short code does not appear to exist.");
        }

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

        return $urlRow["long_url"];
    }

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

    protected function getUrlFromDB($code){
        $query = "SELECT id, long_url 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);
    }
}

Database Configuration

conDb.php

<?php

$dbHost     = "localhost";
$dbUsername = "root";
$dbPassword = "root";
$dbName     = "pakainfo";

try{
    $db = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUsername, $dbPassword);
}catch(PDOException $e){
    echo "Connection failed: " . $e->getMessage();
}

Create Short URL with PHP

require_once 'conDb.php';

require_once 'Shortener.class.php';

$shortener = new Shortener($db);

$longURL = 'https://www.pakainfo.com/tutorials/php/';
 
$shortURL_Prefix = 'https://new-domain.com/'; // with URL rewrite
$shortURL_Prefix = 'https://new-domain.com/?c='; // without URL rewrite

try{
    $shorterNum = $shortener->urlToshorterNum($longURL);
    
    $shortURL = $shortURL_Prefix.$shorterNum;
    
    echo 'Short URL: '.$shortURL;
}catch(Exception $e){
    echo $e->getMessage();
}

Redirect to Long URL

require_once 'conDb.php';

require_once 'Shortener.class.php';

$shortener = new Shortener($db);

$shorterNum = $_GET["c"];

try{
    $url = $shortener->shorterNumToUrl($shorterNum);
    
    header("Location: ".$url);
    exit;
}catch(Exception $e){
    echo $e->getMessage();
}

URL Rewrite with HTACCESS

Create a .htaccess file and add the following code.

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

A simple URL shortener for PHP
how to make url shortener in php?
without using HTACCESS – https://domain-name.com/redirect.php?c=gzYN7BK
with using HTACCESS – https://domain-name.com/gzYN7BK

Also Read This πŸ‘‰   AngularJS Simple Change ng-view Directive

Example : https://infinityknow.com/php-laravel-get-current-url-example/