sql >> Database >  >> RDS >> Mysql

unieke slugs voor paginatitels maken php

Gewoon een keer de database raken, alles in één keer pakken, de kans is groot dat dat het grootste knelpunt is.

$query = "SELECT * FROM $table_name WHERE  $field_name  LIKE '".$slug."%'";

Zet dan je resultaten in een array (laten we zeggen $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;
}

We gebruiken de in_array() controleert alsof de slug my-slug . is de LIKE zou ook rijen retourneren zoals

my-slug-is-awesome
my-slug-is-awesome-1
my-slug-rules

enz. die problemen zouden veroorzaken, de in_array() controles zorgen ervoor dat we alleen controleren op de exacte slug die is ingevoerd.

Waarom tellen we niet gewoon de resultaten en +1?

Dit komt omdat als je meerdere resultaten had, en er een paar verwijderde, je volgende naaktslak zou kunnen conflicteren.

Bijv.

my-slug
my-slug-2
my-slug-3
my-slug-4
my-slug-5

Verwijder -3 en -5 laat ons achter met

my-slug
my-slug-2
my-slug-4

Dus dat geeft ons 3 resultaten, de volgende invoeging is my-slug-4 die al bestaat.

Waarom gebruiken we niet gewoon ORDER BY en LIMIT 1 ?

We kunnen niet zomaar een order by in de zoekopdracht omdat natuurlijke sortering my-slug-10 . zou maken rang lager dan my-slug-4 omdat het teken voor teken vergelijkt en 4 is hoger dan 1

Bijv.

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. hoe dubbele waarden in mysql-tabel te verwijderen

  2. PHP Caching - Is het sneller om op te slaan in een database of om een ​​bestand aan te maken?

  3. Laravel:hoe u een op maat gesorteerde welsprekende verzameling kunt krijgen met behulp van de whereIn-methode

  4. MYSQL vergelijken op join-probleem