🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1072閲覧

ECサイト作りにの際のデータ処理をどうやってやるのか

BeatStar

総合スコア4962

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2020/12/21 08:21

編集2020/12/29 02:28
[概要] ECサイトを作る時に、どのようにして購入する商品のデータを買い物かごに入れたり等の管理や、 ユーザが複数人いる場合の対処はどのようにしているのか知りたい。

私は趣味でプログラミングをしています。
(基本的にはC++でソフト開発。一応HTML + CSS + JavaScriptでクライアントサイドに関してはやったことがあります)

AmazonのようなECサイトをオフラインPC上で作ってみたいと思い、
環境を整えている途中です。

それで疑問に思っているのが、「どうやってデータを管理するのか」と「どのようにユーザごとに管理をしているか」です。

私が思いつくものだと、

(名称は適当ですが)
まず 商品を提供する人を"提供者"、商品を購入する人を"ユーザ"とすると、

0. 提供者が商品を追加したり、削除したり等の処理をしてDBにセット 1. ユーザが商品名なりの情報を検索窓に入力して検索 1.1. ECサイトが該当する商品の一覧ページをPHP等で生成して表示 1.2. ユーザが一覧ページから商品の画像をクリック 1.2.1. ECサイトがPHP等でその商品の詳細ページを生成して表示 1.2.2. ユーザが「購入」ボタンを押す 1.2.2.1. ECサイトが「買い物かご」ページを生成して表示 1.2.2.2. ユーザが他に欲しいものがあるなら続けて検索窓に入力するなりして(1)から(1.2.2.2)までを繰り返す 1.2.2.3. ユーザが「レジに進む」ボタンを押す 1.2.2.3.1. ECサイトがPHP等で「レジ」のページを生成して表示 1.2.2.3.2. ユーザが購入するための情報(クレジットカード等)を入力 1.2.2.3.2.1. 「購入完了しました」系のページを生成して表示 1.2.2.3.2.2. PHP等でユーザには「購入したもの」や金額等、提供者には「どの商品を送るか」等の情報をメールで送信

という感じだと考えているのですが。

この流れが仮に正しいとするなら、{ 0, 1 } は何となくわかる気がします。
(おそらくDB操作して、その都度取り出している?)

でもわからないのは、一つ目は、(1.2.2) から (1.2.2.1) あるいは (1.2.2.3) から 別の(1) に移動する際のデータはどうなっているのかです。
たとえば(1.2.2) の時点でDBに「購入しようとしている商品」の一覧にセットして…とやっているのか、
PHP等のようなものに、「次に表示するページにデータを渡していく」のかです。

後者だと、一品目だと、 "product1" で 二品目だと "product1;product2" という風につなげていって…という感じでしょうか。

二つ目が、(0) や (1.2.2.3.2.2) のような、データ管理をどうするかです。

そして、三つ目が、上記フローにはありませんが、普通、ECサイトでのユーザは一人だけじゃなくて複数人いますよね。
JavaScriptのようにクライアントサイドなら、そこまで考えなくてもいいですが、
サーバサイドだと、C++やC#のような言語でマルチスレッドをやるような感じになるのでしょうか。

また、候補一覧を保持しておく方法も知りたいです。
Amazonで『C++ 本』で検索して、一つ目の詳細ページを開いて、
そのまま別の本(C++の)の詳細ページも続けて調べる…みたいな感じです。

まだ手を付けていない段階なのでどうなるかわからないですが、宜しくお願いします。

(一応作ろうとしている作品はオフラインで自分ひとりが使うようなもので、クレジット決済等はしませんが、後学のために…)

[情報]
言語: PHP(の予定) (もしくはC++等でのCGIか)
環境: Apache + PHP + (データベースソフト)
OS: Windows 10
使ったことがある言語等: HTML, CSS, JavaScript(クライアントサイド), JScript, C言語, C++


[追記1]
皆さんご回答ありがとうございます。
『最小単位から始める』のと『考えているだけでは出来上がらない』のは承知しています。
ただ、少なくとも『どのようにデータを管理するのか』がわからなくて…

C言語等でやるなら、たとえば CSVファイル等からデータを取り出して構造体なりのやつのリスト構造あるいは配列等で保持しますよね。
このように、大本のプロセスで保持して配列等を操作するような感じになるのか、
その都度データベースから毎回取り出すのか…ということが知りたかったのです。


[追記2]

とりあえず Apache, PHP のインストール及び起動の確認はできました。
そのうえ、(一応C++はできるので)ざっとPHPの書き方を学びました。

今現在、とりあえずそれぞれのページ(買い物かごページ等)を作っている途中です。


[追記3]

(すみません。質問が紛らわしかったですね…。修正します。ドンピシャな例が思いつかなかったもので…)

