sql >> Base de Datos >  >> RDS >> Mysql

crear slugs de título de página únicos php

Simplemente ingrese a la base de datos una vez, tome todo a la vez, es probable que ese sea el mayor cuello de botella.

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

Luego coloque sus resultados en una matriz (digamos $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;
}

Usamos el in_array() comprueba como si el slug fuera my-slug el LIKE también devolvería filas como

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

etc., lo que causaría problemas, el in_array() las comprobaciones garantizan que solo estamos verificando el slug exacto que se ingresó.

¿Por qué no contamos los resultados y +1?

Esto se debe a que si obtuvo varios resultados y eliminó algunos, su próximo slug podría entrar en conflicto.

Por ejemplo

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

Eliminar -3 y -5 nos deja

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

Entonces, eso nos da 3 resultados, la siguiente inserción sería my-slug-4 que ya existe.

¿Por qué no usamos ORDER BY? y LIMIT 1 ?

No podemos simplemente hacer un order by en la consulta porque la clasificación natural haría my-slug-10 rango inferior a my-slug-4 ya que compara carácter por carácter y 4 es mayor que 1

Por ejemplo

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)