İstanbul üniversitesi - Cerrahpaşa Hasan Ali Yücel eğitim fakültesi - bilgisayar ve öğretim teknolojileri eğitimi bölümü web Tabanlı Programlama Dersi Final Sınavı (11.01.2024)

İstanbul üniversitesi - cerrahpaşa
hasan ali yücel eğitim fakültesi
bilgisayar ve öğretim teknolojileri eğitimi bölümü
web tabanlı programlama dersi final sınavı (11.01.2024)

YÖNERGE
Kendi isminizle bir klasör açınız ve bütün sayfaları açmış olduğunuz klasörün içine kaydediniz. Daha sonra klasörü arşivleyerek tek bir dosya olarak teslim ediniz. Veritabanını klasör içine eklemeyi unutmayınız. Her sorunun puanı karşısında yazmaktadır. Sınav süresi 120 dakikadır.

Html sayfalar, formlar ve tablolar Bootsrap kullanılarak yapılacaktır.
PHP kodlarının içerisine html kodu yazılmayacaktır.
Çalışmayan kod değerlendirilmeye alınmayacaktır.
Veritabanı export edilip kodlar ile birlikte teslim edilecektir.

SORU
Sizden kitap 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. Kitap ekleme, listeleme işlemleri yapılacaktır. (kitap adı, yazarı, fiyatı, yayın yılı). (15 Puan)
  2. Her kitap için, kullanıcının bu kitabı sepete eklemesini sağlayacak bir “Sepete Ekle” butonu koyulacak. Aşağıdaki işlemler veritabanına kaydedilecek.
    a. Butona tıklanınca sepete tek tek ekleme yapılabilecek (5 Puan)
    b. Sepete toplu/birden fazla ekleme aynı anda yapılabilecek. (15 Puan)
    c. Sepete eklenen kitaplar ayrı bir sayfada listelenebilecek. (10 Puan)
    d. Sepetteki kitapların toplam fiyatı hesaplanacak. (10 Puan)
  3. Sepetteki kitapları satın alma işlemi yapılacak. (15 Puan)
    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
  4. 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. (10 Puan)
  5. Yukarıdaki işlemler tek sayfada yapılacaktır. (20 Puan)

BAŞARILAR

Veritabanı Modeli:
Tablo Adı: kitaplar
Sütunlar:

  • id: int (Primary Key, Otomatik Artan)

  • kitap_adi: varchar(255)

  • yazar: varchar(255)

  • fiyat: decimal(10,2)

  • yayin_yili: int

  • id | kitap_adi | yazar | fiyat | yayin_yili |

Tablo Adı: sepet
Sütunlar:

  • id: int (Primary Key, Otomatik Artan)

  • kitap_id: int (kitaplar tablosuna ait foreign key)

  • miktar: int

  • id | kitap_id | miktar |

Tablo Adı: satin_alma
Sütunlar:

  • id: int (Primary Key, Otomatik Artan)

  • toplam_fiyat: decimal(10,2)

  • para: int (verilen para miktarı)

  • id | toplam_fiyat | para |

Veritabanı bağlantısı için config.php dosyası oluşturulmalıdır:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
?>

index.php dosyasına aşağıdaki kodlar eklenmelidir:

<!DOCTYPE html>
<html>
<head>
	<title>Kitap Satışı Otomasyonu</title>
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
	<div class="container">
		<h1>Kitap Satışı Otomasyonu</h1>
		<div class="row">
			<div class="col-md-6">
				<h3>Kitaplar</h3>
				<table class="table">
					<thead>
						<tr>
							<th>Kitap Adı</th>
							<th>Yazarı</th>
							<th>Fiyatı</th>
							<th>Yayın Yılı</th>
							<th></th>
						</tr>
					</thead>
					<tbody>
						<!-- Kitap verilerini burada listele -->
					</tbody>
				</table>
			</div>
			<div class="col-md-6">
				<h3>Sepet</h3>
				<table class="table">
					<thead>
						<tr>
							<th>Kitap Adı</th>
							<th>Miktar</th>
						</tr>
					</thead>
					<tbody>
						<!-- Sepet verilerini burada listele -->
					</tbody>
				</table>
				<p>Toplam Fiyat: <span id="toplam_fiyat">0</span></p>
			</div>
		</div>
		<hr>
		<h3>Para Üstü</h3>
		<p>Sepetteki Toplam Tutar: <span id="sepet_toplam_fiyat">0</span></p>
		<input type="number" id="verilen_para" placeholder="Verilen Para">
		<button onclick="hesaplaParaUstu()">Para Üstü Hesapla</button>
		<p id="para_ustu">Para Üstü: </p>
	</div>

	<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
	<script>
		// Kitapları ve sepeti listeleme
		$(document).ready(function(){
			$.ajax({
				url: "get_data.php",
				method: "POST",
				success: function(data){
					$('tbody').html(data);
				}
			});
		});

		// Sepete ekleme
		function sepeteEkle(kitapId){
			$.ajax({
				url: "sepete_ekle.php",
				method: "POST",
				data: { kitap_id : kitapId },
				success: function(data){
					$('tbody').html(data);
					$.ajax({
						url: "sepet_toplam_fiyat.php",
						method: "POST",
						success: function(data){
							$('#toplam_fiyat').html(data);
						}
					});
				}
			});
		}

		// Para Üstü Hesaplama
		function hesaplaParaUstu(){
			var sepetToplamFiyat = $('#toplam_fiyat').text();
			var verilenPara = $('#verilen_para').val();

			$.ajax({
				url: "para_ustu_hesapla.php",
				method: "POST",
				data: { sepet_toplam_fiyat : sepetToplamFiyat, verilen_para : verilenPara },
				success: function(data){
					$('#para_ustu').text("Para Üstü: " + data);
				}
			});
		}
	</script>
