ユーザー用とアイテム用の2つのテーブルがある場合は、次のように実行できます。
item_idsをシリアル化された配列に追加および削除して、現在のバスケットアイテムを管理します。この配列は、ユーザーテーブルとセッションに同時に保存して、同期を維持できます。たとえば、ユーザーが初めてストアにアクセスした場合(ログインしておらず、買い物かごが空の場合)、そのようにセッションを作成できます。
session_start();
セッションを開始します。
if (isset($_SESSION['current_basket']) {
$current_basket = unserialize($_SESSION['current_basket']);
} else {
$current_basket = array();
}
訪問者がページにアクセスするのはこれが初めてであるため、セッション変数current_basketは設定されません。つまり、上記のifステートメントは実行されず、代わりにcurrent_basketという変数に空のPHP配列が作成されます。
これで、訪問者がバスケットにアイテムを追加するときに、データベースにアイテムのIDが必要であり、それをcurrent_basket配列に追加するだけです。
$current_basket[] = $item_id;
次に、セッション変数を新しい配列ですぐに更新し、プロセスでシリアル化します。
$_SESSION['current_basket'] = serialize($current_basket);
これで、その人の買い物かごのすべての商品IDを含む適切で使用可能な配列ができました。
ここで、ユーザーがログインしているとしましょう。それを確認し、ステップを1つだけ追加します。
$sql = "UPDATE users SET current_basket=" . serialize($current_basket) . " WHERE id=$user_id"
// Execute that query.
これで、同じ配列がデータベースにあり、ユーザーがログインしたときにプルしてセッション変数として設定できます。
これらの一連の手順は、製品が追加または削除されるたびに実行でき、セッションとデータベースの両方で更新されたままになります。
これは明らかに、説明のために非常に骨の折れる概念です。明らかに、アレイをより適切に管理する必要があります。たとえば、商品がすでにある場合はバスケットに商品を追加せず、配列から商品を削除します...など。
重要なのは、配列をシリアル化し、常にセッションに格納し、ユーザーがログインしている場合はusersテーブルに格納することです。
その後、ユーザーが戻ってきてログインすると、ユーザーがサイトに最後にアクセスしたときのデータベースの配列を使用して、セッションに配列を設定できます。