Функция $ _SESSION не работает [дубликат]

Если вы не используете jQuery в своем коде, этот ответ для вас

Ваш код должен быть чем-то вроде этого:

function foo() {
    var httpRequest = new XMLHttpRequest();
    httpRequest.open('GET', "/echo/json");
    httpRequest.send();
    return httpRequest.responseText;
}

var result = foo(); // always ends up being 'undefined'

Феликс Клинг отлично справился с написанием ответа для людей, использующих jQuery для AJAX, я решил предоставить альтернативу для людей, которые этого не делают.

( Примечание. используя новый API fetch, угловые или обещания, я добавил еще один ответ ниже )


То, с чем вы столкнулись

Это краткое резюме «Объяснение проблемы» из другого ответа, если вы не уверены, прочитав это, прочитайте это.

A в AJAX означает асинхронность. Это означает, что отправка запроса (или, скорее, получение ответа) вынимается из обычного потока выполнения. В вашем примере .send немедленно возвращается, а следующий оператор return result; выполняется до того, как функция, которую вы передали, когда был вызван обратный вызов success.

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

Вот простая аналогия

function getFive(){ 
    var a;
    setTimeout(function(){
         a=5;
    },10);
    return a;
}

(Fiddle)

Возвращаемое значение a - undefined так как часть a=5 еще не выполнена. AJAX действует так, вы возвращаете значение до того, как сервер получил возможность сообщить вашему браузеру, что это за значение.

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

function onComplete(a){ // When the code completes, do this
    alert(a);
}

function getFive(whenDone){ 
    var a;
    setTimeout(function(){
         a=5;
         whenDone(a);
    },10);
}

Это называется CPS . В основном, мы передаем getFive действие, которое необходимо выполнить, когда оно завершается, мы сообщаем нашему кодексу, как реагировать, когда событие завершается (например, наш вызов AJAX или в этом случае время ожидания).

Использование будет:

getFive(onComplete);

Который должен предупредить «5» на экране. (Fiddle) .

Возможные решения

Существуют два способа решения этой проблемы:

  1. Сделать AJAX синхронный вызов (позволяет называть его SJAX).
  2. Реструктурируйте свой код для правильной работы с обратными вызовами.

1. Синхронный AJAX - Не делайте этого !!

Что касается синхронного AJAX, не делайте этого! Ответ Феликса вызывает некоторые веские аргументы в пользу того, почему это плохая идея. Подводя итог, он заморозит браузер пользователя, пока сервер не вернет ответ и не создаст очень плохой пользовательский интерфейс. Вот еще краткое резюме из MDN о том, почему:

XMLHttpRequest поддерживает как синхронную, так и асинхронную связь. В общем, однако, асинхронные запросы должны быть предпочтительнее синхронных запросов по причинам производительности.

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

Если вы имеете , вы можете передать флаг: Вот как это сделать:

var request = new XMLHttpRequest();
request.open('GET', 'yourURL', false);  // `false` makes the request synchronous
request.send(null);

if (request.status === 200) {// That's HTTP for 'ok'
  console.log(request.responseText);
}

2. Код реструктуризации

Пусть ваша функция принимает обратный вызов. В примере код foo может быть сделан для принятия обратного вызова. Мы сообщим нашему кодексу, как отреагировали , когда foo завершает работу.

Итак:

var result = foo();
// code that depends on `result` goes here

Становится:

foo(function(result) {
    // code that depends on `result`
});

Здесь мы передали анонимную функцию, но мы могли бы так же легко передать ссылку на существующую , чтобы он выглядел следующим образом:

function myHandler(result) {
    // code that depends on `result`
}
foo(myHandler);

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

Теперь давайте определим сам foo, чтобы действовать соответственно

function foo(callback) {
    var httpRequest = new XMLHttpRequest();
    httpRequest.onload = function(){ // when the request is loaded
       callback(httpRequest.responseText);// we're calling our method
    };
    httpRequest.open('GET', "/echo/json");
    httpRequest.send();
}

(скрипка)

Теперь мы сделали нашу функцию foo принять действие, которое будет выполняться, когда AJAX завершится успешно, мы можем продолжить это, проверив, не является ли статус ответа не 200 и действует соответственно (создайте обработчик сбоя и т. д.). Эффективное решение нашей проблемы.

