Автор Гілка: Рефакторинг. Хвастаюсь (хвалюсь, вихваляюсь)  (Прочитано 6203 раз)

gdekjifgb

  • Гість
Було отаке

    case 7:
        //var_dump($_POST);
        $skinid = $_POST['skinid'];
        if (!isset($skinid) or!is_numb($skinid)) {
            //var_dump($skinid);
            crit_err($ddb, 'not valid skinid in ssv7');
            exit;
        }
        is_skin_exist($ddb, $skinid);
        //если скин существует?
        //установить его       
        set_skin($ddb, $skinid);
        break;
##############################################
##############################################
##############################################
/**
 * Запсись о скине существует в бд? Если нет то ошибка 44 или crit_err
 * Если есть, то return TRUE
 * @param $ddb конект к бд
 * @param  $skinid
 * @return true OR er44
 */
function is_skin_exist($ddb, $skinid) {
    $q = 'select skinid from skin where skinid=?';
    $rawdata = mysqli_prepare($ddb, $q);

    qres('prep', $rawdata, $ddb);
//связываем параметры с метками

    $res = mysqli_stmt_bind_param($rawdata, 'i', $skinid);
//привязка параметров
    qres('bindpar', $res, $ddb);
    $res = mysqli_stmt_execute($rawdata); //query exec
    qres('exec', $res, $ddb);
    $x = numrow($rawdata, $ddb);
//$x сколько строк вернул селект
///////////////////////////////
    mysqli_stmt_close($rawdata);
//$x=1;
    if ($x == 0) {
//теми овормлення не знайдено
        er(44);
//exit;
    } elseif ($x == 1) {
        return(TRUE);
    } else {
// $x !=0 $x!=1
        crit_err($ddb, 'err in check_skin_exist x !=0 and != 1');
    }
}
##############################################
##############################################
##############################################
/**
 * установить скин и обновить каунтеры
 * баг!!! ВОЗМОЖНА ПОВТОРНАЯ УСТАНОВКА СКИНА И +1 КАУНТЕР СКИНОВ
 * ОБНАРУЖЕН 2017-02-25
 * решение: сделать перезагрузку профиля, чтобы в сессии был реальный скин
 * @param $ddb конект к бд
 * @param  $skinid
 * @return
 */
function set_skin($ddb, $skinid) {

    if (isset($_SESSION['uid'])) {
//2017-02-26 перезагрузить профиль, чтобы не было проблем с рачетом скин_каунтеров
        load_us_profile($ddb, $_SESSION['uid'], "r");

//если залогинен, обновить скинИДЩ в usopt
//но сначала проверить может меняют один и тот же скин
        if ($_SESSION['skinid_usopt'] == $skinid) {
//если меняют тот самый скин, редирект, потому что скин тот же самый
            header("Location: /newskins-pg1/");
//            header("Location: /show.php?wsh=8&pg=1");
            exit;
//и таким способом не будет лишних запросов
        }

//
//обновить и расчитать каунтеры и тоже их обновить
        $q = 'update usopt set skinid_usopt=? where uid_usopt=?';

        $rawdata = mysqli_prepare($ddb, $q);
        qres('prep', $rawdata, $ddb);
//связываем параметры с метками

        $res = mysqli_stmt_bind_param($rawdata, 'ii', $skinid, $_SESSION['uid']);
//привязка параметров
        qres('bindpar', $res, $ddb);
        $res = mysqli_stmt_execute($rawdata); //query exec
        qres('exec', $res, $ddb);
        $x = affrow($rawdata, $ddb);
        mysqli_stmt_close($rawdata);
//$x сколько строк обновлено
        if ($x != 1) {
//не удалось обновить: сообщить об этом
            er(47);
//не вдалось змінити тему оформлення
        }

//получить ДВА скин_каунтА скинов

        $q = 'SELECT min(CASE skinid WHEN ? THEN skin_count END) oldskcount, min(CASE skinid WHEN ? THEN skin_count END) newskcount FROM skin';
//первая колонка - теуущий (то есть тот что БЫЛ. Выше я уже "поменял" скин)
//вторая колонка - новый
        $rawdata = mysqli_prepare($ddb, $q);

        qres('prep', $rawdata, $ddb);
//связываем параметры с метками

        $res = mysqli_stmt_bind_param($rawdata, 'ii', $_SESSION['skinid_usopt'], $skinid);
//2017-02-25
//сессСкинИД=1 (НЕапктуальный), СкинИД=3 (постЗначение)
//ВОТ ТУТ И СЛУЧИЛАСЬ ОШИБКА
//
//привязка параметров
        qres('bindpar', $res, $ddb);
        $res = mysqli_stmt_execute($rawdata); //query exec
        qres('exec', $res, $ddb);
        $x = numrow($rawdata, $ddb);
//$x сколько строк вернул селект
//
//$x=3;
        if ($x != 1) {
            mysqli_stmt_close($rawdata);
            crit_err($ddb, 'q. ret. not 1 record in send:7 get too skin_counters in set_skin');
//2017-02-27
//при возникновении этой ошибки повторное обновление страницы обновляет скин
//в usopt но не обновляет каунтеры.
//при повторном обновлении страницы СессСкинИД уже будет изменен перезагрузкой профиля вначале фунции.
//И так как Скин будет один и тот же, исполнение кода до каунтеров не дойдет.
//Ошибки после повторного обовления страницы не будет.
//
//НО каунтеры не обновятся при первой смене скина. Применить транзакцию?
        }

//связываем переменные с результатами запроса
        $res = mysqli_stmt_bind_result($rawdata, $oldsk_count, $newsk_count);
        qres('bindres', $res, $ddb);
        $res = mysqli_stmt_fetch($rawdata);
        qres('fetch', $res, $ddb);
        mysqli_stmt_close($rawdata);

//echo "$oldsk_count | $newsk_count";
//echo '<br>';
        $oldsk_count = $oldsk_count - 1;
//2017-02-25
//0 был потому что в бд скинкаутер только +число
//
//нужно вначале вытягивать реально используемый скин из usopt
        $newsk_count = $newsk_count + 1;

//echo "old $oldsk_count | new $newsk_count";
//var_dump($_SESSION);
//записать новые значения скин_каунтов
        $q = 'update skin set skin_count=? where skinid=?';
        $rawdata = mysqli_prepare($ddb, $q);
        qres('prep', $rawdata, $ddb);
//связываем параметры с метками

        $res = mysqli_stmt_bind_param($rawdata, 'ii', $oldsk_count, $_SESSION['skinid_usopt']);
//сначала обновить тот что был

        qres('bindpar', $res, $ddb);
        $res = mysqli_stmt_execute($rawdata); //query exec
        qres('exec', $res, $ddb);
//echo "old $oldsk_count | new $newsk_count";
//потом обновить каунт того что установили
        $res = mysqli_stmt_bind_param($rawdata, 'ii', $newsk_count, $skinid);
//сначала обновить тот что был

        qres('bindpar', $res, $ddb);
        $res = mysqli_stmt_execute($rawdata); //query exec
        qres('exec', $res, $ddb);
        mysqli_stmt_close($rawdata);
    }//если залогинен
//     
//установить сесс переменную и редирект на первую страницу всех скинов.
    $_SESSION['skinid_usopt'] = $skinid;
    header("Location: /newskins-pg1/");
//    header("Location: /show.php?wsh=8&pg=1");
    exit;
//ВСЁ!
    return;
}


