Jump to content

Плавающая ошибка в переменной $this->session->data при ajax запросе.


Go to solution Solved by DKV666,

Recommended Posts

Проблема возникает при ajax запросе. К примеру страница register.php function index() генерирует значение register_token:

 

$this->session->data['register_token'] = substr(bin2hex(openssl_random_pseudo_bytes(26)), 0, 26);

 

Юсер вводид данные и тыкает кнопку. Летит ajax запрос register.php register() передавая register_token в GET.

register() ловит в GET register_token, вынимает из сессии $this->session->data['register_token'] и сравнивает его с тем что получено в GET, то есть $this->request->get['register_token'].

Собственно тут-то и возникает ошибка. То что мы получили в GET и то что лежит в переменной сессии разное.

При этом если на index() сразу после сохранеия $this->session->data['register_token'] её же считать значение правильное, но при ajax $this->session->data['register_token'] другой. При чём в переменной висит значение предыдущего исполнения. То есть заходим на страницу $this->session->data['register_token'] = xxx, обновляем страницу значение $this->session->data['register_token'] стало yyy, но при  ajax значение выдаёт xxx.

По сути каким то образом ajax получает предыдущее значение переменной. Временные задержки при ajax никаким образом ситуацию не меняют.

Ошибка рандомная. То есть один пользователь может вообще её не встретить хоть утыкайся, когда как другой будет ловить ошибку через раз при выполнении ajax. Без ajax ошибка не наблюдается вообще. Т.к. ajax запросы основа половины запросов на opencart вешать кастыли как-то не очень хочется.

OCSESSID при ajax запросе с ошибкой проверял, совпадает.

Собственно жду ваши мысли по этому поводу.

 

Link to comment
Share on other sites

В 27.08.2023 в 14:33, DKV666 сказал:

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

 

потому что

В 27.08.2023 в 14:33, DKV666 сказал:

К примеру страница register.php function index() генерирует значение register_token:

 

$this->session->data['register_token'] = substr(bin2hex(openssl_random_pseudo_bytes(26)), 0, 26);

 

и при каждом обращении к register.php - значение $this->session->data['register_token'] будет пересоздаваться

 

как вариант, изначально используйте проверку при создании

типа if (empty($this->session->data['register_token']))

Link to comment
Share on other sites

В 27.08.2023 в 20:46, AlexDW сказал:

 

потому что

 

и при каждом обращении к register.php - значение $this->session->data['register_token'] будет пересоздаваться

 

как вариант, изначально используйте проверку при создании

типа if (empty($this->session->data['register_token']))

 

Вы немного не поняли сути проблемы. index() создаёт или перезаписывает $this->session->data['register_token'] исправно. То есть проверка на наличие и актуальность при index() ничего не даст, т.к. переменная переписывается и имеет нужные данные. А вот при выполнении ajax register.php эта же переменная или вовсе отсутствует, или имеет другое значение. Именно по этому предложенный вами способ не имеет смысла. Будь всё так просто я бы сюда не писал.

Link to comment
Share on other sites

В 28.08.2023 в 16:14, DKV666 сказал:

 

Вы немного не поняли сути проблемы. index() создаёт или перезаписывает $this->session->data['register_token'] исправно. То есть проверка на наличие и актуальность при index() ничего не даст, т.к. переменная переписывается и имеет нужные данные. А вот при выполнении ajax register.php эта же переменная или вовсе отсутствует, или имеет другое значение. Именно по этому предложенный вами способ не имеет смысла. Будь всё так просто я бы сюда не писал.

 

Потому что при обращении к index() register.php переменная перезаписывается, и ты видишь старое значение в get. Не перезыписывай переменную, или проверяй раньше.

Link to comment
Share on other sites

В 28.08.2023 в 15:05, mazein сказал:

 

Потому что при обращении к index() register.php переменная перезаписывается, и ты видишь старое значение в get. Не перезыписывай переменную, или проверяй раньше.

 

И это не верно. Я не к index() register.php обращаюсь, а посредством ajax к register() register.php. Пользователь открывает страницу рега вызывая index(),  index() создаёт или перезаписывает переменную в сессии, пользователь заполняет форму и отправляет её в функцию register() в которой считывается значение переменной в сессии. В index() переменная пишется и читается правильно, а в register() её или нет вообще, или она имеет значение предыдущего обновления страницы.

Link to comment
Share on other sites

В 28.08.2023 в 16:33, DKV666 сказал:

И это не верно. Я не к index() register.php обращаюсь, а посредством ajax к register() register.php. Пользователь открывает страницу рега вызывая index(),  index() создаёт или перезаписывает переменную в сессии, пользователь заполняет форму и отправляет её в функцию register() в которой считывается значение переменной в сессии. В index() переменная пишется и читается правильно, а в register() её или нет вообще, или она имеет значение предыдущего обновления страницы.

Вам всё правильно указали.

Страница может быть открыта на соседней вкладке. Или браузер может дёрнуть саму страницу.

Может какой-то плагин в браузере.

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

Link to comment
Share on other sites

  • Solution
В 29.08.2023 в 06:33, mpn2005 сказал:

Вам всё правильно указали.

Страница может быть открыта на соседней вкладке. Или браузер может дёрнуть саму страницу.

Может какой-то плагин в браузере.

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

 

Интересные вы ребята...

 

То есть по вашей логике если что-то дёргает повторно страницу переменная меняется на предыдущее значение вместо обновления на новое значение, или вовсе отсутствует. Ещё раз повторяю, переменная не меняется на новую, у неё не происходит изменения на новое значение, переменная равна предыдущему значению при предыдущем обновлении страницы, или полностью отсутствует именно при ajax запросе. Никакие две три страницы никто не открывает, каким образом браузер в вашей логике самостоятельно может дёргать страницу ели этого вообще нет в коде мне вообще не понятно.

 

Если бы всё было так как вы мне втираете переменная менялась бы на новое уникальное значение, а этого не происходит, вместо этого откуда-то подтягивается старое значение которого по логике там быть вообще не должно. А изредка значение вообще отсутствует. Как в вашей логике обновление страницы с чётко прописанным кодом заменить значение переменной может её полностью удалять я вообще понимать отказываюсь.

 

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...