Chỉ cần đánh cơ sở dữ liệu một lần, lấy mọi thứ cùng một lúc, rất có thể đó là nút thắt cổ chai lớn nhất.
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
Sau đó, đặt kết quả của bạn vào một mảng (giả sử $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;
}
Chúng tôi sử dụng in_array()
kiểm tra xem slug có phải là my-slug
không LIKE
cũng sẽ trả về các hàng chẳng hạn như
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
vv mà sẽ gây ra sự cố, in_array()
kiểm tra đảm bảo rằng chúng tôi chỉ đang kiểm tra chính xác slug đã được nhập.
Tại sao chúng ta không đếm kết quả và +1?
Điều này là do nếu bạn có nhiều kết quả và đã xóa một vài kết quả, thì slug tiếp theo của bạn cũng có thể xung đột.
Ví dụ:
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
Xóa -3 và -5 để lại cho chúng tôi
my-slug
my-slug-2
my-slug-4
Vì vậy, cho chúng ta 3 kết quả, lần chèn tiếp theo sẽ là my-slug-4
đã tồn tại.
Tại sao chúng ta không sử dụng ORDER BY
và LIMIT 1
?
Chúng tôi không thể chỉ thực hiện một order by
trong truy vấn vì sắp xếp tự nhiên sẽ tạo ra my-slug-10
xếp hạng thấp hơn my-slug-4
vì nó so sánh từng ký tự và 4
cao hơn 1
Ví dụ:
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)