# コード例
## ins_item.php
```
<?php
$user = 'root'; // データベースユーザ
$password = 'root';
$dbName = 'festival'; // 利用するデータベース
// MySQLサーバ
$host = 'localhost';
$port = 3306; // ポート番号を指定
// MySQLのDSN文字列
$dsn = "mysql:host={$host};port={$port};dbname={$dbName};charset=utf8";
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>商品登録</title>
</head>
<body>
<div>
<h2>商品登録</h2>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// POST データの受け取り
$itemName = $_POST['itemName'];
$itemPrice = $_POST['itemPrice'];
try {
// MySQLデータベースに接続する
$pdo = new PDO($dsn, $user, $password);
// プリペアドステートメントのエミュレーションを無効にする
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// 例外がスローされる設定にする
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 商品をデータベースに挿入
$sql = "INSERT INTO item (i_name, i_price) VALUES (:itemName, :itemPrice)";
$stm = $pdo->prepare($sql);
$stm->bindParam(':itemName', $itemName, PDO::PARAM_STR);
$stm->bindParam(':itemPrice', $itemPrice, PDO::PARAM_INT);
$stm->execute();
echo "商品が正常に登録されました。";
} catch (Exception $e) {
echo '<span class="error">エラーがありました。</span><br>';
echo $e->getMessage();
} finally {
// 例外に関係なく実行される処理
$pdo = null; // db close
}
}
?>
<br>
<a href="dsp_item.php">商品一覧に戻る</a>
</div>
</body>
</html>
?>
```
## dsp_item.php
```
<?php
$user = 'root';// データベースユーザ
$password = 'root';
$dbName = 'festival';// 利用するデータベース
// MySQLサーバ
$host = 'localhost:3306';
// MySQLのDSN文字列
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>商品一覧</title>
<!-- Bootstrapのスタイルシートを読み込む -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
</head>
<body>
<div class="container mt-4">
<h2>商品一覧</h2>
<table class="table table-bordered">
<thead>
<tr>
<th scope="col">商品ID</th>
<th scope="col">商品名</th>
<th scope="col">定価</th>
</tr>
</thead>
<tbody>
<?php
//MySQLデータベースに接続する
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM item";
$stm = $pdo->prepare($sql);
$stm->execute();
// 結果の取得(連想配列で受け取る)
$result = $stm->fetchAll(PDO::FETCH_ASSOC);
// 値を取り出して行に表示する
foreach ($result as $row){
// 1行ずつテーブルに入れる
echo "<tr>";
echo "<td>", $row['i_id'], "</td>";
echo "<td>", $row['i_name'], "</td>";
echo "<td>", $row['i_price'], "</td>";
echo "</tr>";
}
} catch (Exception $e) {
echo '<span class="error">エラーがありました。</span><br>';
echo $e->getMessage();
exit();
} finally {
//例外に関係なく実行される処理
$pdo = null;//db close
}
?>
</tbody>
</table>
</div>
<br>
<a href="ins_sales.php" class="btn btn-primary">売上登録</a>
<a href="dsp_sales.php" class="btn btn-primary">売上一覧</a>
<a href="ins_item.html" class="btn btn-primary">商品登録</a>
<!-- BootstrapのJavaScriptを読み込む -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
```
## ins_item.html
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
<title>商品登録</title>
</head>
<body>
<div class="container col-3 justify-content-center mt-5">
<h1 class="m-3 text-center">商品登録画面</h1>
<hr>
<form action="../php/ins_item.php" method="post">
<div class="p-2 mb-3">
<label for="itemName" class="form-label">商品名:</label>
<input type = "text" class="form-control" name="itemName" required>
</div>
<div class="p-2 mb-3">
<label for="itemPrice" class="form-label">定価:</label>
<input type = "number" class="form-control" name="itemPrice" min="0" step="5" required>
</div>
<div class="d-flex justify-center col-12">
<div class="row">
<div class="col-auto">
<input type = "submit" class="btn btn-primary" value="登録する">
</div>
<div class="col-auto">
<a href = "../php/dsp_item.php"class="btn btn-primary">商品一覧へ</a>
</div>
</div>
</div>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
```
## dsp_sales.php
```
<!-- DB -->
<?php
$user = 'root'; // データベースユーザ
$password = 'root';
$dbName = 'festival'; // 利用するデータベース
// MySQLサーバ
$host = 'localhost:3306';
// MySQLのDSN文字列
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
?>
<!-- HTML -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>売上一覧</title>
</head>
<body>
<div>
<h2>売上一覧</h2>
<table border="1">
<tr>
<th>売上ID</th>
<th>日時</th>
<th>商品名</th>
<th>数量</th>
<th>単価</th>
</tr>
<?php
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT sales.s_id, s_date, i_name, num, price
FROM sales
JOIN detail ON sales.s_id = detail.s_id
JOIN item ON detail.i_id = item.i_id";
$stm = $pdo->prepare($sql);
$stm->execute();
$salesData = $stm->fetchAll(PDO::FETCH_ASSOC);
foreach ($salesData as $data) {
echo "<tr>";
echo "<td>{$data['s_id']}</td>";
echo "<td>{$data['s_date']}</td>";
echo "<td>{$data['i_name']}</td>";
echo "<td>{$data['num']}</td>";
echo "<td>{$data['price']}</td>";
echo "</tr>";
}
} catch (Exception $e) {
echo '<span class="error">エラーがありました。</span><br>';
echo $e->getMessage();
} finally {
$pdo = null;
}
?>
</table>
<br>
<a href="dsp_item.php">商品一覧に戻る</a>
<a href="ins_sales.php">売上登録</a>
<a href="ins_item.html">商品登録</a>
</div>
</body>
</html>
```
## ins_sales.php
```
<!-- DB -->
<?php
$user = 'root'; // データベースユーザ
$password = 'root';
$dbName = 'festival'; // 利用するデータベース
// MySQLサーバ
$host = 'localhost:3306';
// MySQLのDSN文字列
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
?>
<!-- HTML -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>売上登録</title>
<!-- Add Bootstrap CDN -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbs5v0AB0/pG4jgW0UcPKJcGgSFnFuAg5qEXvRA+eJqFb4lXnft9Icmf1vEdwDw" crossorigin="anonymous">
<link rel="stylesheet" href="../css/ins_sales.css">
</head>
<body>
<div class="container col-12">
<h2 class="text-center mb-4">売上登録</h2>
<form action="../php/add_sales.php" method="post">
<table class="table">
<thead>
<tr>
<th>商品名</th>
<th>数量</th>
<th>単価</th>
</tr>
</thead>
<tbody>
<?php for ($i = 1; $i <= 4; $i++): ?>
<tr>
<td>
<select class="form-select" name="salesData[<?= $i ?>][itemName]">
<option value="" selected disabled hidden>選択してください</option>
<?php
// 商品一覧を取得
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT i_name FROM item";
$stm = $pdo->prepare($sql);
$stm->execute();
$items = $stm->fetchAll(PDO::FETCH_ASSOC);
foreach ($items as $item) {
echo "<option value=\"{$item['i_name']}\">{$item['i_name']}</option>";
}
} catch (Exception $e) {
echo '<option value="">エラーが発生しました</option>';
} finally {
$pdo = null;
}
?>
</select>
</td>
<td><input type="number" class="form-control" name="salesData[<?= $i ?>][quantity]" min="1" required></td>
<td><input type="number" class="form-control" name="salesData[<?= $i ?>][price]" min="0" required></td>
</tr>
<?php endfor; ?>
</tbody>
</table>
<div class="button-group">
<button type="submit" class="btn btn-primary">登録する</button>
</div>
</form>
<div class="button-group">
<a href="dsp_sales.php" class="btn btn-secondary">売上一覧に戻る</a>
<a href="dsp_item.php" class="btn btn-secondary">商品一覧</a>
<a href="../html/ins_item.html" class="btn btn-secondary">商品登録</a>
</div>
</div>
<!-- Add Bootstrap JS and Popper.js CDN -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-lPjxcmJVA2AaTaYNYErs77sI9vM/Ld5IdNUFZMlYUAfx2ofakx8p9eP2LZt/Z9S" crossorigin="anonymous"></script>
</body>
</html>
```
## add_sales.php
```
<?php
$user = 'root'; // データベースユーザ
$password = 'root';
$dbName = 'festival'; // 利用するデータベース
// MySQLサーバ
$host = 'localhost:3306';
// MySQLのDSN文字列
$dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>売上登録</title>
</head>
<body>
<div>
<h2>売上登録</h2>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$salesData = $_POST['salesData'];
try {
// MySQLデータベースに接続する
$pdo = new PDO($dsn, $user, $password);
// プリペアドステートメントのエミュレーションを無効にする
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// 例外がスローされる設定にする
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// トランザクションの開始
$pdo->beginTransaction();
// salesテーブルに新しい売上データを挿入
$sql = "INSERT INTO sales (s_date) VALUES (NOW())";
$stm = $pdo->prepare($sql);
$stm->execute();
// 直前のINSERTで生成された売上IDを取得
$sale_id = $pdo->lastInsertId();
// 売上明細を登録
$sql = "INSERT INTO detail (s_id, i_id, num, price) VALUES (:s_id, :i_id, :num, :price)";
$stm = $pdo->prepare($sql);
foreach ($salesData as $data) {
$itemName = $data['itemName'];
$quantity = $data['quantity'];
$price = $data['price'];
// 商品名から商品IDを取得
$sqlItem = "SELECT i_id FROM item WHERE i_name = :itemName";
$stmItem = $pdo->prepare($sqlItem);
$stmItem->bindParam(':itemName', $itemName, PDO::PARAM_STR);
$stmItem->execute();
$item = $stmItem->fetch(PDO::FETCH_ASSOC);
if ($item) {
$item_id = $item['i_id'];
// 売上明細を登録
$stm->bindParam(':s_id', $sale_id, PDO::PARAM_INT);
$stm->bindParam(':i_id', $item_id, PDO::PARAM_INT);
$stm->bindParam(':num', $quantity, PDO::PARAM_INT);
$stm->bindParam(':price', $price, PDO::PARAM_INT);
$stm->execute();
}
}
// トランザクションのコミット
$pdo->commit();
echo "売上が正常に登録されました。最後に挿入された行のIDは {$sale_id} です。";
} catch (Exception $e) {
// トランザクションのロールバック
$pdo->rollBack();
echo '<span class="error">エラーがありました。</span><br>';
echo $e->getMessage();
} finally {
// 例外に関係なく実行される処理
$pdo = null; // db close
}
}
?>
</div>
</body>
</html>
```
## ins_sales.css
```
@charset "UTF-8";
body {
font-family: 'Arial', sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}
.container {
max-width: 1000px;
margin: 50px auto;
background-color: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h2 {
text-align: center;
color: #333333;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
table, th, td {
border: 1px solid #dddddd;
}
th, td {
padding: 12px;
text-align: left;
}
select, input {
width: 100%;
padding: 8px;
margin: 4px 0;
display: inline-block;
border: 1px solid #ccc;
box-sizing: border-box;
border-radius: 4px;
}
button {
background-color: #007bff;
color: #ffffff;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
.button-group {
text-align: center;
margin-top: 20px;
}
a {
text-decoration: none;
color: #333333;
}
```
## ins_item.css
```
body {
font-family: 'Arial', sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}
.container {
max-width: 800px;
margin: 50px auto;
background-color: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h2 {
text-align: center;
color: #333333;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
table, th, td {
border: 1px solid #dddddd;
}
th, td {
padding: 12px;
text-align: left;
}
select, input {
width: calc(100% - 16px); /* 100%幅から左右のパディングを引いたサイズに設定 */
padding: 8px;
margin: 4px 0;
display: inline-block;
border: 1px solid #ccc;
box-sizing: border-box;
border-radius: 4px;
}
body {
background-color: #f8f9fa;
}
.container {
margin-top: 50px;
}
h1 {
color: #007bff;
}
form {
margin-top: 20px;
}
label {
font-weight: bold;
}
.form-control {
width: 100%;
}
.btn {
margin-top: 10px;
}
.btn-primary {
background-color: #007bff;
color: #fff;
border: none;
}
.btn-primary:hover {
background-color: #0056b3;
}
/* Optional: Add styling for responsiveness */
@media (max-width: 576px) {
.container {
max-width: 100%;
}
}
```