Sizden tiyatro bilet satışı yapan bir firma için otomasyon yapmanız istenmektedir

Html sayfaları, formlar,tablolar,Bootstrap ve sql bağlantısı kullanılarak yapılacaktır. PHP kodlarının içerisine html kodu yazılmayacaktır. Çalışmayan kod değerlendirilmeye alınmayacaktır.
Soru:
Sizden tiyatro bilet satışı yapan bir firma için otomasyon yapmanız istenmektedir. Bu otomasyonu yaparken sizden istenen ve dikkat etmeniz gereken noktalar aşağıda belirtilmiştir:

  1. Müşteri ekleme sayfasında kullanıcıdan müşteri adı, soyadı, telefonu, mail adresi ve şifresi istenecektir.
  2. Müşteri bilgileri girildikten sonra onayla butonuna basılıp verilerin veri tabanına bağlanması sağlanacaktır.
  3. Tiyatro sisteminde bulunan oyunların sergilendiği bir sayfa vardır.
    Oyunun önizlemesi görülebilecektir.
  4. Bilet satış ekranına gelen müşteri hesabına giriş yaptığı için müşteri adını girecektir. Film adı, koltuk numarası, seans saati, salon, tarih ve açıklama gibi faktörler bu sekmede girilecektir. Bu sekmede oyunu ekle butonu dışında silme,güncelleme ve çıkış butonları da mevcuttur.
  5. Sepetteki oyunların satın alma işlemi yapılacak.
    Müşteriden alınan paranın yazılacağı bir ekran olacak. “PARA ÜSTÜ” butonuna tıklandığı zaman para üstü kasadan en az para çıkacak şekilde hesaplanacak. Para üstü aşağıdaki gibi ekrana yazdırılacak ki kasadan yanlış para üstü verilmesin. (Kasadaki Paralar: 1 TL, 5 TL, 10 TL, 20 TL, 50 TL, 100 TL, 200 TL)
    Örneğin; Para üstü 576 TL ise 2 adet 200 TL, 1 adet 100 TL, 1 adet 50 TL, 1 adet 20 TL, 6 adet 1 TL.
  6. Para üstü hesaplama fonksiyon olarak yapılacak. Verilen para ve sepetteki toplam tutar değişken olarak gönderilecektir. Fonksiyon gerekli hesaplamayı yaptıktan sonra sonuç dönecektir. Fonksiyon içinde ekrana yazma vb. olmayacaktır.
  7. Güncelle sekmesinde kullanıcı film adını, koltuk numarası, seans saati, salon, tarih ve açıklama gibi faktörleri değiştirebilecektir.
  8. Silme işlemleri yapıldığı zaman ise veriler sıfırlanacaktır.

Resimde bulunan sinema otomasyonu tarzı olabilir.

Bu tarz bir yazılımı YAPAY ZEKA ile hazırlamak mümkün görünmüyor. Bir geliştirici yardımı almanız gerekmektededir.

Sırayla gidelim. Öncelikle veritabanı yapısını oluşturmamız lazım.

Veritabanı yapısı

  • Musteriler
    – Musteri_id (int)
    – Musteri adi (String)
    – musteri soyadi (String)
    – musteri telefonu (String)
    – musteri mail (String)
    – musteri sifresi (String)
    – create (timestamp)
    – update (timestamp)

  • Tiyatro Oyunlari
    – Tiyatro_id (int)
    – Tiyatro basligi (String)
    – Tiyatro aciklamasi (String)
    – Tiyatro resmi (String)
    – Tiyatro zamani (timestamp)
    – Tiyatro ucreti (String)
    – create (timestamp)
    – update (timestamp)

  • Sepet_gecici
    – sepet_g_id (int)
    – Tiyatro_id (int)
    – Musteri_id (int)
    – Koltuk numarasi (int)
    – seans saati (timestamp)
    – salon (int)
    – tarih (timestamp)
    – aciklama (String)
    – create (timestamp)
    – update (timestamp)

  • Satilanlar
    – sepet_id (int)
    – Tiyatro_id (int)
    – Musteri_id (int)
    – Koltuk numarasi (int)
    – seans saati (timestamp)
    – salon (int)
    – tarih (timestamp)
    – aciklama (String)
    – Ucret (String)
    – create (timestamp)
    – update (timestamp)

Mysql ile bu tablo yapısını hazırlayalım:

