2015-02-23 72 views
2

到現在爲止,我總是在我的在線商店中使用PHP的$_SESSION登錄和購物車存儲。我是否可以安全地將購物車存儲更改爲PHP的setcookie,因爲我希望我的客戶長時間保留購物車?我擔心沒有啓用Cookie的客戶。是否有任何互聯網用戶沒有啓用Cookie?或者我應該使用$_SESSION作爲備份方法 - 例如,使用會話和cookie保存它們?

+0

*沒有啓用Cookie *您回答了您自己的問題。 < - – Rizier123 2015-02-23 09:08:21

+2

我認爲如果您想長時間節省時間,您必須將它們保存在數據庫中 – Rizier123 2015-02-23 09:12:10

+0

非常好的主意,這樣我就可以跟蹤我保存的購物車。但是,我如何識別每個訪客?我認爲'session_id'將不起作用。 – Kupigon 2015-02-23 09:22:25

回答

0

這就是我現在所做的。基本上,函數retrieveCart()檢索變量$_SESSION,並且updateCart()更新它。它通過購物車表的LastInsertId()識別每個購物車。

的functions.php:

function retrieveCart() { 
    global $DBH; 

    if(!isset($_SESSION['cart'])) { 
     if(isset($_COOKIE['cart_id'])) { 
      $STH = $DBH->prepare("SELECT content FROM carts_retail WHERE id=:id LIMIT 0,1"); 
      $STH->execute(array(
       'id' => $_COOKIE['cart_id'] 
      )); 

      if($STH->rowCount() == 1) { 
       while($row = $STH->fetch()) { 
        $_SESSION['cart'] = unserialize($row['content']); 
       } 
      } 
     } 
     else { 
      $STH = $DBH->prepare("INSERT INTO carts_retail (content, customer_id) VALUES (:content, :customer_id)"); 
      $STH->execute(array(
       'content' => serialize($_SESSION['cart']), 
       'customer_id' => (isset($_SESSION['username']) ? $_SESSION['username'] : 0) 
      )); 

      setcookie('cart_id', $DBH->LastInsertId(), strtotime('+30 DAYS')); 
     } 
    } 
} 

function updateCart($action = NULL, $content = NULL) { 
    global $DBH; 

    if($action == 'add') { 
     if(is_numeric($content['id']) && is_numeric($content['qty']) && strlen($content['size']) > 0) { 
      $_SESSION['cart'][$content['id']] = array('qty' => $content['qty'], 'size' => $content['size']); 
     } 
    } 

    if($action == 'delete') { 
     if(is_numeric($content['id'])) { 
      unset($_SESSION['cart'][$content['id']]); 
     } 
    } 

    $STH = $DBH->prepare("UPDATE carts_retail SET content=:content, customer_id=:customer_id WHERE id=:id LIMIT 1"); 
    $STH->execute(array(
     'id' => $_COOKIE['cart_id'], 
     'content' => serialize($_SESSION['cart']), 
     'customer_id' => (isset($_SESSION['username']) ? $_SESSION['username'] : 0) 
    )); 
} 

cart.php:

if(isset($_POST['action'])) { 
    if($_POST['action'] == 'add' || $_POST['action'] == 'delete') { 
     updateCart($_POST['action'], array(
      'id' => (isset($_POST['id']) ? $_POST['id'] : NULL), 
      'qty' => (isset($_POST['qty']) ? $_POST['qty'] : NULL), 
      'size' => (isset($_POST['size']) ? $_POST['size'] : NULL) 
     )); 

     header('Location: /cart'); 
    } 
} 
0

不是一個真正的回答你的問題,但澄清,因爲它似乎你有一些問題$_SESSION$_COOKIE的差值 - $_SESSION默認情況下使用Cookies,生存期是當前瀏覽器會話。一個唯一的會話ID存儲在客戶端的瀏覽器cookie上 - 使用此會話ID PHP會自動找到相應的會話值給此ID。基本上存儲在一個簡單的序列化文件在tmp文件夾中。 因此,正如你所看到的,SESSION永遠不會是(如果你將會話ID存儲在cookie中,因爲它默認爲PHP)是一個被禁用的Cookie的後備。 只是爲了讓你清楚。

+0

問題是因爲我使用了'$ _SESSION',所以當我重新打開我的瀏覽器,購物車正在消失。在我使用'setcookie'獲取購物車ID並將其與數據庫連接後,它會保留30天,這是我的目標。 – Kupigon 2015-02-23 11:13:04

+0

是的,只是想清除你的PHP行爲,因爲在我看來,你不知道SESSION ID也通過cookie存儲。將數據存儲在Cookie中的時間長於瀏覽器會話的一般想法是正確的。 – 2015-02-23 12:44:54

+0

因此,會話ID保存在cookie中的時間有多長?目前,我將購物車ID保存了30天。謝謝。 – Kupigon 2015-02-23 13:27:26