Stačí jednou kliknout na databázi, chytit vše najednou, je pravděpodobné, že to je největší překážka.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Poté vložte výsledky do pole (řekněme $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;
}
Používáme in_array()
zkontroluje, jako by slimák byl my-slug
LIKE
vrátí také řádky jako
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
atd., což by způsobilo problémy, in_array()
kontroly zajišťují, že kontrolujeme pouze přesně ten slimák, který byl zadán.
Proč prostě nezapočítáme výsledky a +1?
Je to proto, že pokud jste měli více výsledků a několik smazali, váš další slimák by mohl být v konfliktu.
Např.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Smazat -3 a -5 nám ponechává
my-slug
my-slug-2
my-slug-4
To nám dává 3 výsledky, další vložení by bylo my-slug-4
který již existuje.
Proč prostě nepoužijeme ORDER BY
a LIMIT 1
?
Nemůžeme udělat jen order by
v dotazu, protože přirozené řazení by vytvořilo my-slug-10
hodnocení nižší než my-slug-4
protože porovnává znak po znaku a 4
je vyšší než 1
Např.
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)