Генерация короткой ссылки в PHP
 
			Данный скрипт укорачивает ссылки и записывает/считывает их в базу.
class ShortURLCreator
{
    protected static $chars = "123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
    
    // таблица БД в которую будем сохранять ссылки
    protected static $table = "short_urls";
    
    // проверка URL на наличие в базе
    protected static $checkUrlExists = true;
    // PDO объект
    protected $pdo;
    
    // время запуска скрипта
    protected $timestamp;
    // в конструктор передаем объект PDO
    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
        $this->timestamp = $_SERVER["REQUEST_TIME"];
    }
    // метод преобразующий URL в короткий код
    public function urlToShortCode($url) 
    {
        // если пусто
        if (empty($url)) {
            throw new Exception("Нет URL!!!");
        }
        
        // проверить формат URL
        if ($this->validateUrlFormat($url) == false) {
            throw new Exception(
                "Неправильный формат URL адреса!!!");
        }
    
        // если надо проверять URL на существование
        if (self::$checkUrlExists) {
            if (!$this->verifyUrlExists($url)) {
                throw new Exception(
                    "Такого URL в базе нет!!!");
            }
        }
        
        
        // генерируем ShortCode
        $shortCode = $this->urlExistsInDb($url);
        if ($shortCode == false) {
            $shortCode = $this->createShortCode($url);
        }
        return $shortCode;
    }
    // функция проверки URL на валидность
    protected function validateUrlFormat($url) {
        return filter_var($url, FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED);
    }
    // проверяем URL на существование в Интернете 
    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);
    }
    
    // вытаскиваем URL из таблицы
    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"];
    }
    // метод создает ShortCode
    protected function createShortCode($url) {
        $id = $this->insertUrlInDb($url);
        $shortCode = $this->convertIntToShortCode($id);
        $this->insertShortCodeInDb($id, $shortCode);
        return $shortCode;
    }
    
    
    // вставка в базу
    protected function insertUrlInDb($url) {
        $query = "INSERT INTO " . self::$table .
            " (long_url, date_created) " .
            " VALUES (:long_url, :timestamp)";
        $stmnt = $this->pdo->prepare($query);
        $params = array(
            "long_url" => $url,
            "timestamp" => $this->timestamp
        );
        $stmnt->execute($params);
        return $this->pdo->lastInsertId();
    }
    //
    protected function convertIntToShortCode($id) {
        $id = intval($id);
        if ($id < 1) {
            throw new Exception(
                "ID не является числом!!!");
        }
        $length = strlen(self::$chars);
        
        if ($length < 10) {
            throw new Exception("Длина последовательности слишком мала!");
        }
        $code = "";
        while ($id > $length - 1) {
            
            
            $code = self::$chars[fmod($id, $length)] . $code;
            
            $id = floor($id / $length);
        }
        
        $code = self::$chars[$id] . $code;
        return $code;
    }
    protected function insertShortCodeInDb($id, $code) {
        if ($id == null || $code == null) {
            throw new Exception("Input parameter(s) invalid.");
        }
        $query = "UPDATE " . self::$table .
            " SET short_code = :short_code WHERE id = :id";
        $stmnt = $this->pdo->prepare($query);
        $params = array(
            "short_code" => $code,
            "id" => $id
        );
        $stmnt->execute($params);
        if ($stmnt->rowCount() < 1) {
            throw new Exception(
                "Строка не была обновлена!!!");
        }
        return true;
    }
}
		- 
					Создано 25.02.2020 13:14:59  
- 
					 Михаил Русаков Михаил Русаков
 
			 
			 
		 
				 
			 
				 
				 
				 
				
Комментарии (1):
$code = self::$chars[ $id ] . $code можно заменить на $code = self::$chars[ $id - 1 ] . $code, чтобы первая короткая ссылка была /1/, а не /2/
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.