p1kka
Постоялец
- Регистрация
- 12 Авг 2009
- Сообщения
- 89
- Реакции
- 24
- Автор темы
- #1
Сохранение корзины в базе
Для просмотра скрытого содержимого вы должны войти или зарегистрироваться.
Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Доброго времени суток!
Есть ли у кого-нибудь модуль записи корзины в базу данных?
create table s_carts (code varchar(255) not null, user_id int(11), cart text, primary key (user_id, code)) default charset=utf8
public function cart_to_base()
{
$query = $this->db->placehold("DELETE FROM __carts WHERE code=?", $_COOKIE['shopping_cart_code']);
$this->db->query($query);
if($_SESSION['user_id']){
$query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?", $_SESSION['user_id']);
$this->db->query($query);
}
if($_SESSION['shopping_cart']){
$query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", $_COOKIE['shopping_cart_code'], 0, serialize((array)$_SESSION['shopping_cart']));
$this->db->query($query);
if($_SESSION['user_id']){
$query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart']));
$this->db->query($query);
}
}
}
public function base_to_cart($param, $add='max')
{
if(empty($param)) return;
// $this->db->query("SELECT cart FROM __carts WHERE code=? OR user_id=? LIMIT 1", $param, $param);
$this->db->query("SELECT cart FROM __carts WHERE code=? OR (user_id>0 AND user_id=?) LIMIT 1", $param, $param);
if($c=$this->db->result('cart'))
$bcs = unserialize($c);
if ($bcs){
if($add=='max'){
if(is_array($bcs))foreach ($bcs as $variant_id => $amount) {
if(isset($_SESSION['shopping_cart'][$variant_id]))
$_SESSION['shopping_cart'][$variant_id]=max($_SESSION['shopping_cart'][$variant_id], (int)$amount);
else
$_SESSION['shopping_cart'][$variant_id]=$amount;
}
}else
$_SESSION['shopping_cart']=$bcs;
}
$this->check_cart();
}
public function check_cart()
{
$sc=(array)$_SESSION['shopping_cart'];
$variant_ids=array_keys($sc);
if(empty($variant_ids))
return;
$_SESSION['shopping_cart']=array();
$variants=$this->variants->get_variants(array('id' => $variant_ids));
if(is_array($variants))foreach ($variants as $variant) {
$vids[]=$variant->id;
}
if(is_array($variants))foreach ($variants as $variant) {
$id=$variant->id;
if(!($sc[$id]>0))continue;
if($variant->infinity)
$_SESSION['shopping_cart'][$id]=$sc[$id];
elseif($sc[$id]<=$variant->stock)
$_SESSION['shopping_cart'][$id]=$sc[$id];
elseif($variant->stock>0)
$_SESSION['shopping_cart'][$id]=$variant->stock;
}
}
// Если товар существует, добавим его в корзину
if(!empty($variant) && ($variant->stock>0) )
{
// Не дадим больше чем на складе
$amount = min($amount, $variant->stock);
$_SESSION['shopping_cart'][$variant_id] = intval($amount);
$this->cart_to_base();
unset($_SESSION['shopping_cart'][$variant_id]);
$this->cart_to_base();
unset($_SESSION['shopping_cart']);
unset($_SESSION['coupon_code']);
$this->cart_to_base();
public function get_cart()
{
$cart = new stdClass();
$cart->purchases = array();
$cart->total_price = 0;
$cart->total_products = 0;
$cart->coupon = null;
$cart->discount = 0;
$cart->coupon_discount = 0;
if(!isset($_COOKIE['shopping_cart_code'])){
$sid=session_id();
$_COOKIE['shopping_cart_code']=$sid;
setcookie("shopping_cart", $sid, time()+365*24*3600, '/');
$this->cart->base_to_cart($_COOKIE['shopping_cart_code']);
}
$_SESSION['user_id'] = $user_id;
$this->cart->base_to_cart($user_id);
$this->cart->cart_to_base();
$_SESSION['user_id'] = $user_id;
$this->cart->base_to_cart($user_id);
$this->cart->cart_to_base();
public function base_to_cart($param, $add='max')
{
if(empty($param)) return;
// $this->db->query("SELECT cart FROM __carts WHERE code=? OR user_id=? LIMIT 1", $param, $param);
$this->db->query("SELECT cart FROM __carts WHERE code=? OR (user_id>0 AND user_id=?) LIMIT 1", $param, $param);
if($c=$this->db->result('cart'))
$bcs = unserialize($c);
if ($bcs){
if($add=='max'){
if(is_array($bcs))foreach ($bcs as $variant_id => $amount) {
if(isset($_SESSION['shopping_cart'][$variant_id]))
$_SESSION['shopping_cart'][$variant_id]=max($_SESSION['shopping_cart'][$variant_id], (int)$amount);
else
$_SESSION['shopping_cart'][$variant_id]=$amount;
}
}else
$_SESSION['shopping_cart']=$bcs;
}
$this->check_cart();
$this->cart_to_base();
}
Это id вариантаВот с этим: $variant_id не совсем ясно, поясните пожалуйста.
а как сделать для пользователя? Если пользователь авторизиривон то тоже сохранить его в БД?Держи
1. SQL
Код:create table s_carts (code varchar(255) not null, user_id int(11), cart text, primary key (user_id, code)) default charset=utf8
2. api/Cart.php
2.1. В конце перед заключительным "}" вставить
Код:public function cart_to_base() { $query = $this->db->placehold("DELETE FROM __carts WHERE code=?", $_COOKIE['shopping_cart_code']); $this->db->query($query); if($_SESSION['user_id']){ $query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?", $_SESSION['user_id']); $this->db->query($query); } if($_SESSION['shopping_cart']){ $query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", $_COOKIE['shopping_cart_code'], 0, serialize((array)$_SESSION['shopping_cart'])); $this->db->query($query); if($_SESSION['user_id']){ $query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart'])); $this->db->query($query); } } } public function base_to_cart($param, $add='max') { if(empty($param)) return; // $this->db->query("SELECT cart FROM __carts WHERE code=? OR user_id=? LIMIT 1", $param, $param); $this->db->query("SELECT cart FROM __carts WHERE code=? OR (user_id>0 AND user_id=?) LIMIT 1", $param, $param); if($c=$this->db->result('cart')) $bcs = unserialize($c); if ($bcs){ if($add=='max'){ if(is_array($bcs))foreach ($bcs as $variant_id => $amount) { if(isset($_SESSION['shopping_cart'][$variant_id])) $_SESSION['shopping_cart'][$variant_id]=max($_SESSION['shopping_cart'][$variant_id], (int)$amount); else $_SESSION['shopping_cart'][$variant_id]=$amount; } }else $_SESSION['shopping_cart']=$bcs; } $this->check_cart(); } public function check_cart() { $sc=(array)$_SESSION['shopping_cart']; $variant_ids=array_keys($sc); if(empty($variant_ids)) return; $_SESSION['shopping_cart']=array(); $variants=$this->variants->get_variants(array('id' => $variant_ids)); if(is_array($variants))foreach ($variants as $variant) { $vids[]=$variant->id; } if(is_array($variants))foreach ($variants as $variant) { $id=$variant->id; if(!($sc[$id]>0))continue; if($variant->infinity) $_SESSION['shopping_cart'][$id]=$sc[$id]; elseif($sc[$id]<=$variant->stock) $_SESSION['shopping_cart'][$id]=$sc[$id]; elseif($variant->stock>0) $_SESSION['shopping_cart'][$id]=$variant->stock; } }
2.2. в 2-х местах
после
Код:// Если товар существует, добавим его в корзину if(!empty($variant) && ($variant->stock>0) ) { // Не дадим больше чем на складе $amount = min($amount, $variant->stock); $_SESSION['shopping_cart'][$variant_id] = intval($amount);
вставить
Код:$this->cart_to_base();
2.3.
после
вставитьКод:unset($_SESSION['shopping_cart'][$variant_id]);
Код:$this->cart_to_base();
2.4.
после
вставитьКод:unset($_SESSION['shopping_cart']); unset($_SESSION['coupon_code']);
Код:$this->cart_to_base();
2.5.
после
Код:public function get_cart() { $cart = new stdClass(); $cart->purchases = array(); $cart->total_price = 0; $cart->total_products = 0; $cart->coupon = null; $cart->discount = 0; $cart->coupon_discount = 0;
вставить
Код:if(!isset($_COOKIE['shopping_cart_code'])){ $sid=session_id(); $_COOKIE['shopping_cart_code']=$sid; setcookie("shopping_cart", $sid, time()+365*24*3600, '/'); $this->cart->base_to_cart($_COOKIE['shopping_cart_code']); }
3. view/LoginView.php - в 2-х местах
после
Код:$_SESSION['user_id'] = $user_id;
вставить
Код:$this->cart->base_to_cart($user_id); $this->cart->cart_to_base();
4. view/RegisterView.php
после
Код:$_SESSION['user_id'] = $user_id;
вставить
Код:$this->cart->base_to_cart($user_id); $this->cart->cart_to_base();
В пункте 2.1 уже сделано для зарегистрированных пользователей.а как сделать для пользователя? Если пользователь авторизиривон то тоже сохранить его в БД?
$_SESSION['user_id']
Значит не работает.В пункте 2.1 уже сделано для зарегистрированных пользователей.
- идентификатор зарегистрированного пользователя.PHP:$_SESSION['user_id']
Значит не работает.
Логирование не сохраняется
это значит, что в таблице s_carts не существует строки, в которой столбец user_id равен id зарегистрированного пользователя. Правильно?Логирование не сохраняется