Cukup tekan database sekali, ambil semuanya sekaligus, kemungkinan itulah hambatan terbesarnya.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Kemudian masukkan hasil Anda ke dalam array (misalkan $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;
}
Kami menggunakan in_array()
memeriksa seolah-olah siput itu my-slug
LIKE
juga akan mengembalikan baris seperti
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
dll yang akan menyebabkan masalah, in_array()
pemeriksaan memastikan bahwa kami hanya memeriksa slug persis yang dimasukkan.
Mengapa kita tidak menghitung saja hasilnya dan memberi +1?
Ini karena jika Anda memiliki beberapa hasil, dan menghapus beberapa, slug Anda berikutnya dapat bentrok.
Mis.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Hapus -3 dan -5 meninggalkan kita dengan
my-slug
my-slug-2
my-slug-4
Jadi, itu memberi kita 3 hasil, sisipan berikutnya adalah my-slug-4
yang sudah ada.
Mengapa kita tidak menggunakan ORDER BY
dan LIMIT 1
?
Kami tidak bisa hanya melakukan order by
dalam kueri karena penyortiran alami akan membuat my-slug-10
peringkat lebih rendah dari my-slug-4
karena membandingkan karakter demi karakter dan 4
lebih tinggi dari 1
Mis.
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)