Модуль Сохранение корзины в базе

  1. Следует ли это понимать так, что код выполняется, ошибки на экране не появляются. Правильно?
  2. Хочу уточнить

    это значит, что в таблице s_carts не существует строки, в которой столбец user_id равен id зарегистрированного пользователя. Правильно?
  3. Или строка в таблице s_carts, в которой столбец user_id равен id зарегистрированного пользователя, существует, но ее содержимое не отображается в корзине?
Ошибки нет.
В БД столбец user_id записывает id пользователя. Но меня смущает что столбец CODE записывает а значение пустое, а если user_id стоит id то CODE пусто. так и должно быть?
Через время (+- сутки) выходит из аккаунта как стандартно у Simpla
 

Вложения

  • rrrrf.png
    rrrrf.png
    64 KB · Просмотры: 9
меня смущает что столбец CODE записывает а значение пустое, а если user_id стоит id то CODE пусто. так и должно быть?
Да, так записано в коде: если пользователь не зарегистрирован, то user_id = 0, если зарегистрирован, то code = ''
PHP:
public function cart_to_base()
{
    // удалить корзину для незарегистрированного пользователя
    $query = $this->db->placehold("DELETE FROM __carts WHERE code=?",
                                  /* находим корзину по shopping_cart_code */
                                  $_COOKIE['shopping_cart_code']);
    $this->db->query($query);
    // если пользователь зарегистрирован
    if($_SESSION['user_id'])
    {
        // удалить корзину для зарегистрированного пользователя
        $query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?",
                                      /* находим корзину по 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=?",
            /*
            значение code записывается первый раз
            code=$_COOKIE['shopping_cart_code'], user_id=0
            */
            $_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=?",
                /* code= '', user_id=$_SESSION['user_id'] */
                '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart'])
            );
            $this->db->query($query);
        }
    }
}

Корзина записывается в базу два раза - у Вас на картинке есть повторяющиеся строки с одинаковым содержанием корзины (столбец cart) для (user_id = 27, 30, 31 и 40) есть такие же строки когда (user_id == 0), а значение для code какое-то свое.
Следует немного изменить код - в базу будет записываться только одна строка.

PHP:
public function cart_to_base()
{
    // подготовить команду удаления корзины для незарегистрированного пользователя
    $query = $this->db->placehold("DELETE FROM __carts WHERE code=?",
                                  /* находим корзину по shopping_cart_code */
                                  $_COOKIE['shopping_cart_code']);
     // пока не выполняем команду
    // $this->db->query($query);
    // если пользователь зарегистрирован
    if($_SESSION['user_id'])
    {
        // заменить команду удаления для зарегитстрированного пользователя
        $query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?",
                                      /* находим корзину по user_id */
                                      $_SESSION['user_id']);
    }
    // выполнить команду удаления один раз
    $this->db->query($query);
    // если корзина есть в кукисах
    if($_SESSION['shopping_cart'])
    {
        // если пользователь зарегистрирован, то записать корзину второй раз
        if($_SESSION['user_id'])
        {
            // записать корзину в базу для зарегистрированного пользователя
            $query = $this->db->placehold(
                "INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?",
                /* code= '', user_id=$_SESSION['user_id'] */
                '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart'])
            );
            $this->db->query($query);
            // выйти
            return;
        }
        // записать корзину в базу
        $query = $this->db->placehold(
            "INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?",
            /*
            значение code записывается первый раз
            code=$_COOKIE['shopping_cart_code'], user_id=0
            */
            $_COOKIE['shopping_cart_code'], 0, serialize((array)$_SESSION['shopping_cart'])
        );
        $this->db->query($query);
    }
}
 
