Greifen Sie einfach einmal auf die Datenbank zu, schnappen Sie sich alles auf einmal, das ist wahrscheinlich der größte Engpass.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Fügen Sie dann Ihre Ergebnisse in ein Array ein (sagen wir $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;
}
Wir verwenden den in_array()
prüft, ob der Slug my-slug
wäre das LIKE
würde auch Zeilen wie
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
etc was Probleme verursachen würde, der in_array()
Überprüfungen stellen sicher, dass wir nur gegen genau den eingegebenen Slug prüfen.
Warum zählen wir nicht einfach die Ergebnisse und +1?
Denn wenn Sie mehrere Ergebnisse hatten und einige gelöscht haben, könnte Ihr nächster Slug durchaus in Konflikt geraten.
Z. B.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Löschen Sie -3 und -5 und verlassen Sie uns mit
my-slug
my-slug-2
my-slug-4
Das gibt uns also 3 Ergebnisse, die nächste Einfügung wäre my-slug-4
die bereits existiert.
Warum verwenden wir nicht einfach ORDER BY
und LIMIT 1
?
Wir können nicht einfach eine order by
machen in der Abfrage, da eine natürliche Sortierung my-slug-10
ergeben würde Rang niedriger als my-slug-4
da es Zeichen für Zeichen und 4
vergleicht größer als 1
ist
Z. B.
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)