Wiz-Khalifa Wiz-Khalifa  • 31.05.16 22:27

Como criar um encurtador de URL como o tinyurl.com, bit.ly e Bobba.me utilizando PHP e MySQL? Empty Como criar um encurtador de URL como o tinyurl.com, bit.ly e Bobba.me utilizando PHP e MySQL? 31.05.16 22:27

Você já deve conhecer esses serviços que oferecem o encurtamento da URL, onde podemos pegar uma URL longa e encurta-la. Muito utilizado para links enviados pelo Twitter, MSN, email, fóruns, etc. Existem muitos sites que oferecem este tipo de serviço gratuitamente, como por exemplo o tinyURL.combit.lyBobba.me entre outros.
Já pensou como seria interessante ter o seu próprio serviço de encurtamento de URL?Saiba que depois deste tutorial você poderá criar o seu com apenas 3 arquivos: index.php, condb.php e o .htaccess.
index.php -> Quase toda mágica ocorre aqui
condb.php -> Arquivo para conexão com o banco de dados
.htaccess -> Arquivo que nos ajudará a tratar o envio do parâmetro na URL

Trabalharemos nesse tutorial com banco de dados MySQL (eu usarei o gerenciador phpMyadmin)PHP com a extensãomod_rewrite habilitada (a maioria dos servidores de hospedagem hoje em dia já tem essa extensão habilitada).
Tendo isso em mãos, vamos primeiramente 'preparar o terreno' criando a tabela no banco de dados que irá armazenar as informações da URL original e a 'chave' que representará a URL original de forma curta.
Logo abaixo está o código SQL para criar a tabela:

Código:
CREATE tab[b][/b]le `urlcurta` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `chave` VARCHAR(32) DEFAULT NULL,
  `url` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `chave` (`chave`)
);


Se você usa o phpMyadmin, copie e cole esse código acima na caixa de texto SQL de seu banco de dados.
Esse código acima criará uma tabela chamada 'urlcurta' (você pode chamar da forma que quiser), com 3 campos: id, chave e url.
id -> Automaticamente será criado um id que se auto incrementa a cada registro.
chave -> Campo que armazenara a string curta que representará o parâmetro que será usado para o redirecionamento para URL original.
url -> Campo que armazenara a URL original.
Agora vamos começar a trabalhar com PHP, onde primeiro iremos definir a conexão com o banco de dados:
Crie um arquivo PHP e salve como condb.php no mesmo diretório que estará os arquivos desse sistema que estamos desenvolvendo. No meu caso eu criei um diretório chamado '/url_curta' para testar o sistema desse tutorial.
Observação: Podemos usar qualquer diretório em nosso servidor para testar, mas o ideal para quem quiser oferecer esse serviço, seria registrar um domínio bem curto e oferecer a opção na raíz do domínio.

O conteúdo do condb.php será o seguinte:

Código:
<?php
 
define('BD_USER', 'teu-usuario'); // substitua pelo seu usuário do bd
define('BD_PASS', 'tua-senha'); // substitua pela tua senha do bd
define('BD_NAME', 'teu-banco-de-dados'); // substitua pelo nome do teu bd
 
/*
 
  Geralmente o hostname utilizado logo abaixo é 'localhost', se seu caso for
  diferente, substitua 'localhost' pelo hostname de seu servidor.
  Se for preciso entre em contato com o suporte de sua hospedagem.
 
*/
 
$conn = mysql_connect('localhost', BD_USER, BD_PASS);
mysql_select_db(BD_NAME, $conn);
 
?>


