Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen einzigartiger Seitentitel-Slugs php

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

zurückgeben
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)