Последнее редактирование:
PHP:
public function cart_to_base()
{
    // подготовить команду удаления корзины для незарегистрированного пользователя
    $query = $this->db->placehold("DELETE FROM __carts WHERE code=?",
                                  /* находим корзину по shopping_cart_code */
                                  $_COOKIE['shopping_cart_code']);
     // пока не выполняем команду
    // $this->db->query($query);
    // если пользователь зарегистрирован
    if($_SESSION['user_id'])
    {
        // заменить команду удаления для зарегитстрированного пользователя
        $query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?",
                                      /* находим корзину по user_id */
                                      $_SESSION['user_id']);
    }
    // выполнить команду удаления один раз
    $this->db->query($query);
    // если корзина есть в кукисах
    if($_SESSION['shopping_cart'])
    {
        // если пользователь зарегистрирован, то записать корзину второй раз
        if($_SESSION['user_id'])
        {
            // записать корзину в базу для зарегистрированного пользователя
            $query = $this->db->placehold(
                "INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?",
                /* code= '', user_id=$_SESSION['user_id'] */
                '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart'])
            );
            $this->db->query($query);
            // выйти
            return;
        }
        // записать корзину в базу
        $query = $this->db->placehold(
            "INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?",
            /*
            значение code записывается первый раз
            code=$_COOKIE['shopping_cart_code'], user_id=0
            */
            $_COOKIE['shopping_cart_code'], 0, serialize((array)$_SESSION['shopping_cart'])
        );
        $this->db->query($query);
    }
}
Теперь не удаляется из корзины.
На поля мне какбы все равно, мне главное чтобы пользователь оставался авторизованным на сайте
 
Теперь не удаляется из корзины.
Простите, вчера накосячил в коде - торопился с ответом. (самому стыдно)
PHP:
public function cart_to_base()
{
    // user_id в базе всегда число > 0
    $user_id = 0;
    // если пользователь зарегистрирован
    if($_SESSION['user_id'])
    {
        $user_id = $_SESSION['user_id'];
    }
    // подготовить команду удаления корзины для $_COOKIE['shopping_cart_code'] ИЛИ user_id
    $query = $this->db->placehold(
        "DELETE FROM __carts WHERE code=? OR user_id=?",
        /* находим корзину по shopping_cart_code */
        $_COOKIE['shopping_cart_code'],
        /* или находим корзину по user_id */
        $user_id);
    // выполнить команду удаления один раз
    $this->db->query($query);
   
    // если корзина есть в кукисах
    if($_SESSION['shopping_cart'])
    {
        // записать корзину в базу
        $query = $this->db->placehold(
            "INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?",
/*          значение code записывается первый раз
            code=$_COOKIE['shopping_cart_code'],
            user_id уже определили раньше (0 или $_SESSION['user_id']) */
            $_COOKIE['shopping_cart_code'], $user_id, serialize((array)$_SESSION['shopping_cart'])
        );
        $this->db->query($query);
    }
}

Просто замечание
PHP:
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);
 
Последнее редактирование:
Простите, вчера накосячил в коде - торопился с ответом. (самому стыдно)
PHP:
public function cart_to_base()
{
    // user_id в базе всегда число > 0
    $user_id = 0;
    // если пользователь зарегистрирован
    if($_SESSION['user_id'])
    {
        $user_id = $_SESSION['user_id'];
    }
    // подготовить команду удаления корзины для $_COOKIE['shopping_cart_code'] ИЛИ user_id
    $query = $this->db->placehold(
        "DELETE FROM __carts WHERE code=? OR user_id=?",
        /* находим корзину по shopping_cart_code */
        $_COOKIE['shopping_cart_code'],
        /* или находим корзину по user_id */
        $user_id);
    // выполнить команду удаления один раз
    $this->db->query($query);
  
    // если корзина есть в кукисах
    if($_SESSION['shopping_cart'])
    {
        // записать корзину в базу
        $query = $this->db->placehold(
            "INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?",
/*          значение code записывается первый раз
            code=$_COOKIE['shopping_cart_code'],
            user_id уже определили раньше (0 или $_SESSION['user_id']) */
            $_COOKIE['shopping_cart_code'], $user_id, serialize((array)$_SESSION['shopping_cart'])
        );
        $this->db->query($query);
    }
}

Просто замечание
PHP:
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);

К сожалению все равно логирование не сохраняет((((

Только сейчас заметил, что перестала сохраняться корзина в бд
 
Последнее редактирование модератором:
Назад
Сверху