35

カートデータを永続化するためのユーザー名/ログインがないeコマースサイトでは、PHP $ _SESSION変数またはブラウザCookieを使用して、ショッピングカート内のアイテムを永続化する方がよいでしょうか。クッキーを無効にすることができるので、私は$ _SESSIONに傾いていますが、あなたからの考えを聞きたいです。

よろしくお願いします。

4

6 に答える 6

48

ない

大規模なサイトでは、ユーザーのカートをセッションやCookieに保存することはあえてしません。そのデータは非常に価値があります。

顧客が何を購入しているのか、商品を選択するとき、購入する数、チェックアウトを完了しない理由などはすべて、ビジネスにとって非常に重要です。

データベーステーブルを使用してこの情報を保存し、それをユーザーのセッションにリンクします。そうすれば、情報を失うことなく、戻ってユーザーのカートに基づいて統計を作成したり、チェックアウトプロセスの問題を解決したりできます。

できる限りすべてログに記録します。

データベーススキーマ

以下は、これがデータベースレベルでどのように見えるかを示す簡単な例です。

user {
    id
    email
}

product {
    id
    name
    price
}

cart {
    id
    product_id
    user_id
    quantity
    timestamp    (when was it created?)
    expired      (is this cart still active?)
}

カートのリビジョンを追跡できるように、カートテーブルをより多くのテーブルに分割することもできます。

セッション

通常のPHPセッションは2つの部分で構成されています

  1. データ(サーバー上のファイルに保存されている)
  2. ユーザーエージェント(ブラウザ)に与えられた一意の識別子

したがって、それは$_SESSIONvsではありません$_COOKIE-それは$_SESSION + $_COOKIE ="セッション"です。ただし、データを含む単一の暗号化されたCookieを使用してこれを変更する方法があります(したがって、データを見つけるために識別子は必要ありません)。もう1つの一般的なアプローチは、データをファイルシステムではなくmemcachedまたはデータベースに保存して、複数のサーバーがデータにアクセスできるようにすることです。

@ Travesty3が言っていることは、2つのCookieを持つことができるということです。1つはセッション用で、もう1つは「ログインしたままにする」Cookie(セッションCookieより長く存在します)または別のCookie内のデータのコピーです。 。

于 2012-09-24T17:17:02.020 に答える
9

Xeoncrossが指摘しているように、分析のために可能な情報を保存することは非常に重要です。したがって、セッションとCookieに完全に依存するべきではありません。

可能なアプローチは-

ログインしていない場合はセッションを使用する

$_SESSIONユーザーがログインしていない場合は、PHPを使用して、セッションからカートアイテムとウィッシュリストアイテムを保存および取得できます。

ログイン時にデータベースを使用する

ユーザーがログインしている場合は、2つのオプションのいずれかを検討できます-

  • カートアイテムまたはウィッシュリストアイテムをデータベースのみに保存する
  • カートアイテムまたはウィッシュリストアイテムをデータベースとセッションに保存します(これにより、データベースクエリの一部が保存されます)

ユーザーがログインしたとき

ユーザーがログインしたら、セッションからすべてのカートアイテムとウィッシュリストアイテムを取得し、データベースに保存します。

これにより、ユーザーがログアウトしたりマシンを変更したりしてもデータが永続的になりますが、ユーザーがログインしなくなるまで、情報を永続的に保存する方法がないため、永続的ではありません。

必要なデータの取得

カートまたはウィッシュリストにアクセスしようとしているときはいつでも、次のチェックを行ってください-

  • ユーザーがログインしていない場合は、セッションを調べてください
  • ユーザーがログインしている場合、データベースのみに保存している場合はデータベースにクエリを実行します。それ以外の場合は、データベースとともにセッションを更新している場合は、セッションを調べることができます。
于 2015-08-06T06:32:20.837 に答える
7

SESSIONに保存します。私のウィッシュリストはかなり長く、COOKIEが占有する可能性のある4Kストレージには収まらないのではないかと心配しています。これにより、セッションタイムアウトをより長い期間に設定する必要があります。

注:Cookieに関して非常に厳格なポリシーを採用している国(オランダなど)があり、法律によってセッションの使用を強制される場合があります。

于 2012-09-24T17:00:29.667 に答える
4

役立ついくつかのポイント:

