Isolution666
@Isolution666
Full-Stack Developer

Путаница в куках. Почему заданный куки применяется со второго клика?

Здравствуйте.
--
Предистория:
Совсем потерял терпение и силы, перепробовал массу вариантов и комбинаций, включал логику. Но ничего не менялось. Сделал самопис, где выполняется простая задача, через куки подставлять название нужной папки, в зависимости от того, к какой был сделан запрос. Запрос делается методом POST, он меняет пути к файлам. Результат моих мучений привёл к тому, что работает по системе двойного клика. Первый раз кликаешь, срабатывает папка по умолчанию, потому что если убрать папку по умолчанию сыпется весь сайт. Есть три папки, в каждой файл с одним и тем же именем, но с разными переменными, переменные меняют язык сайта. Гугл транслит не подходит, get запросы недопустимы. Плюс болит голова чтобы не слетал куки после двух кликов по ссылкам. Задержать их на сутки. Вот мой горе код, каюсь, всё что мог сделать:

<?php 
    session_start();
    $value = $_POST['languen'];
    setcookie("lang", $value);
    if($value == '') {$value = 'en';}  // если не было post запроса, по умолчанию ставим en
    if($_COOKIE["lang"]){$live = $value;} // если куки есть, даём переменной значение $value
    elseif(!$_COOKIE["lang"]){$live = 'en';} // если куки нет, возвращаем значение по умолчанию, иначе ошибка
    else{$live = $value;} // в противном случае пытаемся отдать переменной то, что отправили через post
?>
<?php require_once ''.$live.'/function.php';  // тут подставляется куки папка ?>


Последовательность переменных вроде не нарушена, в противном случае, сайт бы рухнул, а так язык меняется, пусть и со второго раза, и держится до второго перехода по ссылке.

===================================================================================
Вопрос:
Где моя ошибка? Что я сделал не так, почему применяется со второго клика и пропадает тоже?
Как задержать куки на сутки, и как заставить применяться с первого клика. Чтение документации привело к такому коду, как написан выше. Мне надо показать и объяснить мою ошибку, чтобы я понял, как это работает. Уже второй месяц бьюсь, а результат не сдвинулся. Помогите разобраться.
--
Заранее благодарю за отзывчивость.
  • Вопрос задан
  • 345 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Примерно так:
$default = 'en'; // по умолчанию
$allowed = ['en', 'ru', 'fr']; // допустимые языки
$current = empty($_COOKIE["lang"]) ? $default : $_COOKIE["lang"];
$new = empty($_POST["lang"]) ? null : $_POST["lang"];
if ($new && // если был пост запрос
  in_array($new, $allowed) && // и если новое значение в списке допустимых
  $new !== $current) { // и отличается от текущего
  $current = $new;
  setcookie("lang", $new, time()+60*60*24); // http://php.net/manual/ru/function.setcookie.php
}

require_once $current . '/function.php';

И лучше бы убрать это из глобальной области видимости.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@ozornick
Месяц это очень долго....
if ($_COOKIE["lang"]) {
$live = $value;  // присваиваете опять пост, а не кукис
}
if ($_COOKIE["lang"]) {
$live = $_COOKIE['lang'];
}

Ну и естественно так просто подставлять нельзя
Ответ написан
Комментировать
ArtamonovDenis
@ArtamonovDenis
Full-stack developer
1. если мы получили lang из post , тогда мы можем его сразу и подставить в php require_once ''.$live.'/function.php';
и сохранить это значение на будущее в куки
2. если мы значение из пост не получили, тогда по умолчанию en

Пример:

<?php
session_start();

$data = &$_POST;

# 1
$lang = ($data['languen']) ? $data['languen'] : 'en';

# 2
setcookie('lang', $lang);

# 3
require_once '/' .  $lang . '/function.php';
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект