Il suffit d'accéder à la base de données une fois, de tout saisir en même temps, il y a de fortes chances que ce soit le plus gros goulot d'étranglement.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Ensuite, placez vos résultats dans un tableau (disons $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;
}
Nous utilisons le in_array()
vérifie comme si le slug était my-slug
le LIKE
renverrait également des lignes telles que
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
etc qui causerait des problèmes, le in_array()
les vérifications garantissent que nous ne vérifions que le slug exact qui a été saisi.
Pourquoi ne comptons-nous pas simplement les résultats et +1 ?
En effet, si vous aviez plusieurs résultats et en supprimiez quelques-uns, votre prochain slug pourrait bien entrer en conflit.
Par exemple
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Supprimer -3 et -5 nous laisse avec
my-slug
my-slug-2
my-slug-4
Donc, cela nous donne 3 résultats, le prochain insert serait my-slug-4
qui existe déjà.
Pourquoi n'utilisons-nous pas simplement ORDER BY
et LIMIT 1
?
Nous ne pouvons pas simplement faire un order by
dans la requête car le tri naturel ferait my-slug-10
rang inférieur à my-slug-4
car il compare caractère par caractère et 4
est supérieur à 1
Par exemple
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)