データベースに一度アクセスするだけで、すべてを一度に取得できます。これが最大のボトルネックになる可能性があります。
$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)