PHP 8 ile çoka çok ilişki (many-to-many relationship) tablosu tasarımı, genellikle iki tablo arasında bağlantı kurmak için bir üçüncü tablo kullanmayı içerir. Bu örnekte, "kurslar" ve "kategoriler" tabloları arasındaki çoka çok ilişkisini nasıl kuracağınızı göstereceğim.
1. Veritabanı Tablolarını Oluşturma
Öncelikle, aşağıdaki tabloları oluşturmalısınız:
Kategoriler Tablosu
CREATE TABLE kategoriler (
id INT AUTO_INCREMENT PRIMARY KEY,
isim VARCHAR(100) NOT NULL
);
Kurslar Tablosu
CREATE TABLE kurslar (
id INT AUTO_INCREMENT PRIMARY KEY,
isim VARCHAR(100) NOT NULL,
aciklama TEXT,
fiyat DECIMAL(10, 2)
);
Kurs Kategori İlişkisi Tablosu
Çoka çok ilişkiyi kurmak için, bir "kurs_kategori" tablosu oluşturmalısınız:
CREATE TABLE kurs_kategori (
kurs_id INT,
kategori_id INT,
PRIMARY KEY (kurs_id, kategori_id),
FOREIGN KEY (kurs_id) REFERENCES kurslar(id) ON DELETE CASCADE,
FOREIGN KEY (kategori_id) REFERENCES kategoriler(id) ON DELETE CASCADE
);
2. Tablo Açıklamaları
-
kategoriler Tablosu: Kategorilerin bilgilerini saklar. Her kategori bir ID'ye sahiptir.
-
kurslar Tablosu: Kursların bilgilerini saklar. Her kurs da bir ID'ye sahiptir.
-
kurs_kategori Tablosu: Bu tablo, her kursun hangi kategorilere ait olduğunu belirtir.
kurs_id
vekategori_id
alanları,kurslar
vekategoriler
tablolarındaki ID'lere referans eder. Bu alanlar, aynı zamanda birincil anahtar olarak da tanımlanmıştır, böylece aynı kurs ve kategori için birden fazla kayıt olamaz.
3. PHP ile Veri Ekleme
Kurs ve kategori eklemek için basit bir form oluşturalım ve ardından ilişkileri ekleyecek bir PHP dosyası yazalım.
HTML Formu (kurs_ekle_form.php)
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kurs Ekle</title>
</head>
<body>
<h1>Kurs Ekle</h1>
<form action="kurs_ekle.php" method="post">
<label for="isim">Kurs İsmi:</label>
<input type="text" id="isim" name="isim" required>
<br>
<label for="aciklama">Açıklama:</label>
<textarea id="aciklama" name="aciklama" required>
</textarea>
<br>
<label for="fiyat">Fiyat:</label>
<input type="number" id="fiyat" name="fiyat" step="0.01" required>
<br>
<label for="kategori">Kategori Seç:</label>
<select id="kategori" name="kategori_id[]" multiple required>
<?php
// Kategorileri veritabanından al
$conn = new mysqli("localhost", "kullanici_adiniz", "sifreniz", "veritabani_adiniz");
$result = $conn->query("SELECT id, isim FROM kategoriler");
while ($row = $result->fetch_assoc()) {
echo "<option value='" . $row['id'] . "'>" . $row['isim'] . "</option>";
}
$conn->close();
?>
</select>
<br>
<input type="submit" value="Ekle">
</form>
</body>
</html>
PHP Kodu (kurs_ekle.php)
<?php
// Veritabanı bağlantısı
$servername = "localhost";
$username = "kullanici_adiniz";
$password = "sifreniz";
$dbname = "veritabani_adiniz";
// Bağlantıyı oluştur
$conn = new mysqli($servername, $username, $password, $dbname);
// Bağlantıyı kontrol et
if ($conn->connect_error) {
die("Bağlantı başarısız: " . $conn->connect_error);
}
// Formdan gelen verileri kontrol et
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$isim = $_POST['isim'];
$aciklama = $_POST['aciklama'];
$fiyat = $_POST['fiyat'];
$kategori_ids = $_POST['kategori_id'];
// Kursu ekle
$stmt = $conn->prepare("INSERT INTO kurslar (isim, aciklama, fiyat) VALUES (?, ?, ?)");
$stmt->bind_param("ssd", $isim, $aciklama, $fiyat);
if ($stmt->execute()) {
$kurs_id = $stmt->insert_id; // Yeni eklenen kursun ID'sini al
// Seçilen kategorileri ekle
foreach ($kategori_ids as $kategori_id) {
$stmt2 = $conn->prepare("INSERT INTO kurs_kategori (kurs_id, kategori_id) VALUES (?, ?)");
$stmt2->bind_param("ii", $kurs_id, $kategori_id);
$stmt2->execute();
$stmt2->close();
}
echo "Yeni kurs ve kategorileri eklendi!";
} else {
echo "Kurs eklenemedi: " . $stmt->error;
}
// Sorgu nesnesini kapat
$stmt->close();
}
// Bağlantıyı kapat
$conn->close();
?>
4. Açıklama
-
HTML Formu: Kullanıcıdan kurs ismini, açıklamasını, fiyatını ve kategorilerini alır. Kategoriler, çoklu seçim yapılabilecek bir select kutusunda gösterilir (
multiple
özelliği ile). -
PHP Kodu: Formdan gelen verileri alır, önce kursu
kurslar
tablosuna ekler. Ardından, seçilen kategori ID'lerinikurs_kategori
tablosuna ekleyerek kursun hangi kategorilere ait olduğunu belirtir.
5. Kullanım
-
kategoriler
tablosuna birkaç kategori eklemelisiniz. - Yukarıdaki HTML formunu bir dosyaya (örneğin,
kurs_ekle_form.php
) kaydedin. - PHP kodunu başka bir dosyaya (örneğin,
kurs_ekle.php
) kaydedin. - Web sunucunuzda bu dosyaları çalıştırarak kurs ekleme ve kategori atama işlemini deneyin.
Bu adımlarla, kurslar ile kategoriler arasında çoka çok ilişkiyi yönetebileceğiniz bir uygulama oluşturmuş oldunuz.