sql >> Databasteknik >  >> RDS >> Mysql

skapa unika sidtitel slugs php

Slå bara till databasen en gång, ta allt på en gång, chansen är stor att det är den största flaskhalsen.

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

Lägg sedan dina resultat i en array (låt oss säga $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 använder in_array() kontrollerar som om snigeln var my-slug LIKE skulle också returnera rader som

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

etc som skulle orsaka problem, in_array() kontroller säkerställer att vi bara kontrollerar mot den exakta slug som angavs.

Varför räknar vi inte bara resultaten och +1:ar?

Detta beror på att om du hade flera resultat och raderade några, kan din nästa snigel komma i konflikt.

T.ex.

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

Ta bort -3 och -5 lämnar oss med

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

Så det ger oss 3 resultat, nästa infogning skulle vara my-slug-4 som redan finns.

Varför använder vi inte bara ORDER BY och LIMIT 1 ?

Vi kan inte bara göra en order by i frågan eftersom naturlig sortering skulle göra my-slug-10 rankas lägre än my-slug-4 eftersom den jämför tecken för tecken och 4 är högre än 1

T.ex.

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. Vad jag skulle vilja se i Amazon EC2 för databashantering

  2. android/php-posten infogas inte i mysql

  3. Använder row_to_json() med kapslade kopplingar

  4. Hur man släpper en kolumn från en tabell i MySQL med hjälp av ett kolumnnummer