PHP 7 - операторы IF, похоже, не работают при попытке обнаружить KEYS в массивах $ _SESSION - PullRequest
0 голосов
/ 17 февраля 2019

[ PHP 7.1 ]

Ниже вы можете увидеть мой код PHP.Моя проблема возникает из-за того, что мне трудно понять, почему второй оператор IF не работает с массивом $ _SESSION ['items'], но работает с тестовым массивом $ zoo (я только что создал $ zoo, чтобы делать тесты вместо $_SESSION ['items']).

У меня есть сценарий AJAX, который отправляет данные POST в код PHP, а затем записывает ответ в консоль браузера, чтобы я мог просмотреть результаты.Все работало нормально с моими тестами, все изменения, вносимые в другие массивы, где выполнялись с хорошими результатами, единственная проблема, которую я не мог понять и решить, даже после тщательного поиска некоторых подсказок в Интернете и пробуя разные вещи, это загадочные способымассива $ _SESSION, который, похоже, не любит подвергать свои ключи скрытым операторам IF ... И я попал сюда, пытаясь обнаружить наличие ключа внутри массива, чтобы увеличить его значение.То, что я уже делал ранее с другими массивами, которые не были массивами $ _SESSION, и это работало просто отлично.

session_start();

$_SESSION['items'] = array();
$zoo['animals'] = array('tiger'=>2,'lion'=>3);

if(isset($_POST['item_name'])) {
    if (isset($_SESSION['items'][$_POST['item_name']]) || array_key_exists($_POST['item_name'], $_SESSION['items'])) {
        $_SESSION['items'][$_POST['item_name']]['qnt']++;

    } else {
        $_SESSION['item_name'][$_POST['item_name']] = array('model'=>$_POST['item_model'], 'qnt'=>1);

    }

    echo json_encode($_SESSION['items']);

    exit();
  }

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Как отмечает @artisticphoenix -

session_start();

// Check to see if there is a session variable before clearing it
// You only want to initialize it once
if (!isset($_SESSION['items'])) {
        $_SESSION['items'] = [];
}
$zoo['animals'] = array('tiger'=>2,'lion'=>3);

if(isset($_POST['item_name'])) {
        // This test is sufficient to check if the session variable has been set
        if (isset($_SESSION['items'][$_POST['item_name']])) {
                $_SESSION['items'][$_POST['item_name']]['qnt']++;
        } else {
                $_SESSION['items'][$_POST['item_name']] = array('model'=>$_POST['item_model'], 'qnt'=>1);

        }

        echo json_encode($_SESSION['items']);

        exit();
}

$ _ SESSION ['item_name'] должно быть $ _SESSION ['items']

0 голосов
/ 17 февраля 2019

Это упрощенная версия вашего кода, содержащая только важные вещи

 session_start();

 $_SESSION['items'] = array(); //items is now emtpy

 if (isset($_SESSION['items'][$_POST['item_name']]) || array_key_exists($_POST['item_name'], $_SESSION['items'])) {

 }

Это должно немного облегчить просмотр, поэтому просто потому, что items - пустой массив.Сделайте, чтобы назначить это как таковое перед условием.

Чтобы исправить это, удалите эту строку:

$_SESSION['items'] = array();

ИЛИ еще лучше:

$_SESSION['items'] = isset($_SESSION['items']) ? $_SESSION['items'] : [];

ИЛИ даже

if(!isset($_SESSION['items'])) $_SESSION['items'] = [];

Все готововам, как вы это исправите, но я уверен, что вы не хотите сбрасывать это в пустой массив.Это очень простая ошибка, которую трудно найти, потому что это технически допустимый код PHP.У меня просто есть встроенный отладчик в моей голове, из-за многолетнего кодирования ... смеется ... В большинстве случаев я могу буквально представить себе, как что-то будет выполняться.

Ура!

...