-- Musteriler tablosu
CREATE TABLE Musteriler (
    Musteri_id INT AUTO_INCREMENT PRIMARY KEY,
    Musteri_adi VARCHAR(255) NOT NULL,
    Musteri_soyadi VARCHAR(255) NOT NULL,
    Musteri_telefonu VARCHAR(20),
    Musteri_mail VARCHAR(255),
    Musteri_sifresi VARCHAR(255),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Tiyatro_Oyunlari tablosu
CREATE TABLE Tiyatro_Oyunlari (
    Tiyatro_id INT AUTO_INCREMENT PRIMARY KEY,
    Tiyatro_basligi VARCHAR(255) NOT NULL,
    Tiyatro_aciklamasi TEXT,
    Tiyatro_resmi VARCHAR(255),
    Tiyatro_zamani TIMESTAMP,
    Tiyatro_ucreti VARCHAR(20),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Sepet_gecici tablosu
CREATE TABLE Sepet_gecici (
    sepet_g_id INT AUTO_INCREMENT PRIMARY KEY,
    Tiyatro_id INT,
    Musteri_id INT,
    Koltuk_numarasi INT,
    seans_saati TIMESTAMP,
    salon INT,
    tarih TIMESTAMP,
    aciklama TEXT,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (Tiyatro_id) REFERENCES Tiyatro_Oyunlari(Tiyatro_id),
    FOREIGN KEY (Musteri_id) REFERENCES Musteriler(Musteri_id)
);

-- Satilanlar tablosu
CREATE TABLE Satilanlar (
    sepet_id INT AUTO_INCREMENT PRIMARY KEY,
    Tiyatro_id INT,
    Musteri_id INT,
    Koltuk_numarasi INT,
    seans_saati TIMESTAMP,
    salon INT,
    tarih TIMESTAMP,
    aciklama TEXT,
    Ucret VARCHAR(20),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (Tiyatro_id) REFERENCES Tiyatro_Oyunlari(Tiyatro_id),
    FOREIGN KEY (Musteri_id) REFERENCES Musteriler(Musteri_id)
);

Musteri ekleme sayfasi

Bu alanda oncelikle bir veritabani baglanti dosyasi olusturacagiz, boylece bunu diger sayfalarda da kullanabiliriz. Sonrasinda Musteri ekleme sayfasi (bootstrap) ve ekle dedigimizde bilgileri veritabanina gonderecek olan php dosyasi. Sirayla gidelim.

Elbette, güvenli bir uygulama geliştirmek için PDO (PHP Data Objects) kullanarak MySQL bağlantısı ve SQL sorguları gerçekleştirmek önemlidir. Aşağıda, PDO kullanarak MySQL bağlantısı kurma ve müşteri ekleme işlemi için bir örnek bulunmaktadır.

PDO ile MySQL bağlantısı kurma (db_connection.php):

<?php

$servername = "localhost";
$username = "kullanici_adi";
$password = "sifre";
$dbname = "veritabani_adi";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);
    // Hata modunu etkinleştir
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // İsteğe bağlı: Sorgu sonuçlarını dizi olarak al
    $conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo "Bağlantı hatası: " . $e->getMessage();
    die();
}

// kayitli musterilerden birini cekiyor. Bunu idarelik yapiyorum, normalde musteri girisi sayfasi eklenmeli. Oda size kalsin :) Ben ornek ekli olan 1 id li musteriyi cekiyorum, her yerde onu kullanacagiz. Yazacaginiz giris ozelligiyle her musteri icin sessiondan islem yaptirabilirsiniz.
        try {
            // Tiyatro Oyunu bilgilerini al
            $sql_musteri = "SELECT * FROM Musteriler WHERE Musteri_id = :Musteri_id";
            $stmt = $conn->prepare($sql_musteri );
            $stmt->bindParam(':Musteri_id', "1");
            $stmt->execute();
            $musteri = $stmt->fetch(PDO::FETCH_ASSOC);
            $_SESSION['musteri_id'] = $musteri["Musteri_id"];

        } catch (PDOException $e) {
            echo "Hata: " . $e->getMessage();
        }

Müşteri ekleme işlemi için PDO kullanımı (add_customer.php):

<?php