パターン1: C/C++でのDDE等のように、サーバソフト・クライアントソフトを作成し、 サーバソフトをレンタルサーバ等に置いて、 クライアントソフトを用いてデータのやり取りをするような感覚で、 一つのPHPファイル(あるいは一つのCGIファイル)をサーバソフト、 HTMLをクライアントソフトのようにして、 PHPファイル(あるいはCGIファイル)がすべて担って、 サイトのindex.html起動時(一回のみ)と買い物かごで決定した時等のような場合のみDB操作をして、 それ以外は基本的にPHPファイル(またはCGIファイル)がデータをすべてC言語でいう構造体の配列のような 感じで保持している。

イメージ説明

パターン2: (クライアントサイドの)JavaScriptのように、ページごと(あるいは「更新」・「再読み込み」)にDBからその都度取り出している。

イメージ説明

パターン3: パターン2のような感じでいったん取り出し、Google等の検索時のURLのように ttp://(URL)/next.html?key=(データ群) 等のようにURLで次々に渡していって、"product1;product2;product3...." のように連結していき、 最終的なレジのページでPHP等で解析して…等のようにしている。

イメージ説明

の三つが思いついていました。
このうちのどれなのでしょうか。(もしかしたら他の可能性もありますが)

つまり、言い換えると「データの生存期間はどれぐらいなのか」です。

パターン1ならそのメインのサイトが閉じられるまで(AmazonでいえばAmazon自体から離れるまで)で、

パターン2なら一ページ(「再読み込み」する場合はその回数レベルで)の範囲、

パターン3ならパターン1と同じですが、作法が違う。

という風に。

使ってみた感じでは、

PHP

1# phptest.php 2<?php 3 $keyword = isset($_GET["keyword"])? htmlspecialchars($_GET["keyword"], ENT_QUOTES, 'utf-8') : ''; 4 echo $keyword 5?>

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<title>テスト</title> 5<link rel="stylesheet" href="default.css"> 6</head> 7<body> 8 9<div class="mainarea"> 10<h1>テスト</h1> 11 12<form id="testform" action="phptest.php"> 13 <p><label for="keyword" id="label1">キーワード:</label><input type="text" name="keyword" id="keyword"><input type="submit" value="検索!" id="searchbutton"></p> 14</form> 15 16</div> 17</body> 18</html>

とやってみましたが、JavaScriptのように関数を呼び出すタイプじゃないみたいなので…

(ちなみに実行結果は入力された値が移動先で表示されるっぽい…)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai0310

2020/12/21 09:27

一気に全ての機能を考えずに、一つ一つの機能から考えてみてはどうでしょうか。
hentaiman

2020/12/21 10:13

試しに作るにはハードル高いと思うので、いったんログイン必須のシンプルなSNSやQAサイトを作ってみてはどうでしょう そこに肉付けしていけばamazonみたいできます
m.ts10806

2020/12/21 10:57

小さい検証プログラムを作って試してみれば分かることもあるかと思います。 考えてるだけではアプリケーションはできあがりませんし、書かないプログラムは動きません。 今、どこまでなにをやってみてますか?
hentaiman

2020/12/29 02:31

tannatさんの回答にカートの保持に関する方法の説明が書いてあるからその単語を元に調べましょう ついでにデータの生存期間は「質問者が決める」と思っていて問題無いです
kai0310

2020/12/29 10:41

ここはあなたの進捗状況を掲載する掲示板ではありません。 質問を解決できませんでしたか?追記が多く、これ以上の回答はつきづらいと思いますので、一度ご自身で整理し再度新規投稿をされてはいかがでしょうか?
guest

回答3

0

ベストアンサー

ECサイトに限らず、
WEBアプリケーション自体のデータの流れを把握しないとなかなかイメージが付きにくいところかと思います。
まずはPHPでwebアプリケーションを一つ作ってみることをお勧めします。
(動作を把握するにはフレームワークを使わずに自力で書くのがおすすめです。実際のアプリケーションはフレームワークを使うのがいいですが。)


でもわからないのは、一つ目は、(1.2.2) から (1.2.2.1) あるいは (1.2.2.3) から 別の(1) に移動する際のデータはどうなっているのかです。

POSTで商品IDと商品数を送信するのが良くある方法です。

たとえば(1.2.2) の時点でDBに「購入しようとしている商品」の一覧にセットして…とやっているのか、
PHP等のようなものに、「次に表示するページにデータを渡していく」のかです。

後者だと、一品目だと、 "product1" で 二品目だと "product1;product2" という風につなげていって…という感じでしょうか。

カートの中身の保持方法という質問であれば、
セッションでサーバサイドに情報を持ったり、cookieでクライアントサイドに情報を記録したり、カート情報をDBに持ったりします。
分かりやすいのはセッションなので、PHP セッションなどで調べてみて挙動を確認されると良いかと思います。

