Просто натиснете базата данни веднъж, вземете всичко наведнъж, има вероятност това да е най-голямата пречка.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
След това поставете резултатите си в масив (да кажем $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;
}
Използваме in_array()
проверява, сякаш охлювът е my-slug
LIKE
също така ще върне редове като
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
и т.н., което би причинило проблеми, in_array()
проверките гарантират, че проверяваме само точното въведено поле.
Защо просто не преброим резултатите и +1?
Това е така, защото ако сте имали няколко резултата и сте изтрили няколко, следващият ви гол би могъл да е в конфликт.
Напр.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Изтриването на -3 и -5 ни оставя с
my-slug
my-slug-2
my-slug-4
Така че, това ни дава 3 резултата, следващото вмъкване ще бъде my-slug-4
която вече съществува.
Защо просто не използваме ORDER BY
и LIMIT 1
?
Не можем просто да направим order by
в заявката, защото естественото сортиране би направило my-slug-10
ранг по-нисък от my-slug-4
тъй като сравнява символ по знак и 4
е по-високо от 1
Напр.
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)