Почему то не работает header('Location:index.php?page=cart');
Здравствуйте всем участникам форума... Редактировал сайт и ... "поломал". корзину сайта, после выбора товара должна идти переадресация на страницу cart.. но почему то не работает, остается на странице add_to_cart..посмотрите может увидете ошибку...
<script> $('document').ready(function(){ function addtoCart(itemId){ console.log("js-addToCart()"); $.ajax({ type: 'POST', async: false, url:"../send/"+itemId+'/', dataType: 'json', succes: function(data){ if(data['success']){ $('#cartCntItems') .html(data['cntItems']); $('#addCart_'+ itemId).hide(); $('#removeCart_'+ itemId).show(); } } }); } }); </script> session_start(); if(!isset($_SESSION['cart'])) { $_SESSION['cart'] = array(); $_SESSION['total_items'] = 0; $_SESSION['total_price'] = 0; } $page = empty($_GET['page']) ? 'index.php' : $_GET['page']; /* если страниц нет, то главная */ switch($page){ case('add_to_cart'): $id = $_GET['id']; $add_item = add_to_cart($id); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:index.php?page=cart'); /*index.php&id='.$id*/ break; case('update_cart'): update_cart(); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:index.php?page=cart'); break; } |
Попробуйте так:
header('Location: /index.php?page=cart'); Если не сработает - смотрите реальные заголовки ответа (в браузере F12 -> вкладка Network). |
$.ajax(
dataType: 'json' succes: function(data){ if(data['success']){ $('#cartCntItems') .html(data['cntItems']); ...... и какие в этом случае могут быть header('Location.... ? |
Вот, забыл показать функции по корзине и стандартный блок с товаром, который выводится из БД (внизу). До сих пор не получилось сделать переадресацию header('Location: /index.php?page=cart'); после нажатия на кнопку купить.... может мне лучше избавится от переключателя SWITCH и как то по другому переделать функции обработки корзины, чтобы функции обработки не зацикливалась на add_to_cart, как на странице.... Помогите советом...
<script> $('document').ready(function(){ function addtoCart(itemId){ console.log("js-addToCart()"); $.ajax({ type: 'POST', async: false, url:"../send/"+itemId+'/', dataType: 'json', succes: function(data){ if(data['success']){ $('#cartCntItems') .html(data['cntItems']); $('#addCart_'+ itemId).hide(); $('#removeCart_'+ itemId).show(); } } }); } }); </script> Функции корзины: session_start(); if(!isset($_SESSION['cart'])) { $_SESSION['cart'] = array(); $_SESSION['total_items'] = 0; $_SESSION['total_price'] = 0; } function add_to_cart($id){ $id = $_GET['id']; if(isset($_SESSION['cart'][$id])){ $_SESSION['cart'][$id]++; return true; } else{ $_SESSION['cart'][$id] = 1; return true; } return false; } function db_result_array($result){ $res_array = array(); $count = 0; while($row = mysql_fetch_array($result)){ $res_array[$count] = $row; $count++; } return $res_array; } function get_product($id){ $query = " SELECT * FROM `product` WHERE `id` = '$id'"; $result = mysql_query($query); $row = mysql_fetch_assoc($result); return $row; } function update_cart(){ foreach($_SESSION['cart'] as $id => $qty){ if($_POST[$id] == '0'){ unset($_SESSION['cart'][$id]); } else { $_SESSION['cart'][$id] = $_POST[$id]; } } } function total_items($cart){ $num_items = 0; if(is_array($cart)){ foreach($cart as $id => $qty){ $num_items = $num_items + $qty; } } return $num_items; } function total_price($cart){ $total_price = 0; if(is_array($cart)){ foreach($cart as $id => $qty){ $query = "SELECT cena FROM product WHERE id = '$id'"; $result = mysql_query($query); if($result){ $item_price = mysql_result($result, 0, 'cena'); $total_price = $total_price + $item_price * $qty; } } } return $total_price; } $page = empty($_GET['page']) ? 'index.php' : $_GET['page']; /* если страниц нет, то главная */ switch($page){ case('add_to_cart'): $id = $_GET['id']; $add_item = add_to_cart($id); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:index.php?page=cart'); /*index.php&id='.$id*/ break; case('update_cart'): update_cart(); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:index.php?page=cart'); break; } Из базы данных циклом выводятся товары с ценой и кнопкой "купить" <div > <p>Товар</p> <div id = 'price'><?php echo (int)$row['cena']. " грн. "; ?> </div> <a <?php if($row['price'] !=0){ ?> href="?page=add_to_cart&id=<?= $row['id'] ?>"; <?php } ?>id = "to_basket">Купить</a> </div> Вот страница сайта, для наглядного примера проблемы.... : https://ensy.com.ua/vents?page=vents |
Цитата:
Клиент должен делать перенаправление после ответа сервера на асинхронный запрос, при этом сервер может передать клиенту параметры запроса. |
подскажите как мне исправить этот асинхронный запрос, на JSON?
|
Цитата:
Вы можете пояснить связь представленного вами кода Ajax запроса с кодом РНР и вашей проблемой? Если этот Ajax запрос есть выбор товара (добавление в корзину), причем клиенту предписано принимать JSON, то сервер и должен отдавать только json. Ну ежику же понятно, что о перенаправлении на другую страницу при этом не может быть и речи. Перейти можно только клиентом, как window.location.href = url?page=cart. Но как тогда быть с $('#cartCntItems') .html(data['cntItems']); и т.д.? Вы либо что-то не договариваете, либо не можете описать проблему так, чтобы было понятна ее первопричина. |
Нечего мне недоговаривать.... Раньше все работало.... постепенно редактировал сайт.... и не заметил когда появилась эта проблема.... но скрипты корзины не трогал.... теперь пытаюсь исправить.... Что нужно показать еще чтоб понять что я такого "наворотил"..? Мне этот switch не нравится.... он добавляет мне страницы, которые нужно скрывать от индекса... Скажите где, какой код вытащить, я все покажу....
|
Цитата:
Или ... ? |
Когда нажимаю кнопку "Купить", происходит переход по ссылке add_to_cart&id=...переменная из товара... после этого оно переходит для управления в функцию корзины и в swith:
function add_to_cart($id){ $id = $_GET['id']; if(isset($_SESSION['cart'][$id])){ $_SESSION['cart'][$id]++; return true; } else{ $_SESSION['cart'][$id] = 1; return true; } return false; } switch($page){ case('add_to_cart'): $id = $_GET['id']; $add_item = add_to_cart($id); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:index.php?page=cart'); break; } Я так думаю...... и наверное, после этого происходит $.ajax... |
Нельзя в асинхронном запросе перенапрваить клиента сервером, об этом сказано выше. А "наверное" или подобные предположения не дают понимания происходящего у вас на странице.
|
Если не надоел, то вот как происходит:
нажатия ссылки add_to_cart&id=420 происходит переходна страницу add_to_cart. В SWITCH : switch($page){ case('add_to_cart'): $id = $_GET['id']; $add_item = add_to_cart($id); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:index.php?page=cart'); break; } вызывается сначала функция php add_to_cart($id); function add_to_cart($id){ $id = $_GET['id']; if(isset($_SESSION['cart'][$id])){ $_SESSION['cart'][$id]++; return true; } else{ $_SESSION['cart'][$id] = 1; return true; } return false; } потом цена и колличество заносится в сессию и присваиваются в фунцию total_items($_SESSION['cart']); и total_price($_SESSION['cart']); в $.ajax : <script> $('document').ready(function(){ function addtoCart(itemId){ console.log("js-addToCart()"); $.ajax({ type: 'POST', async: false, url:"../send/"+itemId+'/', dataType: 'json', succes: function(data){ if(data['success']){ $('#cartCntItems') .html(data['cntItems']); $('#addCart_'+ itemId).hide(); $('#removeCart_'+ itemId).show(); } } }); } }); </script> И обработав все эти функции SWITH должен произвести header('Location: /index.php?page=cart'); ... но.... SWITH это ж не асинхронный запрос.. или асинхронный? |
Если судить по именам, то асинхронный запрос как раз и добавляет товар:
$('#addCart_'+ itemId).hide(); - скрыть кнопку добавления товара $('#removeCart_'+ itemId).show(); - показать кнопку удаления товара где itemId, это ID товара. То что асинхронно добавляется товар можно понять и без кода - не перегружается страница. И в этом случае нельзя посредством передачи заголовка сервером "после выбора товара должна идти переадресация на страницу cart." Почему и что нужно делать говорилось уже. Если вы не можете определить где или в чем ошибка и "сломалось" не там, асинхронный запрос не имеет отношения к тому, чего вы хотите, то в этом случае могут быть только две причины не работы: 1) header(), это передача заголовка, а заголовки передаются в начале, затем содержание, то есть до передачи заголовка не должно быть никакого вывода в браузер, а у вас он есть. 2) после передачи заголовка нужно делать выход exit, дабы исключить последующую после него работу кода, а у вас этого нет. Вам уже говорили проконтролировать ответ в отладчике, вы смотрели? |
пытался смотреть в отладчике... но не разобрался пока как увидеть ответ...
куда мне вставлять window.location.href = url?page=cart;... ? везде пробовал ничего не происходит.... Спасибо за ваше внимание.... |
Не читал всю тему, поэтому не знаю писали ли вам это, но...
Вы отправляете запрос на сервер с помощью скрипта, поэтому нет никакого смысла отправлять в ответе заголовки location, если скрипт их не обрабатывает. Хотите чтобы редирект осуществлялся - после завершения запроса проверяйте заголовки на наличие location и перенаправляйте пользователя. |
сейчас еще раз повычитываю, как проверять заголовки....
|
См. аргументы опции success: http://api.jquery.com/jquery.ajax/
http://api.jquery.com/jQuery.ajax/#jqXHR |
Цитата:
Теперь о куда мне вставлять window.location.href = url?page=cart;, но небольшое отступление. По уму корзина имеет два представления, краткое и полное. Добавили товар, в кратком отобразится количество набранных товаров и их общая сумма. Эта корзина всегда на виду. Полное отображение, это редактирование корзины, оформление заказа и т.п. Не слишком ли "матерно" перебрасывать пользователя в корзину при каждом добавлении товара если ему в этом нет необходимости, он может не один товар собрался прикупить? Ладно, пусть Ajax и несмотря на "матерность" процесса вы гоните пользователя в корзину. Но в этом случае уже добавление товара посредством Ajaх лишено всякого смысла, так как выгода его применения нивелируется. А уж тем более нет смысла после ответа сервера выполнять это: if(data['success']){ $('#cartCntItems') .html(data['cntItems']); $('#addCart_'+ itemId).hide(); $('#removeCart_'+ itemId).show(); } } вместо этого и нужно вставлять window.location.href = url?page=cart; |
Nexus, это просто лишнее в данном случае, параметры запроса постоянны, нового сервер ничего не сообщает, ковыряться в заголовках смысла нет. А вот если так как я написал выше, то убрать тип json из запроса.
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Еще раз со своей измучанной проблемой... переделал код js как вы сказали:
$('document').ready(function(){ function addtoCart(itemId){ console.log("js-addToCart()"); $.ajax({ type: 'POST', async: false, url:"../send/"+itemId+'/', succes: function(data){ window.location.href = url?page=cart; } }); } }); Все равно зависает на странице add_to_cart... подскажите как переделать функцию php: function add_to_cart($id){ $id = $_GET['id']; if(isset($_SESSION['cart'][$id])){ $_SESSION['cart'][$id]++; return true; } else{ $_SESSION['cart'][$id] = 1; return true; } return Чтоб удалить из кода SWITCH... |
Вообще удалил код js... и все равно зависаю в add_to cart
|
Цитата:
"window.location.href" говорит браузеру, что нужно открыть в этой вкладке страничку с другим адресом. Вместо "url?page=cart" вы должны были написать адрес странички, на которую пользователя нужно перенаправить. В итоге должно было получиться: window.location.href='/index.php?page=cart'; |
А причем add_to_cart при переходе или "зависает" при добавлении товара? Вы в отладчик заглядывали или до сих пор нет, что отвечает сервер?
В общем-то если при асинхронном добавлении товара после него делается переход, то выбрасывайте Ajax из добавления товара, толку то от него при этом никакого. Вместо этого кнопки добавления товара, это копки submit одной формы, отправляемой методом POST, значениями которых должны быть ID товаров, а именами ключ ожидаемый на сервере. Атрибут action формы можно сделать равным адресу корзины, куда и требуется перейти, то есть это позволит исключить лишнее перенаправление, а скрипт принимающий товары сделать на этой странице подключаемый. |
Я думаю проблема не js, а в switch....
подскажите как изменить функции по обработки корзины: function add_to_cart($id){ $id = $_GET['id']; if(isset($_SESSION['cart'][$id])){ $_SESSION['cart'][$id]++; return true; } else{ $_SESSION['cart'][$id] = 1; return true; } return false; } function db_result_array($result){ $res_array = array(); $count = 0; while($row = mysql_fetch_array($result)){ $res_array[$count] = $row; $count++; } return $res_array; } function get_product($id){ $query = " SELECT * FROM `product` WHERE `id` = '$id'"; $result = mysql_query($query); $row = mysql_fetch_assoc($result); return $row; } function update_cart(){ foreach($_SESSION['cart'] as $id => $qty){ if($_POST[$id] == '0'){ unset($_SESSION['cart'][$id]); } else { $_SESSION['cart'][$id] = $_POST[$id]; } } } function total_items($cart){ $num_items = 0; if(is_array($cart)){ foreach($cart as $id => $qty){ $num_items = $num_items + $qty; } } return $num_items; } function total_price($cart){ $total_price = 0; if(is_array($cart)){ foreach($cart as $id => $qty){ $query = "SELECT cena FROM product WHERE id = '$id'"; $result = mysql_query($query); if($result){ $item_price = mysql_result($result, 0, 'cena'); $total_price = $total_price + $item_price * $qty; } } } return $total_price; } Чтоб удалить из кода в этот swith: switch($page){ case('add_to_cart'): $id = $_GET['id']; $add_item = add_to_cart($id); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:/?page=cart'); break; case('update_cart'): update_cart(); $_SESSION['total_items'] = total_items($_SESSION['cart']); $_SESSION['total_price'] = total_price($_SESSION['cart']); header('Location:/?page=cart'); } |
вот так переделал:
$('document').ready(function(){ function addtoCart(itemId){ window.location.href='/index.php?page=cart'; } }); после перехода по ссылке /add_to_cart&id=666 - не перенаправляет |
Цитата:
В switch на 80% одно и тоже, не нравится он, применяйте if...else, где для разного ключа страницы описать свои действия, общие после условия. |
Цитата:
|
И еще: mysql deprecated, используйте mysqli.
Цитата:
|
Цитата:
Перехожу по этой ссылке, когда нажимаю кнопку купить.... и выбирается по id товара... может вы заглянете...? https://ensy.com.ua/?page=vents |
А что там смотреть, 17 товаров, которых я не заказывал, на 0 гривен? :) Ссылку на страницу с товарами хотя бы покажите, чтобы ....
|
https://ensy.com.ua/?page=vents - это и есть ссылка, вниз прокручиваете...
|
Цитата:
ООО "Энергосистемы" Киев, ул.Ильинская,11 ☎ (050)44-33-502 ensycomua@gmail.com Где товары с ценой, кнопкой добавить ...? |
вроде исправил, посмотрите сейчас.. нужно нажать кнопку поиск в табличке
|
|
на фильтре по центру, нажмите красную кнопку поиск...
|
Да.... сказать нечего.
У вас обычной ссылкой добавление товаров методом GET, поэтому скрипт JS боком и перенапрваить может РНР посредством header(). Причины по которым это может не работать я уже называл. Вы что отладкой занимаетесь на удаленном сервере? Устанавливайте локальный, самый простой для установки, но приличный сервер, это Open Server. В нем отлаживайте, на удаленный загружается уже отлаженное. На локальном же включите вывод предупреждений и ошибок, тогда и увидите проблему. Можете и на удаленном включить вывод ошибок, но это не есть гут. |
Часовой пояс GMT +3, время: 18:58. |