- ベストアンサー
PHPを使った在庫数の表示・管理方法
- PHPを使って在庫数の表示・管理を行いたい場合、チケット予約受付ページに在庫数の表示を追加することができます。
- 在庫数の表示はトップページに行い、予約が成立するごとに在庫数を減らしていく形式にすると良いでしょう。
- 在庫数の管理はデータベースを使用することで実現できます。予約が成立したらデータベースの在庫数を更新するようにプログラムを作成しましょう。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
StackOverflowだったら「So, what is the question?」ってコメントされそうな感じの質問ですね…まぁ「どこから手をつけたらいいか分からない」ってことで困惑されて質問されるに至ったのだと思いますが。 PHPでそういったサイトを構築するにあたり、絶対的に必要になってくるのがデータべースとそれを扱うためのSQL言語です。MAMPを使用されているのであればMySQLの存在にはお気づきであると思いますが、これは無料で使えるオープンソースのデータベースの一つです。SQL言語自体はどんなデータベースでも似たようなものですが、若干「方言」的なものがあるので注意してください。 まずはSQLを先に学びましょう。 Google検索 - 「MySQL 入門」 https://www.google.co.jp/search?q=MySQL+%E5%85%A5%E9%96%80 こういったサイトは、ターミナル(Windowsであればコマンドプロンプトと呼ばれる)上で全ての操作を行う前提に解説されています。ですがターミナル上でのコマンド操作に不慣れなユーザーのために、MAMPには「phpMyAdmin」というPHP製のMySQL管理ツールが用意されていますのでご安心ください。 SQLの基礎的な文法を知り、ターミナル上で操作できるようになれば、あとはそれをPHPから扱うというステップに入ります。大雑把でいいので下記のまとめをご覧ください。ブクマしていただき、必要になったときにまた詳しく見返してもらえればいいなと思います。 Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 PHPには何通りかのデータベースへの接続方法がありますが、現在最も用いられているのはPDOクラスです。オブジェクト指向で美しくコーディングすることができ、MySQL以外の他のデータベースを扱う際にもこれ1本の知識で通用するというのが有力な根拠でしょうね。PHPでクラスとオブジェクトに触れたことがないのであれば、先にそちらの予習をお願いします。 Google検索 - 「PHP オブジェクト指向 入門」 https://www.google.co.jp/search?q=PHP%20%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%20%E5%85%A5%E9%96%80 PHP4とPHP5でクラスとオブジェクトの構造がまったく異なるので注意してください。プロパティ宣言に「var」を使っていたりするものは古いPHP4の書き方ですので、PHP5の新しい情報を参考にするようにしてください。「public」「protected」「private」などのキーワードが使われているのはPHP5のものです。 さて、ここまでの話が理解できているのであれば、おのずから答えは見えてくると思います。まずは、必要になってくるデータベースとテーブルを、コマンドラインからもしくはphpMyAdminを用いて作成してください。 以下に例を示します。 【データベース構成】 CREATE DATABASE my_web_site CHARACTER SET utf8 COLLATE utf8_general_ci 作成したデータベースをそのまま選択する場合「USE my_web_site」を実行します。 【テーブル・カラム構成】 データベースが選択された状態で実行します。 CREATE TABLE ticket_order( id unsigned int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '予約ID', name varchar(100) NOT NULL COMMENT '名前', evend_id unsigned int NOT NULL COMMENT 'イベントID' ) CREATE TABLE event( id unsigned int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'イベントID', name varchar(500) NOT NULL COMMENT 'イベント名', quantity unsigned int NOT NULL COMMENT '最大販売枚数', sold unsigned int NOT NULL DEFAULT 0 COMMENT '販売枚数' ) 【イベントの追加】 データベースが選択された状態で実行します。 INSERT INTO event(name, quantity) VALUES ('田村ゆかり38歳誕生日記念ライブ', 2000) これで準備は整いました。あとはPHPからオーダーを実行させましょう。PDOでの例を記載しますが、長いので回答を切り分けます。
その他の回答 (4)
冗長な部分があったので訂正します。 // 注文を追加する $stmt = $pdo->prepare("INSERT INTO ticket_order(name, event_id) VALUES(?, ?)"); for ($i = 0; $i < $count; ++$i) { $stmt->bindValue(1, $name); $stmt->bindValue(2, $event_id, PDO::PARAM_INT); $stmt->execute(); } ↓ // 注文を追加する $stmt = $pdo->prepare("INSERT INTO ticket_order(name, event_id) VALUES(?, ?)"); $stmt->bindValue(1, $name); $stmt->bindValue(2, $event_id, PDO::PARAM_INT); for ($i = 0; $i < $count; ++$i) { $stmt->execute(); }
<?php try { // POSTパラメータの受け取り foreach (array('event_id', 'name', 'count') as $name) { $$name = isset($_POST[$name]) && is_string($_POST[$name]) ? $_POST[$name] : ''; } // 接続設定 $dsn = 'mysql:dbname=my_web_site;host=localhost;charset=utf8'; $dbuser = 'root'; $dbpassword = ''; $options = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ); // 接続 $pdo = new PDO($dsn, $dbuser, $dbpassword, $options); // SQLモード・トランザクション分離レベル設定 $pdo->exec("SET SESSION sql_mode='TRADITONAL'"); $pdo->exec("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE"); // 名前チェック if ($name === '') { throw new RuntimeException('名前が未入力です'); } // 枚数チェック if (!ctype_digit($count) || $count < 1) { throw new RuntimeException('購入枚数が不正です'); } // トランザクション開始 $pdo->beginTransaction(); try { // 販売枚数を操作する $stmt = $pdo->prepare("UPDATE event SET sold = sold + ? WHERE id = ? AND sold + ? <= quantity"); $stmt->execute(array($count, $id, $count)); if (!$stmt->rowCount()) { throw new RuntimeException('指定された枚数は購入できません'); } // 注文を追加する $stmt = $pdo->prepare("INSERT INTO ticket_order(name, event_id) VALUES(?, ?)"); for ($i = 0; $i < $count; ++$i) { $stmt->bindValue(1, $name); $stmt->bindValue(2, $event_id, PDO::PARAM_INT); $stmt->execute(); } // トランザクションをコミットする $pdo->commit(); } catch (Exception $e) { // トランザクションをロールバックして例外を外側にスロー $pdo->rollBack(); throw $e; } } catch (Exception $e) { // エラーメッセージをセット $message = $e->getMessage(); } // 文字セットをブラウザに伝える header('Content-Type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html> <body> <p><?=htmlspecialchars($message, ENT_QUOTES, 'UTF-8')?></p> </body> </html>
- agunuz
- ベストアンサー率65% (288/438)
チケットテーブルに(レコードごとに)在庫数を持てばいいだけじゃないですかねぇ(もちろん、仕入数と売上(予約・発券)数でもいいです)。 #残り枚数をデータベースから(あるいは計算して)表示するくらいは #基本中の基本でしょ? 予約データを作成したら、update文で在庫からマイナス(もしくは予約済み数にプラス)するだけです。 もちろん残り枚数を表示する予約画面でもチェックしますが、最終的に「予約処理」を行う時点で再チェック(というかトランザクション処理にして、引き当てられなければロールバック)が必須です。残り1枚に対して「同時に予約処理が入る」というケースも想定しないといけませんから。
- yambejp
- ベストアンサー率51% (3827/7415)
>MAMPを使用しています。 であれば在庫管理はMySQLでやることをお勧めします 代金の決済まで本格的にやるのは個人レベルではきびしいでしょう カード決済にしろ引き落としにしろそれなりのノウハウが必要なので。