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 //во время записи произошла ошибка потому что в бд уже установлен скин } }