
現在、独学でhtml php css java等を勉強中の素人です。
私が使っているのは、dreamweaver cs6 とローカル環境用にMAMPを使用しています。
現在勉強のため、webサイト上でのチケット予約受付ページを作っております。
既に、「チケット紹介画面」→「予約受付画面」→「予約入力画面」→「入力確認画面」→「予約完了画面」 そして、予約完了画面になった時に送信者、送信先への自動送信システムをPHPを用いて作成しました。
そして、今回は、これに、在庫数の表示をさせたいと思っているのですが、どうすればいいのかわからず止まっている状態です。。。
今回でしたら、チケットの枚数に上限を持たせ、「残り○○枚」というのをトップページに表示させ、「残り0枚」になったら、予約画面には飛ばないようにしたいと思っています。
そのときの条件として、予約が成立するごとに、自動カウントダウンを行ないたいと思うのですが、そのようなシステムは作成可能でしょうか。
(今回は、1回の予約で、1枚しか買えないようにしたので、予約成立回数=送信完了回数=チケット枚数というようにしたいです。)
例:チケット枚数が上限50枚
1人目の送信者が予約完了画面でメールを自動送信して、トップページには[残り49枚]
2人目の送信者が予約完了画面でメールを自動送信して、トップページには[残り48枚]
・・・
50人目の送信者が予約完了画面でメールを自動送信して、トップページには[完売]
の様なシステムを作りたいですが。。。
いろいろ調べてはいるのですが、有料の在庫管理システムやショッピングカートシステムは見ることができたのですが、できたら勉強のため作成できたらなと思います。
知識薄な私には、提供されているシステム環境に登録して使った方がいいのは重々承知しています。しかし、勉強のためにもと思って行なっております。
どなた様かご教授宜しくお願いいたします。
No.3ベストアンサー
- 回答日時:
StackOverflowだったら「So, what is the question?」ってコメントされそうな感じの質問ですね…まぁ「どこから手をつけたらいいか分からない」ってことで困惑されて質問されるに至ったのだと思いますが。
PHPでそういったサイトを構築するにあたり、絶対的に必要になってくるのがデータべースとそれを扱うためのSQL言語です。MAMPを使用されているのであればMySQLの存在にはお気づきであると思いますが、これは無料で使えるオープンソースのデータベースの一つです。SQL言語自体はどんなデータベースでも似たようなものですが、若干「方言」的なものがあるので注意してください。
まずはSQLを先に学びましょう。
Google検索 - 「MySQL 入門」
https://www.google.co.jp/search?q=MySQL+%E5%85%A …
こういったサイトは、ターミナル(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%A …
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での例を記載しますが、長いので回答を切り分けます。
No.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();
}
No.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>
No.2
- 回答日時:
チケットテーブルに(レコードごとに)在庫数を持てばいいだけじゃないですかねぇ(もちろん、仕入数と売上(予約・発券)数でもいいです)。
#残り枚数をデータベースから(あるいは計算して)表示するくらいは
#基本中の基本でしょ?
予約データを作成したら、update文で在庫からマイナス(もしくは予約済み数にプラス)するだけです。
もちろん残り枚数を表示する予約画面でもチェックしますが、最終的に「予約処理」を行う時点で再チェック(というかトランザクション処理にして、引き当てられなければロールバック)が必須です。残り1枚に対して「同時に予約処理が入る」というケースも想定しないといけませんから。
No.1
- 回答日時:
>MAMPを使用しています。
であれば在庫管理はMySQLでやることをお勧めします
代金の決済まで本格的にやるのは個人レベルではきびしいでしょう
カード決済にしろ引き落としにしろそれなりのノウハウが必要なので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- クレジットカード VISAでのネット決済にパスワードが2度も必要? 1 2022/04/04 14:40
- Microsoft ASP グーグルフォーム 1 2022/12/30 18:16
- 銀行・ネットバンキング・信用金庫 三井住友カードの不正利用探知システムについて ブッキングドットコムでホテル予約を三井住友カードで行い 1 2023/05/20 11:58
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Google Drive グーグルフォームについて 1 2022/04/23 02:34
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- 飛行機・空港 先日 Expediaで航空券予約をしました。 送られてきたeチケットの名前が逆でした、航空会社の予約 7 2023/01/28 11:22
- デスクトップパソコン windows7を使っているパソコンでの質問です。先日動作が遅く再起動かけると「windowsを起動 9 2022/06/16 21:31
- 飛行機・空港 質問です! ANAの株主優待券で航空チケットを 予約したのですが予約の時に 『株主優待券』にレ点をし 6 2022/06/10 20:58
- 所得税 電子税?のメールについて教えてください 8 2022/09/04 21:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHP&MySQL fetchAll()でデータ...
-
【PHP】PHPでそのファイルが格...
-
php+mysqlでの重複チェックにつ...
-
openCVのトラックバーについて
-
if function PHP
-
scanfでの読み込み文字数制限
-
VBA で、スペースを含むファイ...
-
PHPの簡単な掲示板での日付順表示
-
(Excel)VBA ファイルパスからフ...
-
$_REQUESTの意味を教えて下さい
-
php、sqlite3にデーター追加で...
-
PHPでURLにジャンプするには?
-
現在時刻を反映させた時刻のプ...
-
Submit(送信ボタン)を押した...
-
ページを切り替えずにphpに値を...
-
smartyでチェックボックスをチ...
-
データベースにある値でリスト...
-
ラジオボタンの値を受け取ってP...
-
携帯電話HP作成。
-
phpでカレンダー作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
php+mysqlでの重複チェックにつ...
-
$_SESSIONに渡した後はそのまま...
-
重複を防ぐ記述について教えて...
-
PHP MySql 画像を取得
-
アップロードファイル名の文字化け
-
アップロードしたファイルの絶...
-
Flaskでサーバー立ち上げに関して
-
Fortranでのファイル名操作につ...
-
PHP で動的ファイル出力
-
phpで変数を使ってcopyできない
-
PHPからHTMLへの変数の受け...
-
PHPのエラー対処法を教えてくだ...
-
name属性が全角の場合・・・
-
openCVのトラックバーについて
-
インスタンスとコンストラクタ
-
多次元配列から作った表の重複...
-
サブフォルダ内の全てのテキス...
-
ファイル名を変更してアップロ...
-
テキストボックスの値を取得したい
おすすめ情報