Slå bara till databasen en gång, ta allt på en gång, chansen är stor att det är den största flaskhalsen.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Lägg sedan dina resultat i en array (låt oss säga $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 använder in_array()
kontrollerar som om snigeln var my-slug
LIKE
skulle också returnera rader som
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
etc som skulle orsaka problem, in_array()
kontroller säkerställer att vi bara kontrollerar mot den exakta slug som angavs.
Varför räknar vi inte bara resultaten och +1:ar?
Detta beror på att om du hade flera resultat och raderade några, kan din nästa snigel komma i konflikt.
T.ex.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Ta bort -3 och -5 lämnar oss med
my-slug
my-slug-2
my-slug-4
Så det ger oss 3 resultat, nästa infogning skulle vara my-slug-4
som redan finns.
Varför använder vi inte bara ORDER BY
och LIMIT 1
?
Vi kan inte bara göra en order by
i frågan eftersom naturlig sortering skulle göra my-slug-10
rankas lägre än my-slug-4
eftersom den jämför tecken för tecken och 4
är högre än 1
T.ex.
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)