Gewoon een keer de database raken, alles in één keer pakken, de kans is groot dat dat het grootste knelpunt is.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Zet dan je resultaten in een array (laten we zeggen $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;
}
We gebruiken de in_array()
controleert alsof de slug my-slug
. is de LIKE
zou ook rijen retourneren zoals
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
enz. die problemen zouden veroorzaken, de in_array()
controles zorgen ervoor dat we alleen controleren op de exacte slug die is ingevoerd.
Waarom tellen we niet gewoon de resultaten en +1?
Dit komt omdat als je meerdere resultaten had, en er een paar verwijderde, je volgende naaktslak zou kunnen conflicteren.
Bijv.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Verwijder -3 en -5 laat ons achter met
my-slug
my-slug-2
my-slug-4
Dus dat geeft ons 3 resultaten, de volgende invoeging is my-slug-4
die al bestaat.
Waarom gebruiken we niet gewoon ORDER BY
en LIMIT 1
?
We kunnen niet zomaar een order by
in de zoekopdracht omdat natuurlijke sortering my-slug-10
. zou maken rang lager dan my-slug-4
omdat het teken voor teken vergelijkt en 4
is hoger dan 1
Bijv.
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)