php+sql : 1 alana 1den çok kategori ekleme

Kodla Büyü

nuribjk

Seçkin Üye
Seçkin Üye
Mesajlar
301
veritabanında yazi ve kategori diye 2 tablo olacak.
kategori tablosunda kat_ad ve kat id olacak. (kat_id:1 - siyaset, kat_id:2 - eglence olsun)
eklediğim bir yazıyı 2 kategoriyede eklenmesini istiyorum. - takıldığım nokta tam olarak burası -
istiyorum ki 2 farklı kayıt oluşmasın, tek kayıtta , yazının yazi_kategori_id alanına 1 ve 2 id lerini hatta gerektiğnde daha fazla bilgiyi girebileyim.
bunu dizi olarak mı yapacağım, sorgularken nasıl çekeceğim bir türlü bulamadım.
googlede çare olamadı :) umarım anlatabilmişimdir sorunumu.
 
Sormak isteyipte, açıklamasının zor olacağını düşündüğüm için sormaktan vazgeçtiğim bir soru. :++:
 
hocam şimdi yazı ve kategori tablolarından faklı olarak

yaziKategori Adından bir tablo oluşturup

kat_id
yazi_id şeklinde alanlara kayıt ettirebilirsiniz.

yada yazi yablosunda kat_id kısmına (,) virgül ler ile ekleyip dizi şeklinde kullanabilirsiniz.

tercih sizin
 
nuri belki 3. bi tablo oluturup, aralarindaki iliskiyi bununla kursan? hayal ediyorum, tam oldu diyorum ve o anda benimde kafam karisiyor :D belki bu isini gorebilir.
 
bu dizi ihtimaline sorumun içerisine yazmıştım, sonra baktım iyice karışacak sildim :)
ama dediğiniz dizi olayını bir deneyeceğim. tam istediğim çözüm olursa burayada eklerim.
daha kolay bir çözüm daha olabileceğinede inanıyorum aslında ama düşün düşün bulamadım.
wordpress teki kullanılış şekline baktım, bir yazı 4 kategoriye ekleyecekse 4 farklı kayıt eklemiş. wp ye hiç yakıştıramadım :)
 
opian' Alıntı:
nuri belki 3. bi tablo oluturup, aralarindaki iliskiyi bununla kursan? hayal ediyorum, tam oldu diyorum ve o anda benimde kafam karisiyor :D belki bu isini gorebilir.

hacı bu saat itibariyle 3. tablo konusunu kafamda oturtamadım :) ama olsa bile wp de olduğu gibi her kategori için ayrı kayıt tutmaktan bir farkı olmaz gibime geliyor. dur bakalım hele bir yarın olsun :)
 
yazi_tbl
id = 1
diger_alalar ="falan filan"
kat_idler= "2,3,6,54" // bir içerik birden falza kategorile ilişklenmiş hali php nin implode ve explode fonsiyonları string diziye , dizi stringe çevirişip kullanılabilir

sizinde zaten üzürinde konuştuğunuz gibi
yada yei bir tablo eklersin


ilisikler_tbl

//--------birinci kayırt
id = 1
icerikler_id =23
kategori_id =2
//-----iknci kayır
id = 2
icerikler_id =23
kategori_id =3
....
....

select kategori_id from ilisikler_tbl where icerikler_id=23
bu srogulama ile içerik ıd si 23 kayıtlar dönecektir sonuçta gene elimzde 2 ve 3 değerlerini içeren bir veri kümesi olacaktır.

Buda bir çözüm
Tercih senin aralarıdnaki avatajı ve dez avantajı bilmiyorum aynı gibi duruyor

kolay gelsin
 
WordPress'de yazı kategorileri, bağlantı kategorileri ve etiketler için aynı tablolar kullanıldığından öyle fazla kategoriye ihtiyaç duyulmuştur. İstediğiniz olayı gerçekleştirmek için iki yol mevcuttur. Bunlardan birincisi bahsettiğiniz şekilde kategorileri virgül ile ayırarak yazı tablosunda bir alana kaydetmektir. Ancak bu veritabanı formlarına uygun olmayacak, özellikle yazının kategorilerini düzenlerken size eziyet çektirecektir. Bu yöntemde veritabanı yapınız şöyle olacaktır:
yazilar_tablosu
id yazi yazi_kategori
5 Veritabanı kurulumu 2, 8, 5
6 BB paylaşımları 3, 2

