Çoklu kategori mantığı

 
PHP  
972  

Bu yazımda PHP'de çok kategorili veriler mantığını anlatacağım. Her ne kadar PHP için desemde diğer dillerde de mantık aynı şekilde olacak.

Kategoriler Resmi

3 adet tablomuz olacak. Bunlar makaleler, kategoriler ve kategori_makale tabloları. makaleler ve kategoriler tablosu adında anlaşılacağı gibi makaleleri ve kategorileri tutacak. Burada kilit nokta kategori_makale tablosu. Bunun sebebi bizim çoklu kategorili makale yazmamızı (bir makalenin birden çok kategorisi olmasını) sağlayacak tablo budur.

Tabloların SQL kodları:

sql kodu:SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `kategori_makale`;
CREATE TABLE `kategori_makale` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kategori_id` int(11) NOT NULL,
`makale_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `kategoriler`;
CREATE TABLE `kategoriler` (
`kategori_id` int(11) NOT NULL AUTO_INCREMENT,
`kategori_isim` varchar(255) DEFAULT NULL,
PRIMARY KEY (`kategori_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `makaleler`;
CREATE TABLE `makaleler` (
`makale_id` int(11) NOT NULL AUTO_INCREMENT,
`makale_baslik` varchar(255) NOT NULL,
`makale_icerik` text,
PRIMARY KEY (`makale_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Aklınıza şöyle bir soru gelebilir, "peki ya bu çoklu kategoriyi nasıl ekleyebilirim?"

Şöyle anlatayım;

İlk olarak form sayfasında:

php kodu:<?php
$array_kategori = $db->query("SELECT * FROM kategoriler ORDER BY kategori_isim ASC")->fetchAll(PDO::FETCH_ASSOC);
foreach ($array_kategori as $kategori) {
?>
<input type="checkbox" name="kategori[]" value="<?php echo $kategori["kategori_id"] ?>">
<?php
}
?>

Birden çok aynı isimli veriyi post edeceksek name sonuna [] ekliyoruz. Checkbox'lar eğer checked durumda ise post edilecek, checked olmayanlar post edilmeyecek.

Kategorileri bu şekilde dizi olarak alabiliyoruz:

php kodu:$array_kategori = $_POST["kategori"];

Seçili kategori id'lerini dizi olarak alabildiğimize göre buna göre veritabanımıza (kategori_makale tablosuna) ekleyebiliriz.

Mesela: 
"HTML Eğitimi" başlıklı bir makalemiz olsun. "Web Tasarım" ve "Web Yazılım" adında iki kategorimiz olsun.

makaleler -> makale_id: 1, makale_baslik: HTML Eğitimi
kategoriler -> kategori_id: 1, kategori_isim: Web Tasarım
kategoriler -> kategori_id: 2, kategori_isim: Web Yazılım

O halde "HTML Eğitimi" başlıklı makale hem Web Tasarım, hem de Web Yazılım kategorisinde olacak. Bu şekilde olması için:
kategori -> kategori_id: 1, makale_id: 1
kategori -> kategori_id: 2, makale_id: 1

Kategori id'sine göre ilgili makaleyi şu şekilde çekiyoruz:

sql kodu:SELECT m.makale_id, m.icerik, k.kategori_isim FROM makaleler AS m LEFT JOIN kategori_makale AS km ON km.makale_id = m.makale_id LEFT JOIN kategorler AS k ON k.kategori_id = km.kategori_id WHERE k.kategori_id = '2'

Umarım faydalı bir yazı olmuştur. İyi çalışmalar.