Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

criando slugs de título de página exclusivos php


Basta acessar o banco de dados uma vez, pegar tudo de uma vez, provavelmente esse é o maior gargalo.
$query = "SELECT * FROM $table_name WHERE  $field_name  LIKE '".$slug."%'";

Em seguida, coloque seus resultados em um array (digamos $slugs )
//we only bother doing this if there is a conflicting slug already
if(mysqli_num_rows($result) !== 0 && in_array($slug, $slugs)){
    $max = 0;

    //keep incrementing $max until a space is found
    while(in_array( ($slug . '-' . ++$max ), $slugs) );

    //update $slug with the appendage
    $slug .= '-' . $max;
}

Usamos o in_array() verifica como se o slug fosse my-slug o LIKE também retornaria linhas como
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules

etc que causaria problemas, o in_array() verificações garantem que estamos apenas verificando o slug exato que foi inserido.

Por que não contamos apenas os resultados e marcamos +1?


Isso ocorre porque se você tivesse vários resultados e excluísse alguns, seu próximo slug poderia entrar em conflito.

Por exemplo.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5

Excluir -3 e -5 nos deixa com
my-slug
my-slug-2
my-slug-4

Então, isso nos dá 3 resultados, a próxima inserção seria my-slug-4 que já existe.

Por que não usamos apenas ORDER BY e LIMIT 1 ?


Não podemos simplesmente fazer um order by na consulta porque a classificação natural faria my-slug-10 classificação inferior a my-slug-4 pois compara caractere por caractere e 4 é maior que 1

Por exemplo.
m = m
y = y
- = -
s = s
l = l
u = u
g = g
- = -
4 > 1 !!!
  < 0 (But the previous number was higher, so from here onwards is not compared)