Nasıl kullanıcıların PHP ve MySQL kullanarak birden fazla etiket eklemek için izin?

3 Cevap php

Tamam, ben zaten kullanıcıların etiketleri girmek izin için bir komut dosyası var ama kullanıcılar, (html, css, php), örneğin bir virgül ile ayrılır birden fazla etiket girelim ve veritabanındaki her etiketi saklamak istiyorum.

Bunu nasıl ya Birisi bana çalışabilir birkaç örnek verebilir bana gösterebilir bir öğretici var mı.

Teşekkürler

3 Cevap

Böyle bir şema varsayarsak:

  • Mesaj (id, author_id, POST_DATE, post_text);
  • Etiketi (id, TAG_NAME);
  • Mesaj Etiket (id, post_id, tag_id).

Mesaj Etiketi tablo (bir post birden Etiketler olabilir ve bir Tag çoklu mesajına kullanılabilir çünkü) Etiketi Post çok-çok ilişki için bir join table adlandırılan şeydir.

Kullanıcı bir giriş alanına virgülle ayırarak etiketlerinin bir listesini girer:

$tags = array_unique(array_map(explode(',', $POST['tags']), 'trim'));

ve kullanıcının girdiği etiketleri bir dizi var. Sadece bazı karakterleri sağlayan ve / veya küçük harfe onları dönüştürme gibi, daha da sterilize etmek isteyebilirsiniz.

Sonra kod olur:

$post_id = ...
foreach ($tats as $tag) {
  $tag = mysql_real_escape_string($tag);
  $sql = <<<END
INSERT INTO PostTag (post_id, tag_id)
VALUES ($post_id, (SELECT id FROM Tag WHERE tag_name = '$tag'))
END;
  mysql_query($sql);
}

Eğer etiketi için yaparım Genellikle ne <-> yazılan dönüşümler etiketleri için 1 masa, mesaj için 1 masa ve aralarında eşleşmeleri depolayan sonra üçüncü bir tablo var ise:

tagid tagname
-------------
1     foo
2     bar

postid posttitle
-------------
1      test
2      beep

tagid postid
-------------
1     2
2     1
2     2

Ilk "bar" olarak etiketlenen ve ikinci "foo, bar" etiketli iki mesaj, olurdu

Sen PHP preg_split komutunu kullanarak birden etiketleri bir dize bölmek ve o zaman şimdi olduğu gibi veritabanına her etiketi kurtarabilir.

Aşağıdaki kod bir dizi ["html", "css", "php"] içine dize "html, css, php" bölmek:

$tag_string = "html, css, php";
$tags = preg_split("/[\s,]+/", $tag_string);