बस एक बार डेटाबेस को हिट करें, एक ही बार में सब कुछ हड़प लें, संभावना है कि यह सबसे बड़ी अड़चन है।
$query = "SELECT * FROM $table_name WHERE $field_name LIKE '".$slug."%'";
फिर अपने परिणामों को एक सरणी में रखें (मान लें $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;
}
हम in_array()
. का उपयोग करते हैं जाँच करता है जैसे कि स्लग my-slug
. था LIKE
पंक्तियों को भी लौटाएगा जैसे
my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules
आदि जो समस्याएं पैदा करेंगे, in_array()
जाँच से यह सुनिश्चित होता है कि हम केवल वही दर्ज किए गए स्लग के विरुद्ध जाँच कर रहे हैं।
हम केवल परिणामों और +1 की गणना क्यों नहीं करते?
ऐसा इसलिए है क्योंकि यदि आपके कई परिणाम थे, और कुछ हटा दिए गए थे, तो आपका अगला स्लग विरोध कर सकता है।
उदा.
my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5
हटाएं -3 और -5 हमें छोड़ देता है
my-slug
my-slug-2
my-slug-4
तो, यह हमें 3 परिणाम देता है, अगला इंसर्ट होगा my-slug-4
जो पहले से मौजूद है।
क्यों न हम केवल ORDER BY
का उपयोग करें और LIMIT 1
?
हम केवल order by
. नहीं कर सकते क्वेरी में क्योंकि प्राकृतिक छँटाई my-slug-10
my-slug-4
. से नीचे रैंक क्योंकि यह चरित्र से चरित्र की तुलना करता है और 4
1
. से अधिक है
उदा.
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)