require_once 'db_connection.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Formdan gelen verileri al
    $musteri_adi = $_POST['musteri_adi'];
    $musteri_soyadi = $_POST['musteri_soyadi'];
    $musteri_telefonu = $_POST['musteri_telefonu'];
    $musteri_mail = $_POST['musteri_mail'];
    $musteri_sifresi = $_POST['musteri_sifresi'];

    try {
        // SQL sorgusu
        $sql = "INSERT INTO Musteriler (Musteri_adi, Musteri_soyadi, Musteri_telefonu, Musteri_mail, Musteri_sifresi) 
                VALUES (:musteri_adi, :musteri_soyadi, :musteri_telefonu, :musteri_mail, :musteri_sifresi)";
        
        // PDO prepare ve execute kullanımı
        $stmt = $conn->prepare($sql);
        $stmt->bindParam(':musteri_adi', $musteri_adi);
        $stmt->bindParam(':musteri_soyadi', $musteri_soyadi);
        $stmt->bindParam(':musteri_telefonu', $musteri_telefonu);
        $stmt->bindParam(':musteri_mail', $musteri_mail);
        $stmt->bindParam(':musteri_sifresi', $musteri_sifresi);

        // Sorguyu çalıştır
        $stmt->execute();

        echo "Müşteri başarıyla eklendi.";
    } catch (PDOException $e) {
        echo "Hata: " . $e->getMessage();
    }
}

Bu örnekte, PDO’nun avantajlarından biri olan prepared statements kullanarak SQL sorgusunu gerçekleştirdik. Bu, SQL enjeksiyon saldırılarına karşı daha güvenli bir yaklaşımdır. Ayrıca, bağlantı ve sorgu hatalarını ele almak için try-catch blokları kullanılmıştır.

HTML formu (Bootstrap kullanılarak) (musteri_ekle.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Müşteri Ekle</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container mt-5">
    <h2>Müşteri Ekle</h2>
    <form action="add_customer.php" method="POST">
        <div class="form-group">
            <label for="musteri_adi">Müşteri Adı:</label>
            <input type="text" class="form-control" id="musteri_adi" name="musteri_adi" required>
        </div>
        <div class="form-group">
            <label for="musteri_soyadi">Müşteri Soyadı:</label>
            <input type="text" class="form-control" id="musteri_soyadi" name="musteri_soyadi" required>
        </div>
        <div class="form-group">
            <label for="musteri_telefonu">Müşteri Telefonu:</label>
            <input type="text" class="form-control" id="musteri_telefonu" name="musteri_telefonu">
        </div>
        <div class="form-group">
            <label for="musteri_mail">Müşteri Mail:</label>
            <input type="email" class="form-control" id="musteri_mail" name="musteri_mail">
        </div>
        <div class="form-group">
            <label for="musteri_sifresi">Müşteri Şifresi:</label>
            <input type="password" class="form-control" id="musteri_sifresi" name="musteri_sifresi" required>
        </div>
        <button type="submit" class="btn btn-primary">Ekle</button>
    </form>
</div>

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

Sira Tiyatro oyunlarini listeleme sayfasina geldi. Tiyatro Oyunları’nı listelemek için bir HTML sayfası (Bootstrap kullanılarak) ve sunucu tarafında PHP ile listeleme işlemini gerçekleştiren örnek bir dosya:

HTML (tiyatro_oyunlari.php):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tiyatro Oyunları</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container mt-5">
    <h2>Tiyatro Oyunları</h2>
    <table class="table">
        <thead>
        <tr>
            <th>Tiyatro Adı</th>
            <th>Açıklama</th>
            <th>Tarih</th>
            <th>Resim</th>
            <th></th>
        </tr>
        </thead>
        <tbody>
            <?php include 'get_tiyatro_oyunlari.php'; ?>
        </tbody>
    </table>
</div>

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

PHP (get_tiyatro_oyunlari.php):

<?php
require_once 'db_connection.php';

try {
    // SQL sorgusu
    $sql = "SELECT Tiyatro_id, Tiyatro_basligi, Tiyatro_aciklamasi, Tiyatro_zamani, Tiyatro_resmi FROM Tiyatro_Oyunlari";
    $stmt = $conn->query($sql);

    // Sonuçları al
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "<tr>";
        echo "<td>{$row['Tiyatro_basligi']}</td>";
        echo "<td>{$row['Tiyatro_aciklamasi']}</td>";
        echo "<td>{$row['Tiyatro_zamani']}</td>";
        echo "<td><img src='{$row['Tiyatro_resmi']}' alt='Tiyatro Resmi' style='max-width: 100px;'></td>";
        echo "<td><a href='bilet_satin_al.php?tiyatro_id={$row['Tiyatro_id']}' class='btn btn-primary'>Bilet Satın Al</a></td>";
        echo "</tr>";
    }
} catch (PDOException $e) {
    echo "Hata: " . $e->getMessage();
}
?>