クッキー:

  • 情報は、Cookieの有効期限が切れるまで保持されます(ユーザーが構成できるもの)。
  • サーバーとクライアント間の通信は、要求/応答ごとに交換する必要があるため、遅くなる傾向があります。
  • 安全でない形式のデータを保存し、簡単に盗聴できます。
  • また、データの保存にも制限があります。

セッション:

  • すべての情報はサーバーに保持されるため、クライアントと交換されることはありません。
  • ネットワーク全体で共有されないため、もう少し安全です。
  • セッションが終了すると、すべての情報が失われます。
  • 共有ホストでホストしている場合、同じサーバーでホストされているサイトのいずれかによってリソースがプッシュされるため、操作の途中でセッションが終了するという問題が発生する可能性があります。

私は中小規模のオーディエンスページを想定しているので、個人的にセッションに参加します。それが大きくなった場合は、このデータを格納するための単純なDB構造と、不要なデータのリッジを取得するためのメンテナンス計画(たとえば、一部の製品を選択するがチェックアウトを行わないクライアント)を使用する方がよいでしょう。

于 2012-09-24T17:08:25.807 に答える
3

両方の使用を検討してください。

の欠点$_SESSIONは、ブラウザを閉じるとセッションがクリアされることです。

セッションを使用しますが、Cookieが利用可能な場合は、Cookieから$_SESSIONデータを入力してみてください。

于 2012-09-24T17:16:32.537 に答える
2

私はセッションを使用します。ユーザーがCookieを無効にしている場合、セッションIDはユーザーのマシンにCookieで保存されているため、セッションを開始できません。

セッションをより長く維持するために確認したい設定がいくつかあります。

  • パラメータを設定session_set_cookie_params()して実行することにより、ユーザーがブラウザを閉じたときにセッションCookieが削除されないようにします。lifetimeこの関数は前に実行する必要がありますsession_start()

  • session.gc_probability, session.gc_divisor, session.gc_maxlifetimephp.iniでセッションガベージコレクションの設定を変更するか、次を使用して、サーバーからセッションがクリアされる頻度を延長することもできます。ini_set()

  • サーバー上で他のWebサイトを実行していて、上記のガベージコレクション設定を変更する場合は、それらをphp.iniで設定して、すべてのWebサイトに適用する必要があります。または、使用している場合は、ini_set()これらのセッションを別のWebサイトに保存することも検討してください。を変更することにより、他のWebサイトよりもディレクトリsession_save_path()。繰り返しますが、これはの前に実行されsession_start()ます。これにより、他のWebサイトのガベージコレクションによって、特定の1つのサイトの拡張セッションがクリアされるのを防ぐことができます。

  • また、php.iniで次のセッション設定を設定することをお勧めしますsession.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512。これにより、衝突の可能性が非常に少ない、暗号的に強力なセッションIDが得られるはずです。

  • また、セッションIDに対する中間者攻撃を防ぐために、サイトにSSL証明書があることを確認してください。

明らかに、ユーザーはセッションID Cookieを使用するすべてのCookieを手動でクリアすることを決定できますが、それは私が取る準備ができているリスクです。ショッピングカートシステムの途中でチェックアウトしていなかった場合、Cookieをクリアすることはありませんでした。私はまだセッションが単なるクッキーを使用するよりも優れていると思います。

セッションディレクトリにアクセスできる唯一のWebサイトであり、セッションIDが強力である限り、データは十分に安全です。また、サーバーのセッションストレージ時間を延長することで、データをサーバーに保持できます。

セッションをさらに強力にするために採用できる対策がさらにあります。データをコピーして、20分ごとにセッションIDを再生成します。また、データベースのIPアドレスに対してセッションIDを記録し、特定のIPアドレスが特定の時間にX個を超えるセッションIDを送信しようとしているかどうかを確認し、誰かがセッションIDをブルートフォース攻撃しようとするのを防ぎます。

サーバー上のセッションファイルではなく、セッションIDでリンクされたデータベースにデータを保存することもできます。ただし、これはCookieに保存されているセッションIDに依存しており、いつでも消える可能性があります。ユーザーがカートを紛失しないようにする唯一の方法は、最初にログインしてデータベースに保存することです。

于 2012-09-24T17:14:04.923 に答える