2022/06/14

目次
倉庫クエ(敵一覧)登録・更新
ゲーム完美世界の倉庫クエの敵一覧の登録と更新を行うプログラムの紹介をします
まずは上のページをご覧ください。こちらは、続きとなっています。
こちらは、管理者画面側の作りとなっています。本番では、makeフォルダに.htaccessでパスワードをかけて運用します。
ファイル名:make/souko_kue.php
<?php // DB接続用ファイルとGETとPOSTの値をチェックするファイルを読み込み require_once __DIR__ . '/../db_config.php'; require_once __DIR__ . '/../get_post_check.php'; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>倉庫クエアップデート</title> <link rel="icon" href="../img/favicon.ico"> <link rel="stylesheet" href="../css/style.css"> </head> <body> <div class="main"> <h2>倉庫クエ<?= $step; ?>(敵一覧)データ登録</h2> <p> <form method="post" action="insert_souko_kue.php?step=<?= htmlspecialchars($step, ENT_QUOTES) ?>"> <table border="1"> <tr> <th>ドロップアイテム</th><th>ドロップする敵</th><th>エリア1</th><th>エリア2</th><th>x座標</th><th>y座標</th><th>高度</th><th>更新</th> </tr> <tr> <td> <?php // ドロップアイテムのプルダウンメニューを表示する echo '<select name="drop_item">'; echo '<option hidden>選択してください</option>'; foreach ($drop_item_name as $key => $value) { echo '<option value="' . $key . '">' . $value . '</option>'; } echo '</select>'; ?> </td> <td> <input type="text" name="drop_enemy" size="20" maxlength="10" required> </td> <td> <input type="text" name="drop_area1" size="10" maxlength="10"> </td> <td> <input type="text" name="drop_area2" size="10" maxlength="10"> </td> <td> <input type="number" name="x" min="0" max="999"> </td> <td> <input type="number" name="y" min="0" max="999"> </td> <td> <input type="number" name="height" min="0" max="99"> </td> <td> <input type="submit" value="登録"> </td> </tr> </table> </form> <form action="update.html"> <input type="submit" value="戻る"> </form> <?php try { // DB接続開始 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if (empty($search)) { // 検索ワードが設定されていない時のSQL文 $sql = 'SELECT * FROM souko_kue WHERE step = ?'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $step, PDO::PARAM_INT); } else { // $drop_item_nameの部分検索を行って、該当するものがあるかをチェック foreach ($drop_item_name as $key => $value) { if (str_contains($value, $search)) { $cnt = $key; break; } // PHP7以前の場合はこちらの方法で /* if (preg_match('/'.$search.'/', $value)) { $cnt = $key; break; } */ } // 検索ワードが設定されている時のSQL文 $sql = 'SELECT * FROM souko_kue WHERE step = ? and (drop_item = ? or drop_enemy like ? or drop_area1 like ? or drop_area2 like ?)'; // あいまい検索用変数 $search_like = '%' . $search . '%'; // 各種DB接続に関する設定 $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $step, PDO::PARAM_INT); if (isset($cnt)) { $stmt->bindValue(2, $cnt, PDO::PARAM_INT); } else { $stmt->bindValue(2, NULL, PDO::PARAM_INT); } $stmt->bindValue(3, $search_like, PDO::PARAM_STR); $stmt->bindValue(4, $search_like, PDO::PARAM_STR); $stmt->bindValue(5, $search_like, PDO::PARAM_STR); } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); echo '<table>' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<th>' . PHP_EOL; echo '<form method="get" action="souko_kue.php?step=' . htmlspecialchars($step, ENT_QUOTES) . '&search=' . htmlspecialchars($search, ENT_QUOTES) . '">' . PHP_EOL; echo '<input type="text" class="reset_place" name="search" value="' . htmlspecialchars($search, ENT_QUOTES) . '" size="22" maxlength="10">' . PHP_EOL; echo '<input type="hidden" name="step" value="' . htmlspecialchars($step, ENT_QUOTES) .'">' . PHP_EOL; echo '<input type="submit" value="検索">' . PHP_EOL; echo '<button class="reset">リセット</button>' . PHP_EOL; echo '</form>' . PHP_EOL; echo '</th>' . PHP_EOL; echo '</tr>' . PHP_EOL; echo '</table>' . PHP_EOL; echo '<table border="1">' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<th>ドロップアイテム</th><th>ドロップする敵</th><th>エリア1</th><th>エリア2</th><th>座標(付近)</th><th>更新</th>' . PHP_EOL; echo '</tr>' . PHP_EOL; // 倉庫クエ(敵一覧データ)の表示 foreach ($result as $row) { echo '<form method="post" action="update_souko_kue.php?step=' . htmlspecialchars($step, ENT_QUOTES) . '">' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<td>' . $drop_item_name[(int)$row['drop_item']] . '</td>' . PHP_EOL; echo '<td>' . htmlspecialchars($row['drop_enemy']) . '</td>' . PHP_EOL; echo '<td>' . htmlspecialchars($row['drop_area1']) . '</td>' . PHP_EOL; echo '<td>' . htmlspecialchars($row['drop_area2']) . '</td>' . PHP_EOL; echo '<td>(' . htmlspecialchars($row['x'], ENT_QUOTES) . ',' . htmlspecialchars($row['y'], ENT_QUOTES) . ')↑' . htmlspecialchars($row['height'], ENT_QUOTES) . '</td>' . PHP_EOL; echo '<td><input type="submit" value="更新"></td>' . PHP_EOL; echo '</tr>' . PHP_EOL; echo '<input type="hidden" name="id" value="' . htmlspecialchars($row['id'], ENT_QUOTES) . '">'; echo '</form>' . PHP_EOL; } echo '</table>' . PHP_EOL; // DB領域の開放 $dbh = null; } catch (PDOException $e) { echo 'エラー発生:表示に失敗しました。'; exit; } ?> </p> </div> <script src="../js/jquery-3.3.1.min.js"></script> <script src="../js/souko_quest.js"></script> </body> </html>
倉庫クエのデータ登録・更新を行うプログラムのメイン部分です。登録画面と更新画面のどちらへも進めるようになっています。
ファイル名:make/insert_souko_kue.php
<?php // DB接続用ファイルとGETとPOSTの値をチェックするファイルを読み込み require_once __DIR__ . '/../db_config.php'; require_once __DIR__ . '/../get_post_check.php'; if ($_POST['drop_item'] == '選択してください') { echo "ドロップアイテム名を選択してください。"; exit; } // 各種パラメータの設定 $drop_item = (int)$_POST['drop_item']; $drop_enemy = htmlspecialchars($_POST['drop_enemy'], ENT_QUOTES); $drop_area1 = htmlspecialchars($_POST['drop_area1'], ENT_QUOTES); $drop_area2 = htmlspecialchars($_POST['drop_area2'], ENT_QUOTES); if ($_POST['x'] || $_POST['x'] == "0") { $x = (int)$_POST['x']; } else { $x = NULL; } if ($_POST['y'] || $_POST['y'] == "0") { $y = (int)$_POST['y']; } else { $y = NULL; } if ($_POST['height'] || $_POST['height'] == "0") { $height = (int)$_POST['height']; } else { $height = NULL; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>倉庫クエインサート</title> <link rel="icon" href="../img/favicon.ico"> <link rel="stylesheet" href="../css/style.css"> </head> <body> <div class="main"> <h2>倉庫クエ(敵一覧)データ新規登録</h2> <form method="post" action="souko_kue.php?step=<?= htmlspecialchars($step, ENT_QUOTES) ?>"> <table border="1"> <tr> <th>ドロップアイテム</th><th>ドロップする敵</th><th>エリア1</th><th>エリア2</th><th>座標</th> </tr> <tr> <td><?= $drop_item_name[$drop_item]; ?></td> <td><?= $drop_enemy; ?></td> <td><?= $drop_area1; ?></td> <td><?= $drop_area2; ?></td> <td><?= '(' . $x . ',' . $y . ')↑' . $height; ?></td> </tr> </table> <?php try { // DB更新 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO souko_kue (step, drop_item, drop_enemy, drop_area1, drop_area2, x, y, height) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $step, PDO::PARAM_INT); $stmt->bindValue(2, $drop_item, PDO::PARAM_INT); $stmt->bindValue(3, $drop_enemy, PDO::PARAM_STR); $stmt->bindValue(4, $drop_area1, PDO::PARAM_STR); $stmt->bindValue(5, $drop_area2, PDO::PARAM_STR); $stmt->bindValue(6, $x, PDO::PARAM_INT); $stmt->bindValue(7, $y, PDO::PARAM_INT); $stmt->bindValue(8, $height, PDO::PARAM_INT); $stmt->execute(); $dbh = null; echo "登録が完了しました。"; } catch (PDOException $e) { echo 'エラー発生:登録に失敗しました。'; exit; } ?> <br> <table> <tr> <th> <input type="submit" value="戻る"> </th> </tr> </table> </form> </div> </body> </html>
倉庫クエの登録部分のプログラムです。
ファイル名:make/update_souko_kue.php
<?php // DB接続用ファイルとGETとPOSTの値をチェックするファイルを読み込み require_once __DIR__ . '/../db_config.php'; require_once __DIR__ . '/../get_post_check.php'; if ($_POST['id'] == NULL) { echo "正しい更新ボタンを押してください。"; exit; } try { // DB接続開始 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT * FROM souko_kue WHERE id = ?"; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); // 各種パラメータの設定(idから取得) $drop_item = (int)$result['drop_item']; $drop_enemy = htmlspecialchars($result['drop_enemy'], ENT_QUOTES); $drop_area1 = htmlspecialchars($result['drop_area1'], ENT_QUOTES); $drop_area2 = htmlspecialchars($result['drop_area2'], ENT_QUOTES); if ($result['x'] || $result['x'] == "0") { $x = (int)$result['x']; } else { $x = NULL; } if ($result['y'] || $result['y'] == "0") { $y = (int)$result['y']; } else { $y = NULL; } if ($result['height'] || $result['height'] == "0") { $height = (int)$result['height']; } else { $height = NULL; } // DB領域の開放 $dbh = null; } catch (PDOException $e) { echo 'エラー発生:更新処理に失敗しました。'; exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>倉庫クエアップデート</title> <link rel="icon" href="../img/favicon.ico"> <link rel="stylesheet" href="../css/style.css"> </head> <body> <div class="main"> <h2>倉庫クエ(敵一覧)データ更新</h2> <form method="post" action="update_souko_kue2.php?step=<?= htmlspecialchars($step, ENT_QUOTES) ?>"> <?php // データ表示 echo '<table border="1">' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<th>ドロップアイテム</th><th>ドロップする敵</th><th>エリア1</th><th>エリア2</th><th>x座標</th><th>y座標</th><th>高度</th><th>更新</th>' . PHP_EOL; echo '</tr>' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<td>' . PHP_EOL; echo '<select name="drop_item">' . PHP_EOL; echo '<option value="NULL">選択してください</option>' . PHP_EOL; foreach ($drop_item_name as $key => $value) { echo '<option value="' . $key . '"'; if ($key == $drop_item) { echo ' selected'; } echo '>' . $value .'</option>' . PHP_EOL; } echo '</select>' . PHP_EOL; echo '</td>' . PHP_EOL; echo '<td><input type="text" name="drop_enemy" value="' . $drop_enemy . '" size="20" maxlength="10" required></td>' . PHP_EOL; echo '<td><input type="text" name="drop_area1" value="' . $drop_area1 . '" size="10" maxlength="10"></td>' . PHP_EOL; echo '<td><input type="text" name="drop_area2" value="' . $drop_area2 . '" size="10" maxlength="10"></td>' . PHP_EOL; echo '<td><input type="text" name="x" value="' . $x . '" size="3" maxlength="3"></td>' . PHP_EOL; echo '<td><input type="text" name="y" value="' . $y . '" size="3" maxlength="3"></td>' . PHP_EOL; echo '<td><input type="text" name="height" value="' . $height . '" size="3" maxlength="3"></td>' . PHP_EOL; echo '<td><input type="submit" value="更新"></td>' . PHP_EOL; echo '</tr>' . PHP_EOL; echo '</table>' . PHP_EOL; echo '<input type="hidden" name="id" value="' . $id . '">'; ?> </form> <table> <tr> <th> <form method="post" action="souko_kue.php?step=<?= htmlspecialchars($step, ENT_QUOTES) ?>"> <input type="submit" value="戻る"> </form> </th> </tr> </table> </div> </body> </html>
データの更新を行うプログラム部分その1です。
ファイル名:make/update_souko_kue2.php
<?php // DB接続用ファイルとGETとPOSTの値をチェックするファイルを読み込み require_once __DIR__ . '/../db_config.php'; require_once __DIR__ . '/../get_post_check.php'; if ($_POST['id'] == NULL) { echo "正しい更新ボタンを押してください。"; exit; } // 各種パラメータの設定(POSTから取得) if ($_POST['drop_item'] != "NULL") { $drop_item = (int)$_POST['drop_item']; } else { echo 'アイテム名が正しくありません。'; exit; } $drop_enemy = htmlspecialchars($_POST['drop_enemy'], ENT_QUOTES); $drop_area1 = htmlspecialchars($_POST['drop_area1'], ENT_QUOTES); $drop_area2 = htmlspecialchars($_POST['drop_area2'], ENT_QUOTES); if ($_POST['x'] || $_POST['x'] == "0") { $x = (int)htmlspecialchars($_POST['x'], ENT_QUOTES); } else { $x = NULL; } if ($_POST['y'] || $_POST['y'] == "0") { $y = (int)htmlspecialchars($_POST['y'], ENT_QUOTES); } else { $y = NULL; } if ($_POST['height'] || $_POST['height'] == "0") { $height = (int)htmlspecialchars($_POST['height'], ENT_QUOTES); } else { $height = NULL; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>倉庫クエアップデート</title> <link rel="icon" href="../img/favicon.ico"> <link rel="stylesheet" href="../css/style.css"> </head> <body> <div class="main"> <h2>倉庫クエ(敵一覧)データ更新</h2> <form method="post" action="souko_kue.php?step=<?= htmlspecialchars($step, ENT_QUOTES) ?>"> <?php // データ表示 echo '<table border="1">' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<th>ドロップアイテム</th><th>ドロップする敵</th><th>エリア1</th><th>エリア2</th><th>x座標</th><th>y座標</th><th>高度</th>' . PHP_EOL; echo '</tr>' . PHP_EOL; echo '<tr>' . PHP_EOL; echo '<td>' . $drop_item_name[$drop_item] . '</td>' . PHP_EOL; echo '<td>' . $drop_enemy . '</td>' . PHP_EOL; echo '<td>' . $drop_area1 . '</td>' . PHP_EOL; echo '<td>' . $drop_area2 . '</td>' . PHP_EOL; echo '<td>' . $x . '</td>' . PHP_EOL; echo '<td>' . $y . '</td>' . PHP_EOL; echo '<td>' . $height . '</td>' . PHP_EOL; echo '</tr>' . PHP_EOL; echo '</table>' . PHP_EOL; echo '<input type="hidden" name="id" value="' . $id . '">'; try { // DB接続開始 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "UPDATE souko_kue set step = ?, drop_item = ?, drop_enemy = ?, drop_area1 = ?, drop_area2 = ?, x = ?, y = ?, height = ? WHERE id = ?"; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $step, PDO::PARAM_INT); $stmt->bindValue(2, $drop_item, PDO::PARAM_INT); $stmt->bindValue(3, $drop_enemy, PDO::PARAM_STR); $stmt->bindValue(4, $drop_area1, PDO::PARAM_STR); $stmt->bindValue(5, $drop_area2, PDO::PARAM_STR); $stmt->bindValue(6, $x, PDO::PARAM_INT); $stmt->bindValue(7, $y, PDO::PARAM_INT); $stmt->bindValue(8, $height, PDO::PARAM_INT); $stmt->bindValue(9, $id, PDO::PARAM_INT); $stmt->execute(); // DB領域の開放 $dbh = null; echo "更新が完了しました。"; } catch (PDOException $e) { echo 'エラー発生:更新に失敗しました。' . var_dump($e); exit; } ?> <br> <table> <tr> <th> <input type="submit" value="戻る"> </th> </tr> </table> </form> </div> </body> </html>
データの更新を行うプログラム部分その2です。
ファイル名:make/update.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>データベースアップデート</title> <link rel="icon" href="../img/favicon.ico"> <link rel="stylesheet" href="../css/style.css"> </head> <body> <div class="main"> <h2>倉庫クエ(敵一覧)</h2> <p><a href="souko_kue.php?step=1">倉庫クエ1アップデート</a></p> <p><a href="souko_kue.php?step=2">倉庫クエ2アップデート</a></p> </div> </body> </html>
倉庫クエのアップデートを行う、メイン画面です。通常は、管理者しか見れない画面となっています。
どうでしたでしょうか。何か参考になったことがあれば良いのですが。