Bu örnekte, get_tiyatro_oyunlari.php dosyası, Tiyatro Oyunları tablosundan verileri alıp HTML tablosu içinde listeleyen bir PHP dosyasıdır. Ayrıca, her bir tiyatro oyunu için “Bilet Satın Al” butonu eklenmiştir. Bu butona tıklandığında, kullanıcıyı bilet satın alma sayfasına yönlendirmek için bilet_satin_al.php sayfasına tiyatro oyunu kimliği (tiyatro_id) ile bir sorgu parametresi gönderilmektedir.

Bilet satın alma sayfasını tasarlamak için, ilgili bilgileri almak ve kullanıcıya bilet seçme seçeneklerini sunmak gibi adımları içeren bir HTML sayfası oluşturmanız gerekecek.

Tiyatro oyunu satin alma sayfasi

Bu sayfada, belirli bir tiyatro oyunu için bilet satın alma işlemi gerçekleştirilecektir.

HTML (bilet_satin_al.php):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bilet Satın Al</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container mt-5">
    <h2>Bilet Satın Al</h2>
    <?php
    require_once 'db_connection.php';

    if (isset($_GET['tiyatro_id'])) {
        $tiyatro_id = $_GET['tiyatro_id'];
        try {
            // Tiyatro Oyunu bilgilerini al
            $sql = "SELECT * FROM Tiyatro_Oyunlari WHERE Tiyatro_id = :tiyatro_id";
            $stmt = $conn->prepare($sql);
            $stmt->bindParam(':tiyatro_id', $tiyatro_id);
            $stmt->execute();
            $tiyatro_oyunu = $stmt->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            echo "Hata: " . $e->getMessage();
        }
        ?>
        <form action="process_bilet.php" method="POST">
            <input type="hidden" name="tiyatro_id" value="<?php echo $tiyatro_id; ?>">
            <div class="form-group">
                <label for="film_adi">Film Adı:</label>
                <input type="text" class="form-control" id="film_adi" name="film_adi" value="<?php echo $tiyatro_oyunu['Tiyatro_basligi']; ?>" readonly>
            </div>
            <div class="form-group">
                <label for="koltuk_numarasi">Koltuk Numarası:</label>
                <input type="text" class="form-control" id="koltuk_numarasi" name="koltuk_numarasi" required>
            </div>
            <div class="form-group">
                <label for="seans_saati">Seans Saati:</label>
                <input type="text" class="form-control" id="seans_saati" name="seans_saati" value="<?php echo $tiyatro_oyunu['Tiyatro_zamani']; ?>" readonly>
            </div>
            <div class="form-group">
                <label for="salon">Salon:</label>
                <input type="text" class="form-control" id="salon" name="salon" value="<?php echo $tiyatro_oyunu['Tiyatro_salon']; ?>" readonly>
            </div>
            <div class="form-group">
                <label for="tarih">Tarih:</label>
                <input type="text" class="form-control" id="tarih" name="tarih" value="<?php echo $tiyatro_oyunu['Tiyatro_zamani']; ?>" readonly>
            </div>
            <div class="form-group">
                <label for="aciklama">Açıklama:</label>
                <textarea class="form-control" id="aciklama" name="aciklama" rows="3" readonly><?php echo $tiyatro_oyunu['Tiyatro_aciklamasi']; ?></textarea>
            </div>
            <div class="form-group">
                <label for="fiyat">Fiyat:</label>
                <input type="text" class="form-control" id="fiyat" name="fiyat" value="<?php echo $tiyatro_oyunu['Tiyatro_ucreti']; ?>" readonly>
            </div>
<input type="hidden" id="Musteri_id" name="Musteri_id" value="<?php echo $tiyatro_oyunu['Musteri_id']; ?>"
            <button type="submit" class="btn btn-success">Bilet Satın Al</button>
        </form>
        <?php
    } else {
        echo "Geçerli bir tiyatro oyunu belirtilmedi.";
    }
    ?>