セッションならPHPのデータ構造をそのままサーバサイドで扱えます。
cookieの場合は適当な形でシリアライズさせて1つの値として持たせたり、複数の値として持たせたりと実装方法は色々あります。

二つ目が、(0) や (1.2.2.3.2.2) のような、データ管理をどうするかです。

RDBMSで必要な情報を管理するケースが一般的です。
(必要な情報の管理のイメージが出来ない場合は、RDBMSの基本を学習されるとイメージが付きやすいかと思います)

そして、三つ目が、上記フローにはありませんが、普通、ECサイトでのユーザは一人だけじゃなくて複数人いますよね。
JavaScriptのようにクライアントサイドなら、そこまで考えなくてもいいですが、
サーバサイドだと、C++やC#のような言語でマルチスレッドをやるような感じになるのでしょうか。

一般的にwebアプリケーションにおいてプログラマがマルチスレッドを意識してプログラミングを行わないといけないケースはほとんどありません。
(PHPの動作環境がカバーしてくれるケースが殆どです)

また、セッションについては複数ユーザーが居た場合でもセッションはPHP自体が管理してくれるので、PHPでプログラミングする上ではマルチスレッドを特に気にする必要はありません。

一方で、最終的なデータの整合性についてはDBの機能を使って結果を保証するケースが多いです。
(例えば、在庫が一つしかない商品を同時に二人の人が購入しようとした場合、DBのトランザクションやロックを使ってどちらのみ成功するようにします)

投稿2020/12/21 08:43

編集2020/12/21 09:13
tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/12/21 11:12

ご回答ありがとうございます。 初めてやる分野のため、用語(?)がわからないのでとりあえず調べてみます。 セッション、Cookie、RDBMS…なるほど。
tanat

2020/12/21 11:30

> このように、大本のプロセスで保持して配列等を操作するような感じになるのか、 > その都度データベースから毎回取り出すのか…ということが知りたかったのです。 については概ねその通りです。 この辺りもまともな教材であれば必ず扱うので、実際に小さなアプリケーションを作ってみるのが理解が早いかと思いますよ。 `webアプリケーション HTTP 仕組み`とか`webアプリケーション セッション管理`とか`webアプリケーション データ管理`などで調べれば概念的なところは出てくるかと思いますが、並行して試せる環境が無いと理解は進みにくいんじゃないかと。
BeatStar

2020/12/31 10:43

とりあえずの方向性が定まったのでBAとさせていただきます!
BeatStar

2021/01/18 07:06

追記し忘れていました… tanatさんがおっしゃったように、「セッション」について学ぶと、 大体の方向性が見えてきました。
guest

0

ECサイトのオープンソースがいくつかありますから、ソースコードを読んでみてはいかがでしょうか。
ECサイトに使えるCMS《無料オープンソース》10選

投稿2020/12/21 08:47

javahack

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/12/21 11:10

ご回答ありがとうございます。 やはりCMSを使うのがいいのでしょうか。
javahack

2020/12/21 11:35

とりあえず動かしてみて何となく仕組みを理解していくこともできますが、オープンソースであればソースコードを読んでどのようにカートを維持しているのか、ユーザ管理、セキュリティの対応などを学習できるのではないかと思い紹介しました。
退会済みユーザー

退会済みユーザー

2020/12/21 11:37

設計書を公開している OSS もあるので、そちらから攻めてみるのが良いかと。
guest

0

基本的にWEBアプリの構造はこんな感じです。
1.ブラウザからのリクエストデータを見る(URL、リクエストボディ、クッキー情報など)
2.リクエストデータに紐づくデータをDBから引っ張る(DB処理)
3.DBのデータをもとにHTMLを生成、ブラウザに渡す

例えば買い物かごにいれたものを表示する場合は
買い物かごテーブルをDBに用意します。
買い物かごテーブルにはユーザーID,商品名のレコードを作れるようにします。
tarouさんがうまい棒、ブラックサンダー、スーパーカップをかごにいれてボタンを押すと
サーバーに対してデータが送信され、サーバーは受け取ったデータをDBに保存します。
データベースにはこんな感じでデータがはいります。
tarou, うまい棒
tarou, ブラックサンダー
tarou, スーパーカップ

tarouさんの買い物かごを知りたいときはこんな感じのSQLを発行します。
select * from 買い物かご where user_id = 'tarou';
こうすると配列でデータが受け取れます。
data[0] = {user_id: 'tarou', item: 'うまい棒'}
data[1] = {user_id: 'tarou', item: 'ブラックサンダー'}
data[2] = {user_id: 'tarou', item: 'スーパーカップ'}

まあ実際にLaravelなどでサンプルを組んでみたら疑問点はすぐに解消できると思います。

投稿2020/12/21 08:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/12/21 11:09

ご回答ありがとうございます。 Laravel ですか…初めて聞きました。 とりあえず調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問