Mysql
 sql >> Base de données >  >> RDS >> Mysql

créer des slugs de titre de page uniques php

Il suffit d'accéder à la base de données une fois, de tout saisir en même temps, il y a de fortes chances que ce soit le plus gros goulot d'étranglement.

$query = "SELECT * FROM $table_name WHERE  $field_name  LIKE '".$slug."%'";

Ensuite, placez vos résultats dans un tableau (disons $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;
}

Nous utilisons le in_array() vérifie comme si le slug était my-slug le LIKE renverrait également des lignes telles que

my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules

etc qui causerait des problèmes, le in_array() les vérifications garantissent que nous ne vérifions que le slug exact qui a été saisi.

Pourquoi ne comptons-nous pas simplement les résultats et +1 ?

En effet, si vous aviez plusieurs résultats et en supprimiez quelques-uns, votre prochain slug pourrait bien entrer en conflit.

Par exemple

my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5

Supprimer -3 et -5 nous laisse avec

my-slug
my-slug-2
my-slug-4

Donc, cela nous donne 3 résultats, le prochain insert serait my-slug-4 qui existe déjà.

Pourquoi n'utilisons-nous pas simplement ORDER BY et LIMIT 1 ?

Nous ne pouvons pas simplement faire un order by dans la requête car le tri naturel ferait my-slug-10 rang inférieur à my-slug-4 car il compare caractère par caractère et 4 est supérieur à 1

Par exemple

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)