</div>

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

PHP (process_bilet.php):

<?php
require_once 'db_connection.php';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Formdan gelen verileri al
    $tiyatro_id = $_POST['tiyatro_id'];
    $koltuk_numarasi = $_POST['koltuk_numarasi'];
    $Musteri_id= $_POST['Musteri_id'];

    try {
        // Satilanlar tablosuna ekleme işlemi
        $sql = "INSERT INTO Sepet_gecici (Tiyatro_id, Koltuk_numarasi, Musteri_id) 
                VALUES (:tiyatro_id, :koltuk_numarasi, :Musteri_id)";
        
        // PDO prepare ve execute kullanımı
        $stmt = $conn->prepare($sql);
        $stmt->bindParam(':tiyatro_id', $tiyatro_id);
        $stmt->bindParam(':koltuk_numarasi', $koltuk_numarasi);
        $stmt->bindParam(':Musteri_id', $musteri["Musteri_id"]);

        // Sorguyu çalıştır
        $stmt->execute();

        echo "Bilet başarıyla satın alındı.";
    } catch (PDOException $e) {
        echo "Hata: " . $e->getMessage();
    }
}
?>

Bu örnekte, bilet_satin_al.php sayfasında belirtilen tiyatro oyunu için bilet satın alma formunu oluşturduk ve ilgili bilgileri görüntüledik. Kullanıcı sadece koltuk numarasını girebilecektir. Bilet satın alındığında, process_bilet.php sayfası bilet bilgilerini Sepet_gecici tablosuna ekleyecektir. Gecici bolumdur, satin alinmak icin eklenen ve henuz satin alinmayan oyunlar burda kullanici id sine gore kaydedilir. Sonraki islem biletleri satin alma bolumudur. Hadi sepete gidelim.

HTML (sepet.php):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sepet</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div class="container mt-5">
    <h2>Sepet</h2>
    <?php
    require_once 'db_connection.php';

    if (isset($_SESSION['musteri_id'])) {
        $musteri_id = $_SESSION['musteri_id'];

        try {
            // Sepet_gecici tablosundaki belirli müşteri_id'ye sahip kayıtları al
            $sql = "SELECT sg.Koltuk_numarasi, tov.Tiyatro_basligi, tov.Tiyatro_aciklamasi, tov.Tiyatro_zamani,
                           tov.Tiyatro_resmi, sg.seans_saati, sg.salon, sg.tarih, sg.aciklama, sg.Ucret
                    FROM Sepet_gecici sg
                    JOIN Tiyatro_Oyunlari tov ON sg.Tiyatro_id = tov.Tiyatro_id
                    WHERE sg.Musteri_id = :musteri_id";
            $stmt = $conn->prepare($sql);
            $stmt->bindParam(':musteri_id', $musteri_id);
            $stmt->execute();
            $sepet_kayitlari = $stmt->fetchAll(PDO::FETCH_ASSOC);

            if ($stmt->rowCount() > 0) {
                ?>
                <table class="table">
                    <thead>
                    <tr>
                        <th>Tiyatro Adı</th>
                        <th>Açıklama</th>
                        <th>Tarih</th>
                        <th>Resim</th>
                        <th>Seans Saati</th>
                        <th>Salon</th>
                        <th>Ücret</th>
                        <th>Koltuk Numarası</th>
                    </tr>
                    </thead>
                    <tbody>
                    <?php
                    $toplam_fiyat = 0;

                    foreach ($sepet_kayitlari as $sepet_kaydi) {
                        echo "<tr>";
                        echo "<td>{$sepet_kaydi['Tiyatro_basligi']}</td>";
                        echo "<td>{$sepet_kaydi['Tiyatro_aciklamasi']}</td>";
                        echo "<td>{$sepet_kaydi['Tiyatro_zamani']}</td>";
                        echo "<td><img src='{$sepet_kaydi['Tiyatro_resmi']}' alt='Tiyatro Resmi' style='max-width: 100px;'></td>";
                        echo "<td>{$sepet_kaydi['seans_saati']}</td>";
                        echo "<td>{$sepet_kaydi['salon']}</td>";
                        echo "<td>{$sepet_kaydi['Ucret']}</td>";
                        echo "<td>{$sepet_kaydi['Koltuk_numarasi']}</td>";
                        echo "</tr>";

                        $toplam_fiyat += floatval($sepet_kaydi['Ucret']);
                    }
                    ?>
                    </tbody>
                </table>

                <div class="alert alert-info">
                    <strong>Toplam Fiyat:</strong> <?php echo $toplam_fiyat; ?> TL
                </div>

                <form action="process_odeme.php" method="POST">
                    <button type="submit" class="btn btn-success">Ödeme Yap</button>
                </form>
                <?php
            } else {
                echo "<p>Sepetiniz boş.</p>";
            }
        } catch (PDOException $e) {
            echo "Hata: " . $e->getMessage();
        }
    } else {
        echo "Oturum hatası. Lütfen giriş yapın.";
    }
    ?>
