Re: [php-brasil] [ auto_increment letras e numeros mysql ]

376 views
Skip to first unread message

Matheus Ferreira Machado

unread,
Oct 20, 2012, 7:12:47 AM10/20/12
to php-b...@googlegroups.com
Cara, pode ser que dê certo, busque o útlimo registro do banco (order id desc limit 1) pegue o campo e dê um autoincrement com PHP mesmo, acho que funciona. Uma vez atoa fiz um script que printava todas placas possiveis, com letras e números, o PHP deu o incrementou nas letras de boa.. $letras++;

Em 19 de outubro de 2012 22:50, Alisson Linneker <alisson...@gmail.com> escreveu:
Olá, boa noite!

Gostaria de saber como faço um auto_increment com letras e números.

Tome como exemplo o encurtador de URLs do Google (http://goo.gl) em que define o ID de cada url. Este ID possui 5 caracteres (letras maiúsculas, letras minúsculas e números).

Ao inserir um registro no banco de dados, ele define um ID único para este registro. O ID pode ser com 5 caracteres igual ao goo.gl.

Agradeço desde já.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "php-brasil" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/php-brasil/-/dTOW96_ukoMJ.
Para postar neste grupo, envie um e-mail para php-b...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para php-brasil+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/php-brasil?hl=pt-BR.



--
Abraços,
Matheus Ferreira Machado
about.me/matheusdev

Davi Oliveira

unread,
Oct 20, 2012, 12:20:40 PM10/20/12
to php-b...@googlegroups.com
Você pode manter o autoincrement normal do banco de dados e converter o valor da PK de base 10 para base 62


Davi Oliveira





2012/10/20 Matheus Ferreira Machado <matheusfe...@gmail.com>

Guilherme Medeiros

unread,
Oct 20, 2012, 10:24:13 AM10/20/12
to php-b...@googlegroups.com
Se você não estiver utilizando transactions, a dica do Matheus Machado pode ser desconsiderada.
EM um ambiente de concorrencia, fazer isso, uma leitura e depois um insert, sem usar transactions, pode ser que no meio do caminho outras inserções foram feitas, invalidando a informação que teu script detem.

A forma mais simples de trabalhar no caso do Alisson, é utilizar os inserts com auto_increment sem problemas.
Se estiver usando mysql, ao fazer um insert ele retorna o ID gerado. [mysql_insert_id()] [dá para recuperar com o pdo]

Ai vc pega esse ID, usa a função base_convert http://php.net/manual/en/function.base-convert.php
Pega esse valor retornado e salva no banco de dados em um campo chamado, por exemplo, id_encurtado (não esqueça de na definição da sua tabela transformar essa coluna em um índice para melhorar a performance das buscas).

Luigi Dariva Teixeira

unread,
Oct 23, 2012, 8:09:28 AM10/23/12
to php-b...@googlegroups.com
A dica do Guilherme Medeiros é ótima.
Você não precisa (e nem é bom) usar o uid como chave da sua tabela,
armazene ele em um campo separado.
Isso vai dar menos dor de cabeça no futuro.

Outra forma de gerar o uid:

$caracteres = str_split('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
1);
shuffle($caracteres);
$uid = implode($caracteres);

Aí você da um substr($uid, 0, $tamanho) para o $tamanho que quiser.

Porém você vai ter que ficar verificando as colisões. O ideal era
gerar a partir da chave auto_increment para não ter colisões.

2012/10/22 Alisson Linneker <alisson...@gmail.com>:
> Galera, penei mais consegui. Vejam como ficou a função:
>
> function uid($tc = false, $l = 11)
> {
> $s = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
> $uid = null;
> $loop = false;
> while(strlen($uid) < $l)
> $uid .= $s[mt_rand( 0, (strlen($s) - 1) )];
> if (preg_match('#([a-z0-9_-]+).([a-z0-9_-]+)#&', $tc, $tc)) {
> $loop = mysql_query("SELECT COUNT(*) FROM `$tc[1]` WHERE `$tc[2]` =
> '$uid' LIMIT 1") or die ("Erro ao verificar uid");
> $loop = mysql_fetch_array($loop);
> $loop = $loop[0];
> }
> while($loop);
> return $uid;
> }
>
> Explicando:
>
> Em $s você define os caracteres que podem ser usados na geração do código.
>
> Ele pegará o último ID de uma determinada tabela no banco de dados, e a
> partir dele se gera um "código" único. Este retorno pode ser definido em uma
> certa quantidade de caracteres.
>
> Exemplo de uso:
>
> uid('pessoas.p_id', 5);
>
> Retorna então um código de 5 caracteres de acordo com o último ID da tabela
> "pessoas".
>
> Caso não queira usar conexão com mysql, vc pode gerar um número único da
> seguinte forma:
>
> uid('null', 5);
>
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "php-brasil"
> dos Grupos do Google.
> Para ver esta discussão na web, acesse
> https://groups.google.com/d/msg/php-brasil/-/46j-Nqns9eEJ.
Reply all
Reply to author
Forward
0 new messages