|
|
|
| Думаю, с этим сталкивался любой, кто пытался сделать более-менее динамичную "корзину" в интернет-магазине без использования cookies. Хотя, PHPSESSID тоже в куках хранится...
В общем, проблема в том, что скрипт, отображающий количество наименований в "корзине", подгружается аджаксом каждый раз, когда посетитель тычет в "купить" на витрине. А вот при переходе на другие страницы сайта неплохо бы содержимое корзины не растерять. Почему оно должно потеряться? А потому, что корзиночный скрипт и весь остальной сайт используют разные сессии.
И я решил подружить их в рамках одной из сессий, а именно, запускаемой основным телом сайта. Способ был выбран тривиальный – где-то в коде помещается примерно такая штука:
<?
echo "<span id=psid rel='".session_id()."'></span>";
?>
|
При вызове "корзины", делается примерно так:
var psid = $("#psid").attr("rel"); //забираем значение
$.post('scripts/cart.php', {
"action":action,
"psid":psid, //и среди прочих переменных отдаем его "корзинке".
"id":rel},
function(data) {
$('#mycart').html(data);
})
|
После этого остается только загнать корзинку в ту же сессию:
<?
if(session_id()=="") { //проверка на случай, если скрипт подгружается ф-цией include()
session_start();
session_id($_POST['psid']);
}
|
И вот "корзина" влилась в общую работу.
А теперь, собственно, вопрос. Этот метод не является ли какой-нибудь зияющей дырой в безопасности сайта? | |
|
|
|
|
|
|
|
для: DJ Paltus
(24.01.2013 в 13:51)
| | По моему никаких проблем. Даже если чел начнет изменять значения атрибутов, то никому кроме себя он не навредит. | |
|
|
|
|
|
|
|
для: DJ Paltus
(24.01.2013 в 13:51)
| | И какова цель использования разных сессий? | |
|
|
|
|
|
|
|
для: confirm
(26.01.2013 в 13:12)
| | Цель-то как раз два скрипта в одну PHP-сессию загнать. Две сессии получаются из-за того, что скрипт не грузится в include, а подгружается с помощью ajax-вызова, тем самым у него по умолчанию открывается новая сессия. | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.01.2013 в 13:30)
| | Что-то слишком заумно. Зачем вообще два скрипта, и почему это асинхронный запрос должен "потерять" сессию? | |
|
|
|
|
|
|
|
для: confirm
(26.01.2013 в 13:36)
| | Потому что пхп-сессия живет для конкретного скрипта. А ajax-запрос - это вроде бы дополнительный http-вызов. И как без двух скриптов, если надо обсчитывать несколько величин и класть их в серверную сессию без перезагрузки страницы? | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.01.2013 в 13:41)
| |
<?php
session_start();
$_SESSION['set'] = 1;
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script>
$(function(){
$('button').click(function(){
$.post('new.php',{p:1},function(d){
$('#as').text(d);
},'text');
});
});
</script>
</head>
<body>
<div id="as"></div>
<button>SEND</button>
</body>
</html>
|
new.php
<?php
session_start();
$_SESSION['set']++;
echo $_SESSION['set'];
?>
|
Открывайте отладчик и следите за параметрами запроса и ответа, поймете почему то, что вы пишите не возможно в ситуации, которую вы описываете.
А что касается корзины, то это не такая и сложнейшая задача, чтобы ее обрабатывать кучей скриптов, вполне хватит одного скрипта. | |
|
|
|
|
|
|
|
для: confirm
(26.01.2013 в 14:07)
| | Совсем с толку сбился. Работает, но орет ворнинг на то, что заголовки уже приняты.
Сейчас скачаю проект на домашний комп и буду искать 10 отличий. | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.01.2013 в 14:50)
| | Значит у вас уже была их выдача, проверяйте. Но сути это не меняет. | |
|
|
|
|
|
|
|
для: confirm
(26.01.2013 в 15:04)
| | Получается, что заголовки, посланные первым файлом, действуют и на подгружаемый new.php?
Но как тогда избежать предупреждения, не повышая уровень отображаемых ошибок?
(пока не удается сравнить скрипт из проекта и этот, отложим до понедельника) | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.01.2013 в 15:56)
| | Нет, если ваш сервер сам не отправляет неких заголовков - в том что я представил, сам этот файл никаких заголовков не передает, а то что передавал первый файл, они уже отработали.
В контексте вашей темы главное это то, что браузер по запуску первого скрипта знает id сессии, и передает ее второму скрипту во время асинхронного запроса, поэтому сессия никак не прервется, если ее продлевать, что и делается в скрипте new.php.
По большому счету можно вообще написать один единственный скрипт, который будет обрабатывать сценарий всего сайта. Или несколько скриптов, но все запросы поступают к индексному файлу, который подключает другие необходимые. Если при этом грамотно организовать структуру индексного файла, выделить в нем области обрабатывающие те или иные запросы, то передача в некой его части заголовков, или простой выдачи контента в браузер никак не будет мешать и вызывать ошибок. К примеру, в индексном файле, если он обрабатывает асинхронные запросы, да и любые другие запросы, которые не должны вызывать перезагрузку страницы, эти сегменты кода надо помещать в самое начало его.
<?
if($_POST['ajax']) {
//обработка асинхронного запроса
//и выдача результата клиенту
exit; //обязательный выход
}
if($_GET['download']){
//обработка запроса на выдачу файла
//и выдача результата клиенту
exit; //обязательный выход
}
//и т.п. запросы
?>
<html>
.....
|
При этом, если подразумевается работа со сессией, то старт сессии должен быть прописан перед этими сегментами кода. То же самое, если предполагается, что индексный файл, а также асинхронные и прочие запросы к нему будут использовать одни и те же результаты запроса к базе, то подключение к базе, а возможно и некоторые необходимые запросы к ней лучше помещать также перед этими сегментами кода.
Любые же передаваемые заголовки в частях (условиях) этого сегмента кода, а естественно и вывод в браузер (выдача результата) независимы, и причиной ошибок быть не могут. | |
|
|
|
|
|
|
|
для: confirm
(26.01.2013 в 17:24)
| | И правда. Ошибка в чем-то другом была, а я как всегда забрало опустил и поскакал сражаться с вымышленными трудностями. Заремил строку с принудительным присвоением идентификатора сессии, а все продолжает работать правильно.
Спасибо за урок ) | |
|
|
|