kategoriler_tablosu
id kategori_adi
2 Veritabanları
3 Faydalı Siteler
4 Flash
5 Photoshop
Bu yöntemde yazının kategorilerini çektikten sonra PHP'de explode fonksiyonu ile parçalamak ve aldığınız her kategorinin adını almak için kategoriler tablosunda her kategori için sorgulama yapmanız gerekecek. Ayrıca bir kategoriye ait yazıları çekerken de LIKE gibi sunucuyu yoracak bir komut kullanmak zorunda kalacaksınız. Özellikle bu zorlukları nedeniyle veritabanı normlarına uygun olarak aşağıdaki şekilde 3 tablo ile işinizi halletmelisiniz.
yazilar_tablosu
id yazı
2 Veritabanı oluşturma
3 BB paylaşımlarım
4 birkaç faydalı site

kategoriler_tablosu
id kategori_adi
5 Veritabanları
6 Flash
7 Faydalı Siteler
8 Photoshop

yazi_kategorileri tablosu
yazi_id kategori_id
2 5
2 7
3 7
2 8
3 5

Son tabloda hangi yazı hangi kategorilere aitse aralarındaki ilişki kaydedilir. Örnekteki bilgilere göre 2 ID'li yazı 5, 7 ve 8 ID'li kategorilere aittir. 3 ID'li yazı ise 7 ve 5 ID'li kategorilere aittir. Üç tabloyu bir INNER JOIN'li SELECT sorgusuna alıp, birleştirebilir ve yazının bütün bilgilerine ulaşabilirsiniz. Aynı sorguyla bir kategoriye ait yazılara da ulaşabilirsiniz. İşin özü artık sadece SQL sorgularını kullanarak bütün işlemlerinizi daha az kod kullanarak ve sunuyu yormadan halledebilirsiniz. Ekte bu yapıyı daha iyi anlamanızı sağlayacak bir Access veritabanı bulunmaktadır. Tablolar ve Sorgular bölümündeki nesneleri inceleyiniz. Ayrıca Araçlar/İlişkiler menüsünden de tablolar arasındaki ilişkiyi görebilirsiniz.
 

Ekli dosyalar

alpaygunes ve yakuphan hocama teşekkür ederim ayrıntılı cevapları için.

@yakuphan
en son verdiğiniz çözüm yolu aklıma yattı. onu deneyeceğim birazdan, muhtemelen sorunum hallolmuş olacak.
tablonuzuda inceledim, teşekkür ederim, yeterince açık ve net :+1:

@alpaygunes
hocam verdiğiniz 2.yöntemde fazladan kayıt eklememize neden olacak diye istememiştim. ilk çözümünüz ise aklıma gelmişti ama stringi parçalamayı başaramamıştım, yine bahsettiğiniz komutları inceleyeceğim. muhtemelen yakuphan hocanın son çözümü işe yarayacak ama hepsini deneyip öğrenmekte yarar var. :++:
 
nuribjk' Alıntı:
veritabanında yazi ve kategori diye 2 tablo olacak.
kategori tablosunda kat_ad ve kat id olacak. (kat_id:1 - siyaset, kat_id:2 - eglence olsun)
eklediğim bir yazıyı 2 kategoriyede eklenmesini istiyorum. - takıldığım nokta tam olarak burası -
istiyorum ki 2 farklı kayıt oluşmasın, tek kayıtta , yazının yazi_kategori_id alanına 1 ve 2 id lerini hatta gerektiğnde daha fazla bilgiyi girebileyim.
bunu dizi olarak mı yapacağım, sorgularken nasıl çekeceğim bir türlü bulamadım.
googlede çare olamadı :) umarım anlatabilmişimdir sorunumu.
yazıyı kaydetme formunda halletsen işi veri 2. kategori diye hatta 3. kategori yazı tablosunda da aynı alanları açsan olmaz mı çekerken de 2 yerde birden tarama yaptırırsın olur bence kategori alanı israfı olur belki ama yazı alanından kurtarırsın
 
BBNET
Geri
Üst