Agora crie outro arquivo PHP e salve no mesmo diretório com o nome 'index' e nele vamos criar os códigos que farão toda a mágica.
Quase no final deste tutorial eu mostro o código completo, e bem comentado com todos os detalhes explicados, mas mesmo assim vou desmembrar parte por parte e explicar individualmente.
Primeiramente vamos fazer a parte que redireciona para a URL original quando alguém acessar a URL curta. Tudo que precisamos fazer é encontrar a URL original registrada no banco de dados que corresponda ao parâmetro enviado na URL curta, no caso a 'string' que será comparada com o valor do campo 'chave' do banco de dados e assim montar o cabeçalho de redirecionamento 301 permanente, mas somente após um leve tratamento para que o processo tenha um pouco de segurança.

Veja o código:

Código:
<?php
 
include 'condb.php'; // Nosso arquivo de conexão
 
/* Primeiro verificamos se foi solicitado o redirecionamento de alguma URL */
if (isset($_GET['k']))
{
 
    $k = mysql_real_escape_string($_GET['k'],$conn); // Pegamos o parâmetro enviado na url e damos uma tratada
 
    $sURL = "SELECT url FROM urlcurta WHERE chave = '" . $k . "'";
    $qURL = mysql_query($sURL) or die(mysql_error()); // Consulta no BD se tem essa string (chave) registrada
 
    if (mysql_num_rows($qURL) > 0)
    {
 
        /*
        Se existir o registro da string (chave) enviada no parâmetro,
        redirecionamos para URL longa correspondente, que esta
        registrada no banco de dados.
        */
 
        $rURL = mysql_fetch_assoc($qURL);
        header('HTTP/1.1 301 Moved Permanently');
        header('Location: ' . $rURL['url']);
        exit;
 
    }
 


Continuando, vamos criar agora a parte que pega os dados enviados do formulário e o fomulário propriamente dito, que será nossa interface de inserção das URL originais para posteriormente serem encurtadas.
Primeiro verificamos se alguma informação foi enviada pelo formulário, e se nada foi enviado, então exibimos o formulário.

Veja como faremos isso logo abaixo:

Código:
/* Agora vamos entrar no que diz respeito a criação da URL Curta */
 
/* Caracteres permitidos na string que será gerada para substituir a URL longa */
define('PERMITIDOS','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
 
/* Nosso caminho base. Substitua pelo seu caminho */
define('BASE_HREF', 'http://' . $_SERVER['HTTP_HOST'] . '/url_curta/');
 
/*
Se nenhum link foi solicitado o redirecionamento o código acima não é
executado e o arquivo tenta executar o código abaixo:
*/
 
// Se o formulário para criar a url curta foi submetido
if (isset($_POST['submit']) && isset($_POST['url']))
{
 
    // Pequeno filtro auqe ajuda na verificação da URL original
    if (filter_var($_POST['url'], FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED) !== false)
    {
 
        $url = trim($_POST['url']);
 
        // Verifica se a url enviada no form já tem uma string curta (chave) registrada para ela
        $sKey = "SELECT chave FROM urlcurta WHERE url = '" . $url . "'";
        $qKey = mysql_query($sKey) or die(mysql_error());
 
        if (mysql_num_rows($qKey) > 0)
        {
 
            /*
            Se já tem registro de uma 'chave' para essa URL ele apenas define o valor para uma
            variável e assim poderemos indicar ao usuário a URL com a respectiva 'chave' já existente
            */
 
            $rKey = mysql_fetch_assoc($qKey);
            $key = $rKey['chave'];
 
        }
        else{
 
            /*
            Se a 'chave' ainda não existe para essa URL então vamos usar essa função abaixo para
            criar uma string curta (chave) para essa URL e registrar no banco de dados
            */
 
            function encurtar_pelo_id($inteiro, $base = PERMITIDOS)
            {
 
                $tam = strlen($base);
 
                while($inteiro > $tam - 1)
                {
 
                    $saida  = $base[fmod($inteiro, $tam)] . $saida;
                    $inteiro = floor( $inteiro / $tam );
 
                }
 
                return $base[$inteiro] . $saida;
 
            }
 
            /* Explicando um pouco essa função, mas só um pouco pra não complicar :)
 
                1-  function encurtar_pelo_id($id, $base = PERMITIDOS)
                    {
 
                    Essa primeira linha nos mostra o que a função pega para processar, no caso do $inteiro,
                    passaremos por ali o valor id de registro no banco de dados referente ao cadastro da nossa URL .
                    $base já iremos passar predefinidamente nossa string de caracteres permitidos que definimos
                    na constante PERMITIDOS mais lá no início dos códigos.
 
                2-  $tam = strlen($base);
 
                    Isso nos da a quantidade de caracteres compreendem a string de PERMITIDOS
                    Se você for imprimir o valor da variável $tam, verá que o valor é 62,
                    pois compreende todos os números de 0-9 e todas as letras a-zA-Z
 
                3-  while($inteiro > $tam - 1)
                    {
 
                        $saida  = $base[fmod($inteiro, $tam)] . $saida;
                        $inteiro = floor($inteiro / $tam);
 
                    }
 
                    Esse loop while() só vai entrar em ação quando tivermos mais de 62 URLs cadastradas
                    Pois servirá para fazer combinações entre os caracteres da string de PERMITIDOS
 
                4-  return $base[$inteiro] . $saida;
 
                    Nossa saída de string, onde caso tenha entrado no while irá gerar uma combinação entre
                    um caractere de PERMITIDOS com o valor da variável $saida gerado no while.
                    Caso não entre no while ele irá gerar um valor respectivo ao id de registro.
 
                    Exemplo: Se o id de registro for 8, provavelmente a string(chave) dessa URL será '8',
                    se for 10, a string (chave) dessa URL será 'a' e assim por diante até utilizar de forma unitária
                    todas as 62 instâncias de PERMITIDOS, entre números, minúsculas e maiúsculas.
                    A partir daí entra-se no while e começa as combinações.
 
                    Fiz uns testes e se tivermos 13 bilhões de registros únicos de URL no banco de dados teremos chegado
                    à uma string (chave) de apenas 7 caracteres :) legal neh?
 
            */
 
            /*
            Bom vamos dar continuidade e ver aonde e quando iremos usar essa função,
            o que importa que já esta pronta para uso.
            */
 
            // Agora vai começar a mágica, onde primeiro inserimos no banco de dados a URL Longa (original)
            $iURL = "INSERT INTO urlcurta (url) VALUES ('" . $url . "')";
            $qURL = mysql_query($iURL) or die(mysql_error());
 
            /*
            Com a inserção acima, é gerado um ID automático para o registro, pois o campo no banco de dados é 'auto_increment', ou seja,
            a cada registro esse registro recebe uma identificação única e na linha abaixo estamos atribuindo esse valor único à variável $id
            */
 
            $id = mysql_insert_id();
 
            // Agora vamos usar a nossa função passando o valor do $id na chamada
            $key = encurtar_pelo_id($id);
 
            // Já registramos a URL original, agora vamos atualizar a tabela e registrar a string (chave)
            $uKey = "UPDATE urlcurta SET chave = '" . $key . "' WHERE id = " . $id . "";
            $qUKey = mysql_query($uKey) or die(mysql_error());
 
        }
 
        // Feito e agora exibimos o link da url curta que ao ser clicado irá redirecionar para a URL longa (original)
        echo '<a href="' . BASE_HREF . $key . '" target="_blank">' . BASE_HREF . $key . '</a>';
 
    }
 
}
else{
 
/*
Caso o formulário não tenha sido submetido, nem uma URL solicitada ao redirecionamento,
então mostramos o formulário para submeter e encurtar a URL.
*/
 
?>
 
<form method="post" action="">
 
    <label>URL: <input type="text" name="url" id="url" /></label>
    <input type="submit" name="submit" id="submit" value="Encurtar" />
 
</form>
 
<?php
 
}
 
?>

Não preciso nem explicar o código acima, pois está muito bem comentado, mas para não ficar dúvidas, lembrando o que eu já mencionei antes, esse código primeiramente verifica se o formulário e a url foram submetidos e se não foram ele mostra o formulário.
O formulário só precisa do campo, que chamaremos de  'url' e o botão de envio. O parâmetro 'action' do formulário deve apontar para o próprio script, eu costumo deixar em branco nesses casos.
Para validar e tratar a URL usamos as funções filter_var() e mysql_real_escape_string() como uma forma rápida de manter o script um pouco mais seguro, desta forma também validando a URL.
Para criar a string que representará a 'key' da URL curta, usamos o próprio valor do id do registro e geramos a string única com a função encurtando_pelo_id(). Usando o valor do id do registro, garantimos que não haverá valores duplicados.
Veja abaixo o código completo com bastante atenção, pois os comentários que fiz nele estão bem explicados, nos mínimos detalhes e pode tirar todas as tuas dúvidas e de forma bem simplificada.
O código completo do arquivo index.php ficaria algo como isso:

Código:
<?php
 
include 'condb.php'; // Nosso arquivo de conexão
 
/* Primeiro verificamos se foi solicitado o redirecionamento de alguma URL */
if (isset($_GET['k']))
{
 
    $k = mysql_real_escape_string($_GET['k'],$conn); // Pegamos o parâmetro enviado na url e damos uma tratada
 
    $sURL = "SELECT url FROM urlcurta WHERE chave = '" . $k . "'";
    $qURL = mysql_query($sURL) or die(mysql_error()); // Consulta no BD se tem essa string (chave) registrada
 
    if (mysql_num_rows($qURL) > 0)
    {
 
        /*
        Se existir o registro da string (chave) enviada no parâmetro,
        redirecionamos para URL longa correspondente, que esta
        registrada no banco de dados.
        */
 
        $rURL = mysql_fetch_assoc($qURL);
        header('HTTP/1.1 301 Moved Permanently');
        header('Location: ' . $rURL['url']);
        exit;
 
    }
 
}
 
/* Agora vamos entrar no que diz respeito a criação da URL Curta */
 
/* Caracteres permitidos na string que será gerada para substituir a URL longa */
define('PERMITIDOS','0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
 
/* Nosso caminho base. Substitua pelo seu caminho */
define('BASE_HREF', 'http://' . $_SERVER['HTTP_HOST'] . '/url_curta/');
 
/*
Se nenhum link foi solicitado o redirecionamento o código acima não é
executado e o arquivo tenta executar o código abaixo:
*/
 
// Se o formulário para criar a url curta foi submetido
if (isset($_POST['submit']) && isset($_POST['url']))
{
 
    // Pequeno filtro auqe ajuda na verificação da URL original
    if (filter_var($_POST['url'], FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED) !== false)
    {
 
        $url = trim($_POST['url']);
 
        // Verifica se a url enviada no form já tem uma string curta (chave) registrada para ela
        $sKey = "SELECT chave FROM urlcurta WHERE url = '" . $url . "'";
        $qKey = mysql_query($sKey) or die(mysql_error());
 
        if (mysql_num_rows($qKey) > 0)
        {
 
            /*
            Se já tem registro de uma 'chave' para essa URL ele apenas define o valor para uma
            variável e assim poderemos indicar ao usuário a URL com a respectiva 'chave' já existente
            */
 
            $rKey = mysql_fetch_assoc($qKey);
            $key = $rKey['chave'];
 
        }
        else{
 
            /*
            Se a 'chave' ainda não existe para essa URL então vamos usar essa função abaixo para
            criar uma string curta (chave) para essa URL e registrar no banco de dados
            */
 
            function encurtar_pelo_id($inteiro, $base = PERMITIDOS)
            {
 
                $tam = strlen($base);
 
                while($inteiro > $tam - 1)
                {
 
                    $saida  = $base[fmod($inteiro, $tam)] . $saida;
                    $inteiro = floor( $inteiro / $tam );
 
                }
 
                return $base[$inteiro] . $saida;
 
            }
 
            /* Explicando um pouco essa função, mas só um pouco pra não complicar :)
 
                1-  function encurtar_pelo_id($id, $base = PERMITIDOS)
                    {
 
                    Essa primeira linha nos mostra o que a função pega para processar, no caso do $inteiro,
                    passaremos por ali o valor id de registro no banco de dados referente ao cadastro da nossa URL .
                    $base já iremos passar predefinidamente nossa string de caracteres permitidos que definimos
                    na constante PERMITIDOS mais lá no início dos códigos.
 
                2-  $tam = strlen($base);
 
                    Isso nos da a quantidade de caracteres compreendem a string de PERMITIDOS
                    Se você for imprimir o valor da variável $tam, verá que o valor é 62,
                    pois compreende todos os números de 0-9 e todas as letras a-zA-Z
 
                3-  while($inteiro > $tam - 1)
                    {
 
                        $saida  = $base[fmod($inteiro, $tam)] . $saida;
                        $inteiro = floor($inteiro / $tam);
 
                    }
 
                    Esse loop while() só vai entrar em ação quando tivermos mais de 62 URLs cadastradas
                    Pois servirá para fazer combinações entre os caracteres da string de PERMITIDOS
 
                4-  return $base[$inteiro] . $saida;
 
                    Nossa saída de string, onde caso tenha entrado no while irá gerar uma combinação entre
                    um caractere de PERMITIDOS com o valor da variável $saida gerado no while.
                    Caso não entre no while ele irá gerar um valor respectivo ao id de registro.
 
                    Exemplo: Se o id de registro for 8, provavelmente a string(chave) dessa URL será '8',
                    se for 10, a string (chave) dessa URL será 'a' e assim por diante até utilizar de forma unitária
                    todas as 62 instâncias de PERMITIDOS, entre números, minúsculas e maiúsculas.
                    A partir daí entra-se no while e começa as combinações.
 
                    Fiz uns testes e se tivermos 13 bilhões de registros únicos de URL no banco de dados teremos chegado
                    à uma string (chave) de apenas 7 caracteres :) legal neh?
 
            */
 
            /*
            Bom vamos dar continuidade e ver aonde e quando iremos usar essa função,
            o que importa que já esta pronta para uso.
            */
 
            // Agora vai começar a mágica, onde primeiro inserimos no banco de dados a URL Longa (original)
            $iURL = "INSERT INTO urlcurta (url) VALUES ('" . $url . "')";
            $qURL = mysql_query($iURL) or die(mysql_error());
 
            /*
            Com a inserção acima, é gerado um ID automático para o registro, pois o campo no banco de dados é 'auto_increment', ou seja,
            a cada registro esse registro recebe uma identificação única e na linha abaixo estamos atribuindo esse valor único à variável $id
            */
 
            $id = mysql_insert_id();
 
            // Agora vamos usar a nossa função passando o valor do $id na chamada
            $key = encurtar_pelo_id($id);
 
            // Já registramos a URL original, agora vamos atualizar a tabela e registrar a string (chave)
            $uKey = "UPDATE urlcurta SET chave = '" . $key . "' WHERE id = " . $id . "";
            $qUKey = mysql_query($uKey) or die(mysql_error());
 
        }
 
        // Feito e agora exibimos o link da url curta que ao ser clicado irá redirecionar para a URL longa (original)
        echo '<a href="' . BASE_HREF . $key . '" target="_blank">' . BASE_HREF . $key . '</a>';
 
    }
 
}
else{
 
/*
Caso o formulário não tenha sido submetido, nem uma URL solicitada ao redirecionamento,
então mostramos o formulário para submeter e encurtar a URL.
*/
 
?>
 
<form method="post" action="">
 
    <label>URL: <input type="text" name="url" id="url" /></label>
    <input type="submit" name="submit" id="submit" value="Encurtar" />
 
</form>
 
<?php
 
}
 
?>



Claro que você pode implementar a parte visual de forma mais elaborada, utilizar CSS, jQueryAjax, entre outros recursos, a intenção aqui é de apenas passar o básico.
Da forma que está não irá funcionar se não tivermos o arquivo .htaccess preparado para dar uma tratada na URL .
Exemplo:
Da forma que está o código acima só iremos conseguir passar o parâmetro referente a 'chave' da URL se for desta forma:
www.dominio.com/url_curta/index.php?k=chave
Mas o que queremos é passar da seguinte forma:
www.dominio.com/url_curta/chave
Para isso que serve o .htaccess nessa hora.
Acompanhe abaixo a explicação e montagem do nosso .htaccess.
Usaremos ma extensão do PHP mod_rewrite para manipular a URL mais um pouco para chegarmos no ponto que queremos. Se o seu servidor não der suporte a mod_rewrite, mude de servidor, mas se ele suporta, parabéns pra ele, ele tem então pelo menos o mínimo aceitável para quem trabalha com PHP nos dias de hoje. Coloque o código abaixo em um arquivo chamado .htaccess, dentro do mesmo diretório que estará os arquivos do sistema que estamos criando.

Observação: Se não existe o arquivo .htaccess no seu diretório, abra o bloco de notas cole o código que será mostrado mais abaixo e de o nome como .htaccess, mas não se esqueça de escolher que tipo de arquivo deseja salvar, (escolha a opção 'Todos os arquivos'), salve e suba ele para o mesmo diretório dos scripts.
?

[table style="width: 713px; border: 0px !important; outline: 0px !important; vertical-align: baseline !important; border-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; font-size: 1em !important; min-height: auto !important; background: none !important;" border="0" cellpadding="0" cellspacing="0"][tr style="border: 0px !important; outline: 0px !important; vertical-align: baseline !important; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: auto !important; background: none !important;"][td class="gutter" style="border: 0px !important; outline: 0px !important; vertical-align: baseline !important; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; width: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: auto !important; color: rgb(175, 175, 175) !important; background: none !important;"]
1
2
[/td]
[td class="code" style="width: 687px; border: 0px !important; outline: 0px !important; vertical-align: baseline !important; margin: 0px !important; padding: 0px !important; border-radius: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.1em !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; box-sizing: content-box !important; font-size: 1em !important; min-height: auto !important; background: none !important;"]
Código:
RewriteEngine On
Código:
RewriteRule ^([0-9a-zA-Z]{1,7})$ index.php?k=$1 [L]
[/td]
[/tr]
[/table]

Entenda um pouco essa regra acima:
Dizmeos por essa regra que k=$1 pode ser qualquer número ou letra, maiúscula ou minúscula e que pode ter de 1 à 7 instâncias para ser válida
Exemplo: 'a' ou 'ab' ou 'abc' ou '1b3cr', etc, mas no máximo 7.
Nota: Podemos chegar a uma string (chave)  de 8 caracteres, mas só quando tiver muitos e muitos bilhões de URLs cadastradas, e se for chegar a essa proporção, saberemos e bastará mudar para {1,8} ali na regra. Fácil neh?  :)
Pronto agora você está apto(a) à ter seu próprio site de encurtamento de URL, espero que tenha sido um bom começo para você.
Nota: Entenda que esse sistema é o básico e implementações de maior segurança devem ser aplicadas, principalmente contra spam.
Gostaria de agradecer ao do ultramegatech.com, briancray.com que serviram de referência para inspiração e à um amigo muito considerado, Muller Dias, que trocou umas ideias valiosas enquanto eu desenvolvia esse tutorial.

Qualquer dúvida faça um comentário e eu tento ajudar.
Bons estudos!

Via : SistemaBasico
Permissões neste sub-fórum
Não podes responder a tópicos

BH Servers

Recomendamos a BH Servers com proteção DDOS gratuita em Cloud Server de alta performance. Entrega imediata.