Mysql
 sql >> Database >  >> RDS >> Mysql

creazione di slug del titolo di pagina univoci php

Basta colpire il database una volta, prendere tutto in una volta, è probabile che sia il collo di bottiglia più grande.

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

Quindi inserisci i risultati in un array (diciamo $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;
}

Usiamo il in_array() controlla come se lo slug fosse my-slug il LIKE restituirebbe anche righe come

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

ecc che causerebbero problemi, il in_array() i controlli assicurano che stiamo solo verificando lo slug esatto che è stato inserito.

Perché non contiamo solo i risultati e +1?

Questo perché se avessi più risultati e ne eliminassi alcuni, il tuo prossimo slug potrebbe entrare in conflitto.

Es.

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

Elimina -3 e -5 ci lascia con

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

Quindi, questo ci dà 3 risultati, il prossimo inserto sarebbe my-slug-4 che esiste già.

Perché non utilizziamo semplicemente ORDER BY e LIMIT 1 ?

Non possiamo semplicemente fare un order by nella query perché l'ordinamento naturale renderebbe my-slug-10 rango inferiore a my-slug-4 poiché confronta carattere per carattere e 4 è maggiore di 1

Es.

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)