Не сохраняются данные в $_SESSION

261
06 декабря 2021, 19:20

При обновлении страницы (по нажатию определенной кнопки) сиссия каждый раз обновляется, то есть старое значение, сохраненное в ней, я не могу использовать (для того, чтобы, к примеру, накопить сумму чего-либо), хотя вчера этот же код отлично работал и все накапливал, а сегодня — не работает. И еще вылетает ошибка:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at S:\home\shop.by\www\pages\Items\itemsHandler.php:1) in S:\home\shop.by\www\pages\Items\itemsHandler.php on line 1

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at S:\home\shop.by\www\pages\Items\itemsHandler.php:1) in S:\home\shop.by\www\pages\Items\itemsHandler.php on line 1

Почитал на форумах про похожие проблемы, но у меня на первый взгляд все в порядке (мне так кажется). Возможно, это из-за того, что я отправляю данные методом POST в form.

Как же решить эту проблему?

<?php session_start();
$db =fopen("../../DB/DBItems.txt", "rt");
if ($db)
    while ( $itemInfo = fscanf($db, "%s%d") ){
            list($name,$price) = $itemInfo;
            $_ITEMS[$name] = $price;
            if ($name == $_POST['Button']){
                if (!isset($_SESSION['total'])) 
                    $_SESSION['total'] = 0;
                else
                    $total =$_SESSION['total'];
                if (!isset($_SESSION['countItems[]'])) 
                    $_SESSION['countItems[]'] = 0;
                else
                    ++$_SESSION['countItems[]'];
                $total +=$price;
                $_SESSION['total'] = $total;
            }
    }
else 
    echo "Ошибка при открытии файла";
fclose($db);?>

<!DOCTYPE html> 
<html lang="en"> 
<head> 
	<meta charset="UTF-8"> 
	<link rel="stylesheet" href="../../css/header.css"> 
	<link rel="stylesheet" href="../../css/index.css"> 
	<link rel="stylesheet" href="../../css/index_footer.css"> 
	<link rel="stylesheet" href="../../css/tovarExample/content.css"> 
	<title>Shop.by</title> 
