Mysql
 sql >> Baza danych >  >> RDS >> Mysql

tworzenie unikalnych ślimaków tytułów strony php

Wystarczy raz trafić do bazy danych, pobrać wszystko na raz, są szanse, że to największe wąskie gardło.

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

Następnie umieść wyniki w tablicy (powiedzmy $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;
}

Używamy in_array() sprawdza, czy ślimak był my-slug LIKE zwróci również wiersze, takie jak

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

itp., które powodowałyby problemy, in_array() kontrole zapewniają, że sprawdzamy tylko dokładnie ten ślimak, który został wprowadzony.

Dlaczego po prostu nie policzymy wyników i nie dajemy +1?

Dzieje się tak dlatego, że jeśli uzyskałeś wiele wyników i usunąłeś kilka, następny ślimak mógłby spowodować konflikt.

Np.

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

Usunięcie -3 i -5 pozostawia nam

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

To daje nam 3 wyniki, następną wstawką będzie my-slug-4 który już istnieje.

Dlaczego po prostu nie użyjemy ORDER BY i LIMIT 1 ?

Nie możemy po prostu złożyć order by w zapytaniu, ponieważ naturalne sortowanie spowodowałoby, że my-slug-10 pozycja niższa niż my-slug-4 ponieważ porównuje znak po znaku i 4 jest wyższy niż 1

Np.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql innodb:opis tabeli nie pokazuje referencji do kolumn, co je pokazuje?

  2. Używanie MySql z Entity Framework 4 i Code-First Development CTP

  3. Jak mam napisać PHP $_POST vars w funkcji mysql_query?

  4. Tabela przestawna MySQL z dynamicznymi nagłówkami na podstawie danych w jednej kolumnie

  5. MySQL:Nie wstawiaj nowego wiersza, jeśli zdefiniowane wiersze są takie same