Стало таке
//применить скин
    case 7:
        $skinid = $_POST['skinid'];
        $ref=$_POST['ref'];
        if(!$vld->is_post_vars_set($skinid,$ref)){
            $rd->rd2_404();                 //позже блокировать
        }
        $vld->is_post_id_valid($skinid);    //позже блокировать
        OneSkin::set_skin();
        break;
##############################################
##############################################
##############################################
    private static function is_skin_exist() {
        $q = 'select skinid from skin where skinid=?';
        if (!Sql::is_int_in_tbl($q, $_POST['skinid'])) {
            $e=new Err();
            $e->er(44);     //НЕТ СКИНА
        }
    }

    public static function set_skin() {
        OneSkin::is_skin_exist();
        $ust = new UserStatus();
        $rd = new Redirect();
//незалогин - устан в сессии и всё
        if (!$ust->is_user_loged()) {
            OneSkin::set_skin_in_session();
        } else {
            if ($_SESSION['skinid_usopt'] == $_POST['skinid']) { 
//шобы не было ложной ошибки при обновлении уже установл скина и такое случилось(!) на
//https://youtu.be/O_unXPI-Zzw?t=2365 Установлен скин только в бд
                $rd->go_2url($_POST['ref']);
            }
            OneSkin::set_skin_for_loged_user();
            OneSkin::set_skin_in_session();
        }
        $rd->go_2url($_POST['ref']);
    }

    private static function set_skin_in_session() {
        $_SESSION['skinid_usopt'] = $_POST['skinid'];
    }

    private static function set_skin_for_loged_user() {
        $ddb = $_SESSION['ddb'];
        $q = 'update usopt set skinid_usopt=? where uid_usopt=?';
        $rawdata = $ddb->prepare($q);
        $qr = new Qresult();
        $qr->prep($rawdata);
        $res = $rawdata->bind_param('ii', $_POST['skinid'], $_SESSION['uid']);
        $qr->bindpar($res);
        $res = $rawdata->execute();
        $qr->exec($res);
        $x = $qr->affrow($rawdata);
        $rawdata->close();
        if ($x != 1) {
            $e = new Err();
            $e->er(47);     //не удалось сменить скин
                            //https://youtu.be/O_unXPI-Zzw?t=2548
                            //во время записи произошла ошибка потому что в бд уже установлен скин
        }
    }

Відео тут: https://www.youtube.com/watch?v=O_unXPI-Zzw Якщо на швидкості х2 і з перемотками де я клацав "Применить тему", то хвилин за 5 можна проглянути.
« Змінено: 2021-07-13 17:54:03 від gdekjifgb »