PHP и JS — значение cookie в операторе If вызывает ошибку

Я пытаюсь создать функцию с HTML, JS и PHP, которая делает следующее:

  1. Когда кнопка HTML нажата, она передает значения массиву $_GET;
  2. Когда эти значения существуют в массиве $_GET, появляется окно подтверждения JavaScript;
  3. Если пользователь нажимает OK, JS присваивает массиву $_COOKIE значение true. Если пользователь нажимает CANCEL, JS присваивает массиву $_COOKIE значение false;
  4. Наконец массив $_COOKIE проверяется с помощью PHP, и если это true, он что-то делает. В противном случае он ничего не делает.

Где код для каждого шага:

// STEP 1
<a href="page.php?remove=true&id-organ=1">Remove</a>

// STEP 2 AND 3
if (isset($_GET['remove']) && isset($_GET['id-organ'])) {
       echo '
           <script>
                var option = confirm("REMOVE?");
                if (option == true) {
                    document.cookie = "option = true";
                } else {
                    document.cookie = "option = false";
                }
           </script>
       ';
}

// STEP 4
if ($_COOKIE['option'] == true) {
    echo '
        <script>
            window.alert("ORGAN WAS REMOVED!\n");
        </script>
    ';
    
} 

Если нажать JS Confirm Window OK, все работает нормально, отлично, без проблем.

Если нажать кнопку CANCEL в окне подтверждения JS, оператор STEP 4 if все равно будет выполнен.

  • Я попытался console.log(option), что неверно для кнопки ОТМЕНА.
  • Я попытался echo $_COOKIE['option'], что также неверно для кнопки ОТМЕНА.

Это не имеет никакого смысла, будучи буквально против всего программирования физики. . .

Может кто-нибудь сказать мне, почему это происходит? Я делаю что-то неправильно? Есть ли лучший способ для этого типа функциональности?


person Grinnex.    schedule 11.05.2020    source источник
comment
PHP работает на сервере, JavaScript на клиенте, они не работают одновременно. Итак, как выполняются шаги 2 и 3?   -  person epascarello    schedule 12.05.2020
comment
Хорошо, когда вы узнаете, что то, что вы делаете, потребует отправки формы обратно на сервер, вы это поймете. PHP выполнит код, а затем загрузится страница. Он не сидит и не ждет выполнения JavaScript. (И я не минусовал)   -  person epascarello    schedule 12.05.2020
comment
Так почему же истинное значение работает нормально, а ложное — нет? Мне жаль, что я сказал это о понижении голоса ... Если это был не ты, то я действительно имел в виду это. Мне жаль.   -  person Grinnex.    schedule 12.05.2020
comment
Я бы вернулся к чертежной доске и узнал о AJAX и разделении PHP, HTML и Javascript. Поскольку PHP обрабатывается ДО того, как Javascript даже отправляется в браузер для запуска, вы получите результаты, которых не ожидаете. Таким образом, изучение того, как их разделить, позволит вам изучить лучшие практики, а также ограничить странные ошибки, которые появятся, когда вы объедините их вместе.   -  person imvain2    schedule 12.05.2020
comment
потому что у вас уже есть файл cookie, установленный во второй раз, когда вы запустили его?   -  person epascarello    schedule 12.05.2020
comment
Я так подумал и решил вывести значение cookie перед вводом второго оператора if. Он имеет значение false, поэтому нет смысла вводить в оператор if...   -  person Grinnex.    schedule 12.05.2020
comment
если вы не перезагружаете страницу, у нее НЕТ возможности войти в код. Код PHP будет выполняться полностью снизу вверх и создавать страницу, на которой находится JavaScript. Они не взаимодействуют... Итак, когда вы устанавливаете файл cookie в JavaScript, if ($_COOKIE['option'] == true) { уже выполняется.   -  person epascarello    schedule 12.05.2020
comment
Я перезагружаю всю страницу, я не помещаю весь код, который у меня есть, чтобы он не запутался. Страница перезагружается на ШАГЕ 1. ШАГ 4 работает нормально, если значение файла cookie истинно. Так что это означает, что он не запускается раньше.   -  person Grinnex.    schedule 12.05.2020
comment
@epascarello Я просто хочу сказать спасибо за ваше время и мнение! ????   -  person Grinnex.    schedule 12.05.2020
comment
@imvain2 Я просто хочу сказать спасибо за ваше время и мнение! ????   -  person Grinnex.    schedule 12.05.2020
comment
@Grinnex. Я не знаю PHP, но не уверен, как строка cookie соответствует логическому значению true.   -  person epascarello    schedule 12.05.2020
comment
@epascarello - Сначала я тоже так подумал. Однако, чтобы быть строкой, назначение файла cookie должно иметь кавычки, подобные этому. Проблема определенно в переменной Cookie. . . Просто не знаю, как это исправить. Я пробовал несколько подходов, и когда он получает ложное значение, он все равно входит в оператор if. Это не имеет никакого смысла. . .   -  person Grinnex.    schedule 12.05.2020
comment
Значение файла cookie, которое вы устанавливаете в JS, всегда представляет собой строку. Но ваше сравнение в PHP неверно, потому что там вы не сравниваете со строкой. Значения text 'true' и 'false' оба являются истинными в PHP - 'true' == true и 'false' == true оба дают true. Здесь вам нужно if ($_COOKIE['option'] == 'true') (или даже ===, чтобы быть абсолютно уверенным, что нет никакой двусмысленности.)   -  person CBroe    schedule 12.05.2020
comment
@CBroe, ты потрясающий! Поздравляем! Ваше решение работает! Однако я был вынужден изменить оператор If на false, потому что функции обратной связи были противоположными. Быть true не входящим в if и false входящим в If .   -  person Grinnex.    schedule 12.05.2020
comment
@CBroe опубликуйте ответ, чтобы я мог проголосовать :) Большое спасибо! ????   -  person Grinnex.    schedule 12.05.2020


Ответы (1)


Значение файла cookie, которое вы устанавливаете в JS, всегда является строкой. (Содержимое файлов cookie является простым текстом по определению. Никто не запрещает вам интерпретировать это значение как нечто другое, после того, как вы получили его в строковой форме. - вы можете, например, установить объект в формате JSON в качестве значения cookie, но это не меняет того факта, что значение самого cookie всегда будет текстом.)

if ($_COOKIE['option'] == true)

Ваше сравнение в PHP здесь неверно, потому что здесь вы не сравниваете со строкой.

Значения текста 'true' и 'false' оба являются истинными в PHP - 'true' == true и 'false' == true оба дают истину.

Здесь вам нужно if ($_COOKIE['option'] == 'true') (или даже ===, чтобы быть абсолютно уверенным, что нет никакой двусмысленности.)

person CBroe    schedule 12.05.2020
comment
Просто хочу еще раз сказать СПАСИБО ???? - person Grinnex.; 12.05.2020