# コード例 ## 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%; } } ```