sql >> データベース >  >> RDS >> Mysql

ユニークなページタイトルスラッグphpを作成する

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

    $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)
    


    1. Postgisのインストール:タイプジオメトリは存在しません

    2. SQLServerのテーブルにJSONを挿入する方法

    3. 大規模なMySQLデータセットで部分的な単語を検索するための最良の方法

    4. Mysql2147483647でのVarcharの問題