こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP等を用いて在庫数を表示・管理させたいのですが

現在、独学でhtml php css java等を勉強中の素人です。
私が使っているのは、dreamweaver cs6 とローカル環境用にMAMPを使用しています。
現在勉強のため、webサイト上でのチケット予約受付ページを作っております。

既に、「チケット紹介画面」→「予約受付画面」→「予約入力画面」→「入力確認画面」→「予約完了画面」 そして、予約完了画面になった時に送信者、送信先への自動送信システムをPHPを用いて作成しました。

そして、今回は、これに、在庫数の表示をさせたいと思っているのですが、どうすればいいのかわからず止まっている状態です。。。
今回でしたら、チケットの枚数に上限を持たせ、「残り○○枚」というのをトップページに表示させ、「残り0枚」になったら、予約画面には飛ばないようにしたいと思っています。
そのときの条件として、予約が成立するごとに、自動カウントダウンを行ないたいと思うのですが、そのようなシステムは作成可能でしょうか。
(今回は、1回の予約で、1枚しか買えないようにしたので、予約成立回数=送信完了回数=チケット枚数というようにしたいです。)

例:チケット枚数が上限50枚
1人目の送信者が予約完了画面でメールを自動送信して、トップページには[残り49枚]
2人目の送信者が予約完了画面でメールを自動送信して、トップページには[残り48枚]
・・・
50人目の送信者が予約完了画面でメールを自動送信して、トップページには[完売]

の様なシステムを作りたいですが。。。



いろいろ調べてはいるのですが、有料の在庫管理システムやショッピングカートシステムは見ることができたのですが、できたら勉強のため作成できたらなと思います。

知識薄な私には、提供されているシステム環境に登録して使った方がいいのは重々承知しています。しかし、勉強のためにもと思って行なっております。
どなた様かご教授宜しくお願いいたします。

投稿日時 - 2014-03-05 14:45:35

QNo.8501002

困ってます

質問者が選んだベストアンサー

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での例を記載しますが、長いので回答を切り分けます。

投稿日時 - 2014-03-05 16:01:20

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(5)

ANo.5

冗長な部分があったので訂正します。


// 注文を追加する
$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();
}

投稿日時 - 2014-03-05 17:08:01

ANo.4

<?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>

投稿日時 - 2014-03-05 16:26:39

ANo.2

チケットテーブルに(レコードごとに)在庫数を持てばいいだけじゃないですかねぇ(もちろん、仕入数と売上(予約・発券)数でもいいです)。

#残り枚数をデータベースから(あるいは計算して)表示するくらいは
#基本中の基本でしょ?

予約データを作成したら、update文で在庫からマイナス(もしくは予約済み数にプラス)するだけです。

もちろん残り枚数を表示する予約画面でもチェックしますが、最終的に「予約処理」を行う時点で再チェック(というかトランザクション処理にして、引き当てられなければロールバック)が必須です。残り1枚に対して「同時に予約処理が入る」というケースも想定しないといけませんから。

投稿日時 - 2014-03-05 15:17:47

ANo.1

>MAMPを使用しています。

であれば在庫管理はMySQLでやることをお勧めします
代金の決済まで本格的にやるのは個人レベルではきびしいでしょう
カード決済にしろ引き落としにしろそれなりのノウハウが必要なので。

投稿日時 - 2014-03-05 15:14:09

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-