Bare ramt databasen én gang, tag alt på én gang, chancerne er, at det er den største flaskehals.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Læg derefter dine resultater i et array (lad os sige $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;
}
Vi bruger in_array()
kontrollerer, som om sneglen var my-slug
LIKE
ville også returnere rækker såsom
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
osv. som ville forårsage problemer, in_array()
kontroller sikrer, at vi kun kontrollerer mod den nøjagtige slug, der blev indtastet.
Hvorfor tæller vi ikke bare resultaterne og giver +1?
Dette skyldes, at hvis du havde flere resultater og slettede et par stykker, kunne din næste snegl godt komme i konflikt.
F.eks.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Slet -3 og -5 efterlader os med
my-slug
my-slug-2
my-slug-4
Så det giver os 3 resultater, den næste indsættelse ville være my-slug-4
som allerede eksisterer.
Hvorfor bruger vi ikke bare ORDER BY
og LIMIT 1
?
Vi kan ikke bare lave en order by
i forespørgslen, fordi naturlig sortering ville gøre my-slug-10
rangerer lavere end my-slug-4
da den sammenligner tegn for tegn og 4
er højere end 1
F.eks.
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)