</head> 
<body> 
	<div id="wrapper"> 
		<header> 
			<div class="headwrapper"> 
			<div class="BottomLine"> 
				<div id="logo"> <h2>BIRUANG</h2></div> 
				<ul class="info"> 
				<li>+375 29 145 89 88</li> 
				<li>karas-lost@mail.ru</li> 
				<div class="BorderBasketLetter"> 
					<li> 
						<a href="basket/basketHandler.php"> 
							<img src="../../image/header/basket2.png" width="23" height="23" alt="Basket"> 
						</a> 
						<div class="amountOfItemsInBasket"> 
							<?php echo $_SESSION['countItems[]'];?> 
						</div> 
						<span> 
							<?php   
								echo "$total $"; 
							?> 
						</span> 
					</li> 
					<li><span>CHECKOUTS</span><img src="../../image/header/letter.png" width="23" height="23" alt=""></li> 
				</div> 
				</ul> 
			</div> 
 
			<nav id="menu"> 
				<ul> 
					<li id="beginLi">HOME</li> 
					<li>MEN 
						<!--<ul class="submenu"> 
							<li>Список 1</li> 
							<li>Список 2</li> 
							<li>Список 3</li> 
							<li>Список 4</li> 
							<li>Список 5</li> 
						</ul>--> 
					</li> 
					<li>WOMEN 
						<!--<ul class="submenu"> 
							<li>Список 1</li> 
							<li>Список 2</li> 
							<li>Список 3</li> 
							<li>Список 4</li> 
							<li>Список 5</li>						 
						</ul>--> 
					</li> 
					<li>KIDS 
					</li> 
					<li>SALE</li> 
					<li>ABOUT US</li> 
					<li>SUPPORT</li> 
					<li> 
						<input type="text"></input> 
					</li> 
				</ul> 
			</nav> 
			</div> 
		</header> 
		<!-- End Header--> 
		<div id="content"> 
			<figure> 
				<img src="../../image/pages/tovarExample/Image.jpg" alt=""> 
				<figcaption> 
					<p>Продолжение культовой книги "Тренировочная зона" Пола «Тренера» Уэйда посвящено продвинутым техникам тренировок с собственным весом для развития предельной силы и мышц. </p> 
					<p class="price"> 
						Цена = 	<? echo $_ITEMS['Ball'].' $'?> 
					</p> 
					<form method="POST" action="itemsHandler.php"> 
						<input type="submit" name="Ball" value="Купить"> 
						<input type="hidden" name="Button" value="Ball"> 
					</form> 
				</figcaption> 
			</figure> 
			<figure> 
				<img src="../../image/pages/tovarExample/Image.jpg" alt=""> 
				<figcaption> 
					<p>Продолжение культовой книги "Тренировочная зона" Пола «Тренера» Уэйда посвящено продвинутым техникам тренировок с собственным весом для развития предельной силы и мышц. </p> 
					<p class="price"> 
						Цена = 	<? echo $_ITEMS['Basket'].' $';?> 
					</p> 
					<form method="POST" action="itemsHandler.php"> 
						<input type="submit" name="Basket" value="Купить"> 
						<input type="hidden" name="Button" value="Basket"> 
					</form> 
				</figcaption> 
			</figure> 
			<figure> 
				<img src="../../image/pages/tovarExample/Image.jpg" alt=""> 
				<figcaption> 
					<p>Продолжение культовой книги "Тренировочная зона" Пола «Тренера» Уэйда посвящено продвинутым техникам тренировок с собственным весом для развития предельной силы и мышц. </p> 
					<p class="price"> 
						Цена = 	<? echo $_ITEMS['Box'].' $';?> 
					</p> 
					<form method="POST" action="itemsHandler.php"> 
						<input type="submit" name="Box" value="Купить"> 
						<input type="hidden" name="Button" value="Box"> 
					</form> 
				</figcaption> 
			</figure> 
			<figure> 
				<img src="../../image/pages/tovarExample/Image.jpg" alt=""> 
				<figcaption> 
					<p>Продолжение культовой книги "Тренировочная зона" Пола «Тренера» Уэйда посвящено продвинутым техникам тренировок с собственным весом для развития предельной силы и мышц. </p> 
					<p class="price"> 
						Цена = 	<? echo $_ITEMS['Phone'].' $';?> 
					</p> 
					<form method="POST" action="itemsHandler.php"> 
						<input type="submit" name="Phone" value="Купить"> 
						<input type="hidden" name="Button" value="Phone"> 
					</form> 
				</figcaption> 
			</figure> 
			<figure> 
				<img src="../../image/pages/tovarExample/Image.jpg" alt=""> 
				<figcaption> 
					<p>Продолжение культовой книги "Тренировочная зона" Пола «Тренера» Уэйда посвящено продвинутым техникам тренировок с собственным весом для развития предельной силы и мышц. </p> 
					<p class="price"> 
						Цена = 	<? echo $_ITEMS['Notebook'].' $';?> 
					</p> 
					<form method="POST" action="itemsHandler.php"> 
						<input type="submit" name="Notebook" value="Купить"> 
						<input type="hidden" name="Button" value="Notebook"> 
					</form> 
				</figcaption> 
			</figure> 
			<figure> 
				<img src="../../image/pages/tovarExample/Image.jpg" alt=""> 
				<figcaption> 
					<p>Продолжение культовой книги "Тренировочная зона" Пола «Тренера» Уэйда посвящено продвинутым техникам тренировок с собственным весом для развития предельной силы и мышц. </p> 
					<p class="price">Цена =</p> 
					<input type="button" value="Купить"></figcaption> 
			</figure> 
		</div> 
		<!-- End Content--> 
		<!-- Footer--> 
		<footer> 
			<div id="col1"> 
				<h2>OUR STORES</h2> 
				<p>Pellentesque non cursus mi, eu cursus nunc. Nullam 
					et odio tristique, volutpat urna vitae, dignissim orci.</p>  
				<p>Fusce eu nulla urna. 
					This template was created by Erik Paнтакты для связи с нами</p> 
			</div> 
			<div id="col2"> 
				<h2>BLOG POSTS</h2> 
				<strong>Nullam et odio tristique</strong><br> 
				        Nullam et odio tristique, volutpat urna vitae, dignissim orci.Fusce eu nulla urna.</p> 
				<strong>Nullam et odio tristiquedignissim orci.</strong><br>  
					    Fusce eu nulla urna.This template was created by Erik Paнтакты для связи с нами</p> 
			</div> 
			<div id="col3"> 
				<h2>SUPPORT</h2> 
				<ul> 
					<li>Terms & Conditions</li> 
					<li>FAQ</li> 
					<li>Payment</li> 
					<li>Refunds</li> 
					<li>Track Order</li> 
					<li>Services</li> 
					<li>Privacy & Security</li> 
					<li>Careers</li> 
					<li>Press</li> 
					<li>Corporate Information</li> 
				</ul> 
			</div> 
			<div id="col4"> 
				<ul> 
					<li>Sizing</li> 
					<li>Ordering</li> 
					<li>Shipping</li> 
					<li>Return Policy</li> 
					<li>Affiliates</li> 
					<li>Find a Store</li> 
					<li>Site Map</li> 
					<li>Sign UP & Save</li> 
				</ul> 
				 
			</div> 
			<div id="col5"> 
				<h2>CONTACT US</h2> 
				<input type="text" value="Your Gmail"> 
				<textarea name="yourtext" id="yourtext" cols="20" rows="5"></textarea> 
				<input type="button" value="SEND"> 
			</div> 
		</footer> 
	</div>	 
</body> 
</html>

Answer 1

Ошибки с текстом headers already sent by появляются если перед попыткой отправить HTTP-заголовок веб-сервер уже начал отправлять тело ответа. По опыту это случается в следующих случаях:

  1. Скрипт уже получился длинный и программист забыл, что перед функцией header() он уже где-то начал формировать страницу (например echo '<html><head>';);
  2. PHP-файл в unicode-кодировке и в начале файла стоит маркер последовательности байтов (BOM) или другой неотображаемый символ (например пробел нулевой ширины);
  3. В PHP-файле тег <?php стоит не с самого начала, а после пробела, табуляции или не на первой строке;
  4. PHP выводит сообщение об ошибке или предупреждение при включенной директиве display_errors в тело страницы.

Иногда, когда файлов много, разобраться становится трудно. "Поймать" вывод поможет буферизация вывода. Можно в самый первый файл, в самое начало вставить строку: ob_start(); и перед строкой, отправляющей HTTP-заголовок (функции header(), session_start(), setcookie()) вставить file_put_contents('content-debug.log', ob_get_contents()) и посмотреть, что будет записано в файл content-debug.log (может быть в виде шестнадцатеричного дампа)

Answer 2

Полный ответ на ваш вопрос есть в самом вопросе. Другого ответа здесь быть не может.

Warning: session_start() [function.session-start]: Cannot send session >cookie - headers already sent by (output started at >S:\home\shop.by\www\pages\Items\itemsHandler.php:1) in >S:\home\shop.by\www\pages\Items\itemsHandler.php on line 1

Интерпретатор PHP сообщает вам, что вывод данных начался до вызова функции session_start, т.о. сессии не могут обеспечить корректное сохранение указанных данных.

Для работы сессий используются Cookie. Сохранение Куки происходит только в области Заголовков ответа вашего сервера. Как только вы начинаете передавать любые данные (теги, пробел, абсолютно любой символ) заголовки вы уже не сможете отправить и именно об этом вам говорит ваша ошибка. Нужно найти эти данные до функции session_start и переместить, если они нужны, либо удалить.

На вашем примере невозможно определить эти дополнительные данные. В комментариях к вопросу вам предлагали переопределить кодировку файла Unicode без BOM (Notepad++ удобный быстрый редактор, смена кодировок в один клик).

Иногда (очень редко) в конфигурации PHP или htaccess указывается auto_prepend_file который автоматически включает в любой скрипт какой-то другой файл в самое начало и этот файл может передать данные о которых вы можете забыть или не знать. Проверьте конфигурацию PHP.

READ ALSO
Не приходят IPN уведомления laravel

Не приходят IPN уведомления laravel

у меня такой вопросЕще около двух лет назад я пытался поставить Payeer на Laravel, но безуспешно

176
вложения в циклах foreach при парсинге

вложения в циклах foreach при парсинге

Нужна помощь есть html дерево где с помощью DomCrawler парсим нужные нам значения(имя товара и цена) сложность в том как из двух масивов сделать один(ключ...

171
PHP. Перестановка элементов массива

PHP. Перестановка элементов массива

Есть массив $X = [0,-5,-9,3,76,-99,-3,-4,101,-212,10,31]; Надо переставить отрицательные элементы из в начало массива, а положительные в конец, сохранив при этом...

196
Помощь в структуре базы данных mysqli

Помощь в структуре базы данных mysqli

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

244