Если вам все еще трудно понять это , прочитайте руководство по началу работы AJAX в MDN.

10
задан Arihant 30 October 2013 в 21:28
поделиться

9 ответов

Я также столкнулся с той же проблемой, я сделал следующие шаги для решения проблемы

  1. Я редактировал файл /etc/php.ini и искал путь session.save_path = "/ var / lib / php / session "вы должны предоставить свою информацию о сеансе

2 После этого просто изменилось разрешение, приведенное ниже * chown root.apache / var / lib / php / session * Это все , Эти шаги устраняют мою проблему

0
ответ дан Aman Shukla 27 August 2018 в 08:24
поделиться

Возможно, если ваш путь сеанса работает неправильно, вы можете попробовать session.save_path(path/to/any folder); как альтернативный путь. Если он работает, вы можете спросить своего хостинг-провайдера о проблеме с пути по умолчанию.

3
ответ дан Andrey Moiseev 27 August 2018 в 08:24
поделиться

Просто поговорил с услугой хостинга, это была проблема в их конце. он сказал: «Ваша учетная запись session.save_path не была установлена, поскольку возникла проблема. Я установил ее для вас сейчас».

И после этого она работает отлично:)

1
ответ дан Arihant 27 August 2018 в 08:24
поделиться

Если вы используете скрипт подключения, не забудьте использовать session_start(); в соединении тоже, некоторые проблемы перед тем, как заметить эту проблему.

23
ответ дан Community 27 August 2018 в 08:24
поделиться

Сегодня я столкнулся с этой проблемой. проблема связана с $ config ['base_url']. Я заметил htpp: //www.domain.com и http://example.com . для исправления всегда устанавливайте base_url на http://www.example.com

0
ответ дан Devqxz 27 August 2018 в 08:24
поделиться

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

session_set_cookie_params(0)
1
ответ дан Jacek Dziurdzikowski 27 August 2018 в 08:24
поделиться

У меня была аналогичная проблема и с доменом cookie:

    ini_set('session.cookie_domain', '.domain.com');

домен был настроен неправильно, поэтому все сеансы были проигнорированы, потому что пользовательский файл cookie никогда не устанавливался правильно, надеюсь, что это поможет кому-то.

0
ответ дан talsibony 27 August 2018 в 08:24
поделиться

У меня была такая же проблема на некоторое время, и мне было очень сложно ее понять. Моя проблема заключалась в том, что у меня был сайт, работающий некоторое время, когда сессии работали правильно, а затем все внезапно все сломалось.

По-видимому, ваш session_save_path (), для меня это было / var / lib / php5 /, должны иметь правильные разрешения (пользователь, на котором запущен php, например, www-data нуждается в доступе на запись в каталог). Я случайно изменил его, полностью разбив сессии.

Запустите sudo chmod -R 700 /var/lib/php5/, а затем sudo chown -R www-data /var/lib/php5/, чтобы пользователь php имел доступ к папке.

8
ответ дан Vadman 27 August 2018 в 08:24
поделиться
  1. Убедитесь, что session_start(); вызывается до вызова каких-либо сеансов. Таким образом, безопасная ставка заключалась бы в том, чтобы разместить ее в начале вашей страницы сразу после открытия <?php тега перед чем-либо еще. Также убедитесь, что перед открывающим тегом <?php нет пробелов / вкладок.
  2. После перенаправления header завершите текущий скрипт с помощью exit(); (другие также предложили session_write_close(); и session_regenerate_id(true) , вы можете попробовать это, но я бы использовал exit();).
  3. Убедитесь, что файлы cookie включены в браузере, который вы используете для его проверки.
  4. Убедитесь, что register_globals выключен, вы можете проверить это в файле php.ini, а также с помощью phpinfo(). Обратитесь к этому о том, как отключить его.
  5. Убедитесь, что вы не удалили или не очистили сеанс.
  6. Убедитесь, что ключ в вашем $_SESSION суперглобальный массив нигде не перезаписывается.
  7. Убедитесь, что вы перенаправляетесь в тот же домен. Поэтому перенаправление с www.yourdomain.com на yourdomain.com не переносит сессию вперед.
  8. Убедитесь, что расширение вашего файла .php (это происходит!).
< / blockquote>

Сессия PHP потеряна после перенаправления

23
ответ дан Community 27 August 2018 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: