Publicidade (Anuncie Aqui)

Criando índices textuais

Criando índices textuais

Sabe quando estamos vendo um vídeo no YouTube e olhamos o ID do vídeo no link e não vemos um ID numérico, mas vemos um id textual (feito com letras e números), mas ou menos assim: KGjTdt2AeGA?

Esse tipo de índice é muito mais amigável, pois quando temos muitos registros no banco de dados fica “feio” mostrar 18713543 na URL.

Existe uma função pronta (que encontrei aqui, criada pelo Kevin Zonneveld) e que usa técnicas de encriptação para fazer o trabalho de converter números em letras e vice-e-versa.

Código da função

Vamos ao código da função e depois eu explico como usá-la:

<?php
/**
* Traduz números para texto e vice-e-versa
*
* Traduz qualquer número (até 9007199254740992)
* para uma versão menor, usando letras:
* 9007199254740989 --> PpQXn7COf
*
* Especificando o segundo parâmetro como true temos:
* PpQXn7COf --> 9007199254740989
*
* @author    Kevin van Zonneveld <kevin@vanzonneveld.net>
* @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)
* @license   http://www.opensource.org/licenses/bsd-license.php New BSD Licence
* @version   SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
*
* @param mixed   $in     String or long input to translate
* @param boolean $to_num Reverses translation when true
* @param mixed   $pad_up Number or boolean padds the result up to a specified length
*
* @return mixed string or long
*/

function alphaID($in, $to_num = false, $pad_up = false) {
// Letras que serão usadas no índice textual
$index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$base  = strlen($index);

if ($to_num) {
// Tradução de texto para número
$in  = strrev($in);
$out = 0;
$len = strlen($in) - 1;
for ($t = 0; $t <= $len; $t++) {
$bcpow = bcpow($base, $len - $t);
$out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
}

if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$out -= pow($base, $pad_up);
}
}
} else {
// Tradução de número para texto
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$in += pow($base, $pad_up);
}
}

$out = "";
for ($t = floor(log10($in) / log10($base)); $t >= 0; $t--) {
$a   = floor($in / bcpow($base, $t));
$out = $out . substr($index, $a, 1);
$in  = $in - ($a * bcpow($base, $t));
}
$out = strrev($out);
}

return $out;
}
?>

Se você quiser, pode fazer o download do arquivo (.txt) com a função (com a indentação correta).

Usando a função

Para usar a função é bem simples, veja a conversão de número em texto:

<?php
echo alphaID(9007199254740989);
// Retorno: PpQXn7COf
?>

E se usarmos o texto como argumento, definindo o segundo parâmetro como true, teremos o ID novamente:

<?php
echo alphaID('PpQXn7COf', true);
// Retorno: 9007199254740989
?>

Essa função é bem legal pois além de deixar o sistema mais seguro (não é só mudar de 58 pra 57 na URL pra tentar acessar outro registro do banco) deixa o sistema mais profissional (não é todo mundo que mostra IDs textuais por aí). ;)

Espero que tenham gostado!

Não se esqueçam de assinar o RSS do Blog e/ou me seguirem no Twitter para ter acesso à todas as novidades em tempo real.

Você também vai gostar de ler:

Postado em MySQL, PHP, Tutoriais

Com as tags , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

  • Rafael
    nao tem perigo de ser passado um sql injection por isso? pois ai vc nao pode validar mais por inteiros, vai ter q passar como uma string.
  • Caso contrário: o que está na URL é uma string mas você continua trabalhando
    com inteiros em background.
  • no caso ele muda o id no banco tbm? ou so na apresentacao da url?

    obrigado desde ja
  • @Hugo
    Ele só converte um inteiro em texto... O resto é por sua conta.
  • gilmar
    Cara, tava procurando outra coisa, mais essa dica me chamou atenção!

    Ja vou alterar meu portal hoje mesmo..
    :D

    Valeu brother..
  • Joe
    Sim fiz, e tenho a funcionar em versão php 4.3, mas na versão que referi não funciona, os responsáveis da hospedamgem também não sabem porque.
  • Joe
    Viva!

    É necessário alguma extenção em especial pra isto funcionar?

    Testei em outro servidor e com php mais avançado 5.2.6 e não funciona.

    Cumprimentos
  • @Joe
    Não.. Ele funcionaria bem em qualquer servidor... Verifique se você está fazendo tudo certinho. :)
  • Joe
    Já estou a testar :) mas por enquanto não fica muito bonito, pois os id's só estão nos 3 dígitos :)
  • Viva!

    Muito bom este teu artigo, a minha pergunta é, não ficará o sistema mais lento?
  • @Joe
    Antes de perguntar, teste :P

    Ele não vai ficar mais lento pois é só mais uma "operação"... Pode ficar tranquilo. ;)
  • Adorei essa dica e o script, já adaptei meu site com ele. A única bronca que eu tenho é que o google vai indexar as urls 2 vezes, pois já indexou utilizando os ids numéricos que eu usava pra exibir :( Mas, mais pra frente vai ficar tudo certo!
  • Muito bom esse post, futuramente usarei esse codigo.
blog comments powered by Disqus