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)