Wystarczy raz trafić do bazy danych, pobrać wszystko na raz, są szanse, że to największe wąskie gardło.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Następnie umieść wyniki w tablicy (powiedzmy $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;
}
Używamy in_array()
sprawdza, czy ślimak był my-slug
LIKE
zwróci również wiersze, takie jak
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
itp., które powodowałyby problemy, in_array()
kontrole zapewniają, że sprawdzamy tylko dokładnie ten ślimak, który został wprowadzony.
Dlaczego po prostu nie policzymy wyników i nie dajemy +1?
Dzieje się tak dlatego, że jeśli uzyskałeś wiele wyników i usunąłeś kilka, następny ślimak mógłby spowodować konflikt.
Np.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Usunięcie -3 i -5 pozostawia nam
my-slug
my-slug-2
my-slug-4
To daje nam 3 wyniki, następną wstawką będzie my-slug-4
który już istnieje.
Dlaczego po prostu nie użyjemy ORDER BY
i LIMIT 1
?
Nie możemy po prostu złożyć order by
w zapytaniu, ponieważ naturalne sortowanie spowodowałoby, że my-slug-10
pozycja niższa niż my-slug-4
ponieważ porównuje znak po znaku i 4
jest wyższy niż 1
Np.
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)