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)