</div>

<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

Bu versiyonda, Tiyatro_Oyunlari tablosu ile Sepet_gecici tablosu arasında bir JOIN işlemi gerçekleştirilmiştir. Böylece Tiyatro_Oyunlari tablosundan gelen diğer bilgiler de eklendi.

PHP (process_odeme.php):

<?php
require_once 'db_connection.php';

session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_SESSION['musteri_id'])) {
        $musteri_id = $_SESSION['musteri_id'];

        try {
            // Sepet_gecici tablosundaki belirli müşteri_id'ye sahip kayıtları al
            $sql_select = "SELECT * FROM Sepet_gecici WHERE Musteri_id = :musteri_id";
            $stmt_select = $conn->prepare($sql_select);
            $stmt_select->bindParam(':musteri_id', $musteri_id);
            $stmt_select->execute();
            $sepet_kayitlari = $stmt_select->fetchAll(PDO::FETCH_ASSOC);

            foreach ($sepet_kayitlari as $sepet_kaydi) {
                // Satilanlar tablosuna ekleme işlemi
                $sql_insert = "INSERT INTO Satilanlar (Tiyatro_id, Musteri_id, Koltuk_numarasi, seans_saati, salon, tarih, aciklama, Ucret) 
                               VALUES (:tiyatro_id, :musteri_id, :koltuk_numarasi, :seans_saati, :salon, :tarih, :aciklama, :ucret)";
                
                // PDO prepare ve execute kullanımı
                $stmt_insert = $conn->prepare($sql_insert);
                $stmt_insert->bindParam(':tiyatro_id', $sepet_kaydi['Tiyatro_id']);
                $stmt_insert->bindParam(':musteri_id', $musteri_id);
                $stmt_insert->bindParam(':koltuk_numarasi', $sepet_kaydi['Koltuk_numarasi']);
                $stmt_insert->bindParam(':seans_saati', $sepet_kaydi['seans_saati']);
                $stmt_insert->bindParam(':salon', $sepet_kaydi['salon']);
                $stmt_insert->bindParam(':tarih', $sepet_kaydi['tarih']);
                $stmt_insert->bindParam(':aciklama', $sepet_kaydi['aciklama']);
                $stmt_insert->bindParam(':ucret', $sepet_kaydi['Ucret']);

                // Sorguyu çalıştır
                $stmt_insert->execute();
            }

            // Sepet_gecici tablosundaki kayıtları sil
            $sql_delete = "DELETE FROM Sepet_gecici WHERE Musteri_id = :musteri_id";
            $stmt_delete = $conn->prepare($sql_delete);
            $stmt_delete->bindParam(':musteri_id', $musteri_id);
            $stmt_delete->execute();

            echo "Ödeme başarıyla tamamlandı.";
        } catch (PDOException $e) {
            echo "Hata: " . $e->getMessage();
        }
    } else {
        echo "Oturum hatası. Lütfen giriş yapın.";
    }
}
?>

Bu düzeltilmiş versiyonda, process_odeme.php dosyası içinde, Sepet_gecici tablosundaki bilgilerin Satilanlar tablosuna eklenmesi ve ardından Sepet_gecici tablosundan ilgili kayıtların silinmesi işlemleri yapılmıştır.


Sanirim bu kadar yardim baslamak icin yeterli olacaktir. Para ustu kisimlarini anlamadim, ama bu asamadan sonra basit olacaktir. Sirayla ilerlerseniz halledebilirsiniz. Takildiginiz yerde yada problemde buradan yazarsaniz yardimci olurum gun icerisinde.

1 Beğeni