</body>
</html>

get_data.php dosyasına aşağıdaki kodlar eklenmelidir:

<?php
include 'config.php';

$query = "SELECT * FROM kitaplar";
$result = $conn->query($query);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>".$row['kitap_adi']."</td>";
        echo "<td>".$row['yazar']."</td>";
        echo "<td>".$row['fiyat']."</td>";
        echo "<td>".$row['yayin_yili']."</td>";
        echo "<td><button onclick='sepeteEkle(".$row['id'].")'>Sepete Ekle</button></td>";
        echo "</tr>";
    }
}

$conn->close();
?>

sepete_ekle.php dosyasına aşağıdaki kodlar eklenmelidir:

<?php
include 'config.php';

$kitapId = $_POST['kitap_id'];

$query = "SELECT * FROM sepet WHERE kitap_id = '$kitapId'";
$result = $conn->query($query);

if ($result->num_rows > 0) {
    $query = "UPDATE sepet SET miktar = miktar + 1 WHERE kitap_id = '$kitapId'";
    $conn->query($query);
} else {
    $query = "INSERT INTO sepet (kitap_id, miktar) VALUES ('$kitapId', 1)";
    $conn->query($query);
}

$query = "SELECT * FROM sepet INNER JOIN kitaplar ON sepet.kitap_id = kitaplar.id";
$result = $conn->query($query);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>".$row['kitap_adi']."</td>";
        echo "<td>".$row['miktar']."</td>";
        echo "</tr>";
    }
}

$conn->close();
?>

sepet_toplam_fiyat.php dosyasına aşağıdaki kodlar eklenmelidir:

<?php
include 'config.php';

$query = "SELECT SUM(fiyat) AS toplam_fiyat FROM kitaplar INNER JOIN sepet ON kitaplar.id = sepet.kitap_id";
$result = $conn->query($query);
$row = $result->fetch_assoc();

echo $row['toplam_fiyat'];

$conn->close();
?>

para_ustu_hesapla.php dosyasına aşağıdaki kodlar eklenmelidir:

<?php
$sepetToplamFiyat = $_POST['sepet_toplam_fiyat'];
$verilenPara = $_POST['verilen_para'];

$kasadakiParalar = array(200, 100, 50, 20, 10, 5, 1);

$paraUstu = $verilenPara - $sepetToplamFiyat;
$paraUstuParalar = array();

foreach ($kasadakiParalar as $para) {
    if ($paraUstu >= $para) {
        $adet = floor($paraUstu / $para);
        $paraUstuParalar[$para] = $adet;
        $paraUstu -= $adet * $para;
    }
}

$result = "";
foreach ($paraUstuParalar as $para => $adet) {
    $result .= $adet." adet ".$para." TL, ";
}

echo rtrim($result, ", ");

$conn->close();
?>

Veritabanı Modeli:

Tablo: books

  • id (int) (PK)
  • book_name (varchar)
  • author (varchar)
  • price (decimal(10,2))
  • publication_year (int)

Tablo: cart_items

  • id (int) (PK)
  • book_id (int)
  • quantity (int)

Tablo: transactions

  • id (int) (PK)
  • total_price (decimal(10,2))
  • paid_amount (decimal(10,2))
  • change_amount (decimal(10,2))

Tablo: coins

  • id (int) (PK)
  • coin_value (decimal(10,2))
  • quantity (int)

MYSQL İmport Sorguları:


CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `book_name` varchar(255) NOT NULL,
  `author` varchar(255) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  `publication_year` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `cart_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `book_id` int(11) NOT NULL,
  `quantity` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `transactions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `total_price` decimal(10,2) NOT NULL,
  `paid_amount` decimal(10,2) NOT NULL,
  `change_amount` decimal(10,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `coins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `coin_value` decimal(10,2) NOT NULL,
  `quantity` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

HTML kodu (index.html):


<!DOCTYPE html>
<html>
<head>
    <title>Kitap Satış Otomasyonu</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h2>Kitap Satış Otomasyonu</h2>
        
        <h3>Tüm Kitaplar</h3>
        <table class="table">
            <thead>
                <tr>
                    <th>Kitap Adı</th>
                    <th>Yazarı</th>
                    <th>Fiyatı</th>
                    <th>Yayın Yılı</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <!-- PHP kodları ile kitapların listesi gelecek -->
            </tbody>
        </table>
        
        <h3>Sepet</h3>
        <table class="table">
            <thead>
                <tr>
                    <th>Kitap Adı</th>
                    <th>Fiyatı</th>
                    <th>Adet</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <!-- PHP kodları ile sepetteki kitapların listesi gelecek -->
            </tbody>
        </table>
        
        <h3>Sepet Özeti</h3>
        <p>Toplam Fiyat: <!-- PHP kodları ile toplam fiyat gelecek --></p>
        
        <h3>Ödeme</h3>
        <form method="post" action="payment.php">
            <div class="form-group">
                <label for="amount">Alınan Tutar:</label>
                <input type="number" class="form-control" id="amount" name="amount">
            </div>
            <button type="submit" class="btn btn-primary">Ödeme Yap</button>
        </form>
        
    </div>
</body>
</html>

PHP kodları (config.php):


<?php

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database";

try {
  $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
  echo "Connection failed: " . $e->getMessage();
}

?>

PHP kodları (functions.php):

<?php

require_once('config.php');

function getBooks() {
    global $pdo;
    
    $stmt = $pdo->prepare("SELECT * FROM books");
    $stmt->execute();
    $books = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    return $books;
}

function getCartItems() {
    global $pdo;
    
    $stmt = $pdo->prepare("SELECT books.book_name, books.price, cart_items.quantity FROM books JOIN cart_items ON books.id = cart_items.book_id");
    $stmt->execute();
    $cartItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    return $cartItems;
}

function getTotalPrice() {
    global $pdo;
    
    $stmt = $pdo->prepare("SELECT SUM(books.price * cart_items.quantity) AS total FROM books JOIN cart_items ON books.id = cart_items.book_id");
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $total = $row['total'];
    
    return $total;
}

function getCoinQuantities() {
    global $pdo;
    
    $stmt = $pdo->prepare("SELECT coin_value, quantity FROM coins ORDER BY coin_value DESC");
    $stmt->execute();
    $coins = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    return $coins;
}

function addToCart($bookId, $quantity) {
    global $pdo;
    
    $stmt = $pdo->prepare("INSERT INTO cart_items (book_id, quantity) VALUES (:bookId, :quantity)");
    $stmt->bindParam(":bookId", $bookId);
    $stmt->bindParam(":quantity", $quantity);
    $stmt->execute();
}

function removeFromCart($itemId) {
    global $pdo;
    
    $stmt = $pdo->prepare("DELETE FROM cart_items WHERE id = :itemId");
    $stmt->bindParam(":itemId", $itemId);
    $stmt->execute();
}

function makePayment($amount) {
    global $pdo;
    $totalPrice = getTotalPrice();
    
    if ($amount >= $totalPrice) {
        $changeAmount = $amount - $totalPrice;
        
        $stmt = $pdo->prepare("INSERT INTO transactions (total_price, paid_amount, change_amount) VALUES (:total, :paid, :change)");
        $stmt->bindParam(":total", $totalPrice);
        $stmt->bindParam(":paid", $amount);
        $stmt->bindParam(":change", $changeAmount);
        $stmt->execute();
        
        $coins = getCoinQuantities();
        $coinQuantities = array();
        foreach ($coins as $coin) {
            $coinValue = $coin['coin_value'];
            $quantity = floor($changeAmount / $coinValue);
            if ($quantity > $coin['quantity']) {
                $quantity = $coin['quantity'];
            }
            $coinQuantities[$coinValue] = $quantity;
            $changeAmount -= $quantity * $coinValue;
        }
        
        $updateStmt = $pdo->prepare("UPDATE coins SET quantity = :quantity WHERE coin_value = :coinValue");
        foreach ($coinQuantities as $coinValue => $quantity) {
            $updateStmt->bindParam(":quantity", $quantity);
            $updateStmt->bindParam(":coinValue", $coinValue);
            $updateStmt->execute();
        }
        
        return true;
    } else {
        return false;
    }
}

?>

PHP kodları (index.php):

<?php

require_once('functions.php');

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (isset($_POST['add-to-cart'])) {
        $bookId = $_POST['book-id'];
        $quantity = $_POST['quantity'];
        addToCart($bookId, $quantity);
    } else if (isset($_POST['remove-from-cart'])) {
        $itemId = $_POST['item-id'];
        removeFromCart($itemId);
    }
}

$books = getBooks();
$cartItems = getCartItems();
$totalPrice = getTotalPrice();

?>

<!DOCTYPE html>
<html>
<head>
    <title>Kitap Satış Otomasyonu</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h2>Kitap Satış Otomasyonu</h2>
        
        <h3>Tüm Kitaplar</h3>
        <table class="table">
            <thead>
                <tr>
                    <th>Kitap Adı</th>
                    <th>Yazarı</th>
                    <th>Fiyatı</th>
                    <th>Yayın Yılı</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <?php foreach($books as $book): ?>
                    <tr>
                        <td><?php echo $book['book_name']; ?></td>
                        <td><?php echo $book['author']; ?></td>
                        <td><?php echo $book['price']; ?></td>
                        <td><?php echo $book['publication_year']; ?></td>
                        <td>
                            <form method="post" action="index.php">
                                <input type="hidden" name="book-id" value="<?php echo $book['id']; ?>">
                                <div class="form-group">
                                    <input type="number" class="form-control" name="quantity" value="1">
                                </div>
                                <button type="submit" class="btn btn-primary" name="add-to-cart">Sepete Ekle</button>
                            </form>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        
        <h3>Sepet</h3>
        <table class="table">
            <thead>
                <tr>
                    <th>Kitap Adı</th>
                    <th>Fiyatı</th>
                    <th>Adet</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <?php foreach($cartItems as $item): ?>
                    <tr>
                        <td><?php echo $item['book_name']; ?></td>
                        <td><?php echo $item['price']; ?></td>
                        <td><?php echo $item['quantity']; ?></td>
                        <td>
                            <form method="post" action="index.php">
                                <input type="hidden" name="item-id" value="<?php echo $item['id']; ?>">
                                <button type="submit" class="btn btn-danger" name="remove-from-cart">Sepetten Çıkar</button>
                            </form>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        
        <h3>Sepet Özeti</h3>
        <p>Toplam Fiyat: <?php echo $totalPrice; ?></p>
        
        <h3>Ödeme</h3>
        <form method="post" action="payment.php">
            <div class="form-group">
                <label for="amount">Alınan Tutar:</label>
                <input type="number" class="form-control" id="amount" name="amount">
            </div>
            <button type="submit" class="btn btn-primary">Ödeme Yap</button>
        </form>
        
    </div>
</body>
</html>

PHP kodları (payment.php):

<?php

require_once('functions.php');

if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['amount'])) {
    $amount = $_POST['amount'];
    $paymentSuccess = makePayment($amount);
}

$coins = getCoinQuantities();

?>

<!DOCTYPE html>
<html>
<head>
    <title>Kitap Satış Otomasyonu - Ödeme</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h2>Ödeme</h2>
        
        <?php if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['amount'])): ?>
            <?php if ($paymentSuccess): ?>
                <div class="alert alert-success">
                    Ödeme işlemi başarılı. Para üstü hesaplandı.
                </div>
                
                <h3>Para Üstü</h3>
                <ul>
                    <?php foreach ($coins as $coin): ?>
                        <?php if ($coin['quantity'] > 0): ?>
                            <?php 
                                $quantity = floor($changeAmount / $coin['coin_value']);
                                if ($quantity > $coin['quantity']) {
                                    $quantity = $coin['quantity'];
                                }
                                $changeAmount -= $quantity * $coin['coin_value'];
                            ?>
                            <li><?php echo $coin['coin_value']; ?> TL: <?php echo $quantity; ?> adet</li>
                        <?php endif; ?>
                    <?php endforeach; ?>
                </ul>
                
            <?php else: ?>
                <div class="alert alert-danger">
                    Ödeme işlemi başarısız. Yetersiz ödeme tutarı.
                </div>
            <?php endif; ?>
        <?php endif; ?>
        
        <h3>Kasa</h3>
        <table class="table">
            <thead>
                <tr>
                    <th>TL</th>
                    <th>Adet</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($coins as $coin): ?>
                    <tr>
                        <td><?php echo $coin['coin_value']; ?></td>
                        <td><?php echo $coin['quantity']; ?></td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        
        <?php if (!isset($_POST['amount'])): ?>
            <form method="post" action="payment.php">
                <div class="form-group">
                    <label for="amount">Alınan Tutar:</label>
                    <input type="number" class="form-control" id="amount" name="amount">
                </div>
                <button type="submit" class="btn btn-primary">Ödeme Yap</button>
            </form>
        <?php endif; ?>
        
    </div>
</body>
</html>

Verilen soruda istenenler doğrultusunda bir otomasyon sistemi yapacağım. İlk olarak veritabanı modelini oluşturmalıyım. Veritabanımızda aşağıdaki tablolar bulunacak:

  1. Kitaplar Tablosu:
  • id: int, primary key, otomatik artan
  • kitap_adi: varchar(255)
  • yazar: varchar(255)
  • fiyat: float
  • yayin_yili: int
  1. Sepet Tablosu:
  • id: int, primary key, otomatik artan
  • kitap_id: int (kitaplar tablosundaki id ile ilişkili)
  • adet: int
  1. Kasadaki Paralar Tablosu:
  • id: int, primary key, otomatik artan
  • para_degeri: int
  1. Para Üstü Tablosu:
  • id: int, primary key, otomatik artan
  • adet: int
  • para_degeri: int
  1. İşlem Geçmişi Tablosu:
  • id: int, primary key, otomatik artan
  • islem_tarihi: date
  • para: float
  • kitaplar: varchar(255)

Bir sonraki adım, HTML sayfası tasarlamak olacak. Bunun için Bootstrap kullanacağım. Sizden de bu HTML kodunu kullanarak PHP ve JavaScript kodlarını tamamlamanızı isteyeceğim.

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kitap Satış Otomasyonu</title>
    <!-- CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <!-- JavaScript -->
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <!-- Custom JavaScript -->
    <script src="script.js"></script>
</head>
<body>
    <div class="container mt-5">
        <h1 class="text-center">Kitap Satış Otomasyonu</h1>
        
        <!-- Kitap Ekleme -->
        <div id="kitap-ekleme">
            <h2 class="mt-5">Kitap Ekleme</h2>
            <form id="kitap-ekle-form" action="php/kaydet.php" method="POST">
                <div class="form-row">
                    <div class="form-group col-md-6">
                        <label for="kitap-adi">Kitap Adı</label>
                        <input type="text" class="form-control" id="kitap-adi" name="kitap_adi">
                    </div>
                    <div class="form-group col-md-6">
                        <label for="yazar">Yazar</label>
                        <input type="text" class="form-control" id="yazar" name="yazar">
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-md-6">
                        <label for="fiyat">Fiyat</label>
                        <input type="number" step="0.01" min="0" class="form-control" id="fiyat" name="fiyat">
                    </div>
                    <div class="form-group col-md-6">
                        <label for="yayin-yili">Yayın Yılı</label>
                        <input type="number" min="0" class="form-control" id="yayin-yili" name="yayin_yili">
                    </div>
                </div>
                <button type="submit" class="btn btn-primary">Kitap Ekle</button>
            </form>
        </div>
        
        <!-- Kitap Listeleme -->
        <div id="kitap-listeleme" class="mt-5">
            <h2>Kitap Listeleme</h2>
            <table class="table">
                <thead>
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">Kitap Adı</th>
                        <th scope="col">Yazar</th>
                        <th scope="col">Fiyat</th>
                        <th scope="col">Yayın Yılı</th>
                        <th scope="col">İşlemler</th>
                    </tr>
                </thead>
                <tbody id="kitaplar-tablosu">
                    <!-- Ajax ile kitaplar dinamik olarak buraya gelecek -->
                </tbody>
            </table>
        </div>
        
        <!-- Sepet İşlemleri -->
        <div id="sepet-islemleri" class="mt-5">
            <h2>Sepet İşlemleri</h2>
            <div id="sepet-listeleme"></div>
            <div>
                <button id="sepet-temizle" class="btn btn-danger">Sepeti Temizle</button>
                <button id="sepet-satin-al" class="btn btn-success">Sepeti Satın Al</button>
            </div>
            <h3 class="mt-5">Para Üstü</h3>
            <form id="para-ustu-form" action="php/paraustu.php" method="POST">
                <div class="form-group">
                    <label for="alinan-para">Alınan Para:</label>
                    <input type="number" step="0.01" min="0" class="form-control" id="alinan-para" name="alinan_para">
                </div>
                <button type="submit" class="btn btn-primary">Para Üstü Hesapla</button>
            </form>
            <div id="para-ustu-sonuc" class="mt-3"></div>
        </div>
    </div>
</body>
</html>

JavaScript kodları için script.js dosyası oluşturacağım:

$(document).ready(function() {
    // Kitapları listele
    $.ajax({
        url: "php/listele.php",
        method: "GET",
        success: function(response) {
            $("#kitaplar-tablosu").html(response);
        }
    });

    // Kitap ekleme formuna submit olduğunda
    $("#kitap-ekle-form").submit(function(event) {
        event.preventDefault();
        
        var kitap_adi = $("#kitap-adi").val();
        var yazar = $("#yazar").val();
        var fiyat = $("#fiyat").val();
        var yayin_yili = $("#yayin-yili").val();

        $.ajax({
            url: $(this).attr("action"),
            method: $(this).attr("method"),
            data: {
                kitap_adi: kitap_adi,
                yazar: yazar,
                fiyat: fiyat,
                yayin_yili: yayin_yili
            },
            success: function(response) {
                // Kitap eklendikten sonra formu temizle
                $("#kitap-ekle-form")[0].reset();
                // Kitap listesini güncelle
                $.ajax({
                    url: "php/listele.php",
                    method: "GET",
                    success: function(response) {
                        $("#kitaplar-tablosu").html(response);
                    }
                });
            }
        });
    });

    // Sepete ekleme işlemi
    $(document).on("click", ".sepete-ekle", function() {
        var kitap_id = $(this).attr("data-kitap-id");

        $.ajax({
            url: "php/sepeteekle.php",
            method: "POST",
            data: { kitap_id: kitap_id },
            success: function(response) {
                $("#sepet-listeleme").html(response);
            }
        });
    });

    // Sepet temizleme işlemi
    $(document).on("click", "#sepet-temizle", function() {
        $.ajax({
            url: "php/sepettemizle.php",
            method: "GET",
            success: function() {
                $("#sepet-listeleme").html("");
            }
        });
    });

    // Satın alma işlemi
    $(document).on("click", "#sepet-satin-al", function() {
        $.ajax({
            url: "php/satinal.php",
            method: "GET",
            success: function(response) {
                $("#sepet-listeleme").html("");
                alert(response);
            }
        });
    });

    // Para Üstü Hesaplama
    $("#para-ustu-form").submit(function(event) {
        event.preventDefault();

        var alinan_para = $("#alinan-para").val();
        var toplam_tutar = 0;

        $(".fiyat").each(function() {
            toplam_tutar += parseFloat($(this).text());
        });

        $.ajax({
            url: $(this).attr("action"),
            method: $(this).attr("method"),
            data: {
                alinan_para: alinan_para,
                toplam_tutar: toplam_tutar
            },
            success: function(response) {
                $("#para-ustu-sonuc").html(response);
            }
        });
    });
});

PHP kodları için php/kaydet.php dosyasında kitap ekleme işlemini yapacağım:

<?php
include_once "config.php";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    try {
        $kitap_adi = $_POST["kitap_adi"];
        $yazar = $_POST["yazar"];
        $fiyat = $_POST["fiyat"];
        $yayin_yili = $_POST["yayin_yili"];
        
        $stmt = $conn->prepare("INSERT INTO kitaplar (kitap_adi, yazar, fiyat, yayin_yili) VALUES (:kitap_adi, :yazar, :fiyat, :yayin_yili)");
        $stmt->bindParam(":kitap_adi", $kitap_adi);
        $stmt->bindParam(":yazar", $yazar);
        $stmt->bindParam(":fiyat", $fiyat);
        $stmt->bindParam(":yayin_yili", $yayin_yili);
        $stmt->execute();
        echo "Kitap eklendi.";
    } catch (PDOException $e) {
        echo "Kitap eklenirken bir hata oluştu: " . $e->getMessage();
    }
}
?>

php/listele.php dosyasında kitapları listeleme işlemini yapacağım:

<?php
include_once "config.php";

try {
    $stmt = $conn->prepare("SELECT * FROM kitaplar");
    $stmt->execute();
    $kitaplar = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($kitaplar as $row) {
        echo "<tr>";
        echo "<th scope='row'>" . $row['id'] . "</th>";
        echo "<td>" . $row['kitap_adi'] . "</td>";
        echo "<td>" . $row['yazar'] . "</td>";
        echo "<td class='fiyat'>" . $row['fiyat'] . "</td>";
        echo "<td>" . $row['yayin_yili'] . "</td>";
        echo "<td><button class='btn btn-primary sepete-ekle' data-kitap-id='" . $row['id'] . "'>Sepete Ekle</button></td>";
        echo "</tr>";
    }
} catch (PDOException $e) {
    echo "Kitaplar listelenirken bir hata oluştu: " . $e->getMessage();
}
?>

php/sepeteekle.php dosyasında sepete ekleme işlemini yapacağım:

<?php
session_start();
include_once "config.php";

if (isset($_POST["kitap_id"])) {
    $kitap_id = $_POST["kitap_id"];
    if (isset($_SESSION["sepet"])) {
        $sepet = $_SESSION["sepet"];
        if (array_key_exists($kitap_id, $sepet)) {
            $sepet[$kitap_id]++;
        } else {
            $sepet[$kitap_id] = 1;
        }
    } else {
        $sepet = array($kitap_id => 1);
    }
    $_SESSION["sepet"] = $sepet;
}

try {
    $sepet_listesi = "";
    $toplam_fiyat = 0;

    foreach ($sepet as $kitap_id => $adet) {
        $stmt = $conn->prepare("SELECT * FROM kitaplar WHERE id = :id");
        $stmt->bindParam(":id", $kitap_id);
        $stmt->execute();
        $kitap = $stmt->fetch(PDO::FETCH_ASSOC);

        $sepet_listesi .= "<p>" . $kitap["kitap_adi"] . " - " . $kitap["fiyat"] . " TL - Adet: " . $adet . "</p>";
        $toplam_fiyat += $kitap["fiyat"] * $adet;
    }

    echo $sepet_listesi;
} catch (PDOException $e) {
    echo "Sepet bilgileri getirilirken bir hata oluştu: " . $e->getMessage();
}
?>

php/sepettemizle.php dosyasında sepeti temizleme işlemini yapacağım:

<?php
session_start();

if (isset($_SESSION["sepet"])) {
    unset($_SESSION["sepet"]);
}
?>

php/satinal.php dosyasında satın alma işlemini yapacağım:

<?php
session_start();
include_once "config.php";

if (isset($_SESSION["sepet"])) {
    $sepet = $_SESSION["sepet"];

    $kitaplar_str = "";
    $toplam_fiyat = 0;

    foreach ($sepet as $kitap_id => $adet) {
        $stmt = $conn->prepare("SELECT * FROM kitaplar WHERE id = :id");
        $stmt->bindParam(":id", $kitap_id);
        $stmt->execute();
        $kitap = $stmt->fetch(PDO::FETCH_ASSOC);

        $kitaplar_str .= $kitap["kitap_adi"] . " - " . $kitap["fiyat"] . " TL - Adet: " . $adet . ", ";

        $toplam_fiyat += $kitap["fiyat"] * $adet;
    }

    try {
        $stmt = $conn->prepare("INSERT INTO islem_gecmisi (islem_tarihi, para, kitaplar) VALUES (NOW(), :para, :kitaplar)");
        $stmt->bindParam(":para", $toplam_fiyat);
        $stmt->bindParam(":kitaplar", $kitaplar_str);
        $stmt->execute();

        unset($_SESSION["sepet"]);

        echo "Satış işlemi tamamlandı.";
    } catch (PDOException $e) {
        echo "Satış işlemi sırasında bir hata oluştu: " . $e->getMessage();
    }
}
?>

php/paraustu.php dosyasında para üstü hesaplama işlemini yapacağım:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $alinan_para = $_POST["alinan_para"];
    $toplam_tutar = $_POST["toplam_tutar"];

    $paralar = array(200, 100, 50, 20, 10, 5, 1);
    $para_ustu = array();

    $kalan_para = $alinan_para - $toplam_tutar;

    foreach ($paralar as $para) {
        $adet = floor($kalan_para / $para);
        if ($adet > 0) {
            $para_ustu[] = array("adet" => $adet, "para_degeri" => $para);
            $kalan_para -= $adet * $para;
        }
    }

    echo "<p>Para Üstü:</p>";
    foreach ($para_ustu as $item) {
        echo $item["adet"] . " adet " . $item["para_degeri"] . " TL<br>";
    }
}
?>

Son olarak, tüm PHP kodlarının bulunduğu dosyaya config.php adını vereceğim ve MySQL veritabanı bağlantısını ayarlamak için kullanacağım:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "kitap_satis_otomasyonu";

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "Veritabanı bağlantısı kurulamadı: " . $e->getMessage();
}
?>

Bu şekilde verilen soruya uygun bir otomasyon sistemi oluşturdum. HTML kodları, JavaScript kodları ve PHP kodlarını uygun dosyalara yerleştirerek çalıştırabilirsiniz.

config.php

<?php
    // Veritabanı bilgilerini burada tanımlayabilirsiniz
    $servername = "localhost";
    $username = "kullanici_adi";
    $password = "sifre";
    $dbname = "veritabani_adi";

    // Veritabanı bağlantısını oluştur
    $conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);

    // Hata mesajlarını göster
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>

index.php

<?php
    include "config.php";

    function kitapEkle($kitapAdi, $yazari, $fiyati, $yayinYili)
    {
        global $conn;

        $sql = "INSERT INTO kitaplar (kitap_adi, yazar, fiyat, yayin_yili)
                VALUES (:kitapAdi, :yazari, :fiyati, :yayinYili)";
        $stmt = $conn->prepare($sql);
        $stmt->bindParam(':kitapAdi', $kitapAdi, PDO::PARAM_STR);
        $stmt->bindParam(':yazari', $yazari, PDO::PARAM_STR);
        $stmt->bindParam(':fiyati', $fiyati, PDO::PARAM_STR);
        $stmt->bindParam(':yayinYili', $yayinYili, PDO::PARAM_STR);
        $stmt->execute();
    }

    function kitaplariListele()
    {
        global $conn;

        $sql = "SELECT * FROM kitaplar";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return $result;
    }

    function kitabiSepeteEkle($kitapId, $adet)
    {
        global $conn;

        $sql = "INSERT INTO sepet (kitap_id, adet) VALUES (:kitapId, :adet)";
        $stmt = $conn->prepare($sql);
        $stmt->bindParam(':kitapId', $kitapId, PDO::PARAM_INT);
        $stmt->bindParam(':adet', $adet, PDO::PARAM_INT);
        $stmt->execute();
    }

    function sepetiListele()
    {
        global $conn;

        $sql = "SELECT sepet.id, kitaplar.kitap_adi, kitaplar.yazar, kitaplar.fiyat, sepet.adet
                FROM sepet
                INNER JOIN kitaplar ON sepet.kitap_id = kitaplar.id";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return $result;
    }

    function sepetiBosalt()
    {
        global $conn;

        $sql = "DELETE FROM sepet";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
    }

    function toplamFiyatHesapla()
    {
        global $conn;

        $sql = "SELECT SUM(kitaplar.fiyat * sepet.adet) AS toplam_fiyat
                FROM sepet
                INNER JOIN kitaplar ON sepet.kitap_id = kitaplar.id";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        return $result['toplam_fiyat'];
    }

    function paraUstuHesapla($verilenPara, $toplamTutar)
    {
        $paralar = [200, 100, 50, 20, 10, 5, 1];
        $paraUstu = [];
        $kalan = $verilenPara - $toplamTutar;

        foreach ($paralar as $para) {
            while ($kalan >= $para) {
                $kalan -= $para;
                if (!isset($paraUstu[$para])) {
                    $paraUstu[$para] = 0;
                }
                $paraUstu[$para]++;
            }
        }

        return $paraUstu;
    }

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        if (isset($_POST["kitapEkle"])) {
            $kitapAdi = $_POST["kitapAdi"];
            $yazari = $_POST["yazari"];
            $fiyati = $_POST["fiyati"];
            $yayinYili = $_POST["yayinYili"];
    
            kitapEkle($kitapAdi, $yazari, $fiyati, $yayinYili);
        }

        if (isset($_POST["kitabiSepeteEkle"])) {
            $kitapId = $_POST["kitapId"];
            $adet = $_POST["adet"];

            kitabiSepeteEkle($kitapId, $adet);
        }

        if (isset($_POST["sepetiBosalt"])) {
            sepetiBosalt();
        }
    }
?>

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kitap Satış Otomasyonu</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
</head>
<body>
    <div class="container mt-5">
        <h2 class="mb-4">Kitap Satış Otomasyonu</h2>

        <div class="row">
            <div class="col-md-6">
                <h4>Kitap Ekle</h4>
                <form method="POST">
                    <div class="form-group">
                        <label for="kitapAdi">Kitap Adı:</label>
                        <input type="text" class="form-control" id="kitapAdi" name="kitapAdi" required>
                    </div>
                    <div class="form-group">
                        <label for="yazari">Yazarı:</label>
                        <input type="text" class="form-control" id="yazari" name="yazari" required>
                    </div>
                    <div class="form-group">
                        <label for="fiyati">Fiyatı:</label>
                        <input type="number" class="form-control" id="fiyati" name="fiyati" required>
                    </div>
                    <div class="form-group">
                        <label for="yayinYili">Yayın Yılı:</label>
                        <input type="number" class="form-control" id="yayinYili" name="yayinYili" required>
                    </div>
                    <button type="submit" class="btn btn-primary" name="kitapEkle">Kitap Ekle</button>
                </form>
            </div>

            <div class="col-md-6">
                <h4>Kitaplar</h4>
                <table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Kitap Adı</th>
                            <th>Yazarı</th>
                            <th>Fiyatı</th>
                            <th>Yayın Yılı</th>
                            <th></th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                            $kitaplar = kitaplariListele();
                            foreach ($kitaplar as $kitap) {
                                echo "<tr>";
                                echo "<td>" . $kitap['kitap_adi'] . "</td>";
                                echo "<td>" . $kitap['yazar'] . "</td>";
                                echo "<td>" . $kitap['fiyat'] . "</td>";
                                echo "<td>" . $kitap['yayin_yili'] . "</td>";
                                echo '<td><form method="POST"><input type="hidden" name="kitapId" value="'.$kitap['id'].'"><input type="number" class="form-control d-inline-block" style="width: 100px;" name="adet" value="1" required><button type="submit" class="btn btn-success d-inline-block ml-2" name="kitabiSepeteEkle">Sepete Ekle</button></form></td>';
                                echo "</tr>";
                            }
                        ?>
                    </tbody>
                </table>
            </div>
        </div>

        <div class="row mt-5">
            <div class="col-md-6">
                <h4>Sepet</h4>
                <table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Kitap Adı</th>
                            <th>Yazarı</th>
                            <th>Fiyatı</th>
                            <th>Adet</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php
                            $sepet = sepetiListele();
                            foreach ($sepet as $item) {
                                echo "<tr>";
                                echo "<td>" . $item['kitap_adi'] . "</td>";
                                echo "<td>" . $item['yazar'] . "</td>";
                                echo "<td>" . $item['fiyat'] . "</td>";
                                echo "<td>" . $item['adet'] . "</td>";
                                echo "</tr>";
                            }
                        ?>
                        <tr>
                            <td colspan="4" class="text-right">
                                <form method="POST">
                                    <button type="submit" class="btn btn-danger" name="sepetiBosalt">Sepeti Boşalt</button>
                                </form>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>

            <div class="col-md-6">
                <h4>Ödeme</h4>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Verilen Para:</span>
                    </div>
                    <input type="number" class="form-control" id="verilenPara" name="verilenPara" required>
                    <div class="input-group-append">
                        <button class="btn btn-primary" type="button" id="paraUstuHesapla">Para Üstü Hesapla</button>
                    </div>
                </div>
                <div id="paraUstuSonuc"></div>
            </div>
        </div>
    </div>

    <script>
        $(document).ready(function() {
            $("#paraUstuHesapla").on("click", function() {
                var verilenPara = parseInt($("#verilenPara").val());
                var toplamTutar = parseInt(<?php echo toplamFiyatHesapla(); ?>);
                var paraUstu = <?php echo json_encode(paraUstuHesapla(0, 0)); ?>;

                $.ajax({
                    url: "ajax.php",
                    method: "POST",
                    data: {verilenPara: verilenPara, toplamTutar: toplamTutar},
                    dataType: "json",
                    success: function(result) {
                        paraUstu = result;
                        var paraUstuHTML = "Para Üstü: ";
                        for (var para in paraUstu) {
                            if (paraUstu[para] > 0) {
                                paraUstuHTML += paraUstu[para] + " adet " + para + " TL, ";
                            }
                        }
                        paraUstuHTML = paraUstuHTML.substring(0, paraUstuHTML.length - 2);
                        $("#paraUstuSonuc").html(paraUstuHTML);
                    }
                });
            });
        });
    </script>
</body>
</html>

ajax.php

<?php
    include "config.php";

    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        if (isset($_POST["verilenPara"]) && isset($_POST["toplamTutar"])) {
            $verilenPara = $_POST["verilenPara"];
            $toplamTutar = $_POST["toplamTutar"];

            $paraUstu = paraUstuHesapla($verilenPara, $toplamTutar);

            echo json_encode($paraUstu);
        }
    }
?>

kitaplar.sql

CREATE DATABASE IF NOT EXISTS kitapsatisi_db;

USE kitapsatisi_db;

CREATE TABLE IF NOT EXISTS kitaplar (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    kitap_adi VARCHAR(255) NOT NULL,
    yazar VARCHAR(255) NOT NULL,
    fiyat DECIMAL(10, 2) NOT NULL,
    yayin_yili INT(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS sepet (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    kitap_id INT(11) NOT NULL,
    adet INT(11) NOT NULL,
    FOREIGN KEY (kitap_id) REFERENCES kitaplar(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

NOTLAR:

  • Yukarıda verilen örnekte, veritabanı modelinde iki tablo (kitaplar ve sepet) kullanılmıştır.
  • index.php dosyasında kitap ekleme, listeleme, sepete ekleme ve sepeti görüntüleme işlemlerini gerçekleştiren fonksiyonlar ve form alanları bulunmaktadır.
  • ajax.php dosyası, para üstü hesaplama işlemini gerçekleştirmek için kullanılmaktadır. Bu dosyada gelen verileri kullanarak paraUstuHesapla fonksiyonunu çağırıp sonucu JSON formatında geri dönmektedir.
  • SQL sorgularını içeren kitaplar.sql dosyasını veritabanınızda çalıştırarak tabloları ve örnek verileri oluşturabilirsiniz.