sql >> Database teknologi >  >> RDS >> Mysql

skabe unikke sidetitel slugs php

Bare ramt databasen én gang, tag alt på én gang, chancerne er, at det er den største flaskehals.

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

Læg derefter dine resultater i et array (lad os sige $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;
}

Vi bruger in_array() kontrollerer, som om sneglen var my-slug LIKE ville også returnere rækker såsom

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

osv. som ville forårsage problemer, in_array() kontroller sikrer, at vi kun kontrollerer mod den nøjagtige slug, der blev indtastet.

Hvorfor tæller vi ikke bare resultaterne og giver +1?

Dette skyldes, at hvis du havde flere resultater og slettede et par stykker, kunne din næste snegl godt komme i konflikt.

F.eks.

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

Slet -3 og -5 efterlader os med

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

Så det giver os 3 resultater, den næste indsættelse ville være my-slug-4 som allerede eksisterer.

Hvorfor bruger vi ikke bare ORDER BY og LIMIT 1 ?

Vi kan ikke bare lave en order by i forespørgslen, fordi naturlig sortering ville gøre my-slug-10 rangerer lavere end my-slug-4 da den sammenligner tegn for tegn og 4 er højere end 1

F.eks.

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. SQLSTATE[HY000] [1045] undtagelse under forbindelse til database ved hjælp af 000webhost

  2. Slet fra tabel ved hjælp af kolonne i anden tabel

  3. Hvordan vælger man poster fra dette forhold?

  4. Lumen 5.6 Migreringsfejl Den angivne nøgle var for lang, maks. nøglelængde er 767 bytes