Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Почему то не работает header('Location:index.php?page=cart'); (https://javascript.ru/forum/server/75764-pochemu-ne-rabotaet-header-%27location-index-php-page%3Dcart%27-%3B.html)

laimas 05.11.2018 20:40

Нельзя в асинхронном запросе перенапрваить клиента сервером, об этом сказано выше. А "наверное" или подобные предположения не дают понимания происходящего у вас на странице.

Zhenyaxxxx 05.11.2018 23:34

Если не надоел, то вот как происходит:
нажатия ссылки 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 это ж не асинхронный запрос.. или асинхронный?

laimas 06.11.2018 03:36

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

$('#addCart_'+ itemId).hide(); - скрыть кнопку добавления товара
$('#removeCart_'+ itemId).show(); - показать кнопку удаления товара

где itemId, это ID товара. То что асинхронно добавляется товар можно понять и без кода - не перегружается страница. И в этом случае нельзя посредством передачи заголовка сервером "после выбора товара должна идти переадресация на страницу cart." Почему и что нужно делать говорилось уже.

Если вы не можете определить где или в чем ошибка и "сломалось" не там, асинхронный запрос не имеет отношения к тому, чего вы хотите, то в этом случае могут быть только две причины не работы:

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

2) после передачи заголовка нужно делать выход exit, дабы исключить последующую после него работу кода, а у вас этого нет.

Вам уже говорили проконтролировать ответ в отладчике, вы смотрели?

Zhenyaxxxx 06.11.2018 09:18

пытался смотреть в отладчике... но не разобрался пока как увидеть ответ...
куда мне вставлять window.location.href = url?page=cart;... ? везде пробовал ничего не происходит.... Спасибо за ваше внимание....

Nexus 06.11.2018 09:54

Не читал всю тему, поэтому не знаю писали ли вам это, но...
Вы отправляете запрос на сервер с помощью скрипта, поэтому нет никакого смысла отправлять в ответе заголовки location, если скрипт их не обрабатывает.
Хотите чтобы редирект осуществлялся - после завершения запроса проверяйте заголовки на наличие location и перенаправляйте пользователя.

Zhenyaxxxx 06.11.2018 10:28

сейчас еще раз повычитываю, как проверять заголовки....

Nexus 06.11.2018 10:34

См. аргументы опции success: http://api.jquery.com/jquery.ajax/
http://api.jquery.com/jQuery.ajax/#jqXHR

laimas 06.11.2018 10:50

Цитата:

Сообщение от Zhenyaxxxx
пытался смотреть в отладчике... но не разобрался пока как увидеть ответ...

На примере отладчика FF. Вкладка Сеть (хотя можно и в консоль выводить запросы), и предполагая, что вы исследуете асинхронные запросы, то выбрать только их отображение (кнопка XHR). Добавляем товар в корзину. В отладчике отобразиться асинхронный запрос, щелчок по которому откроет панель справа где можно просмотреть всю информацию о запросе. В этой панели во вкладке Ответ будет то, чем ответил сервер.

Теперь о куда мне вставлять 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;

laimas 06.11.2018 10:53

Nexus, это просто лишнее в данном случае, параметры запроса постоянны, нового сервер ничего не сообщает, ковыряться в заголовках смысла нет. А вот если так как я написал выше, то убрать тип json из запроса.

Nexus 06.11.2018 11:02

Цитата:

Сообщение от laimas
ковыряться в заголовках смысла нет

Все "ковыряние" в 2 строки вмещается :)

Цитата:

Сообщение от laimas
А вот если так как я написал выше, то убрать тип json из запроса.

Не понял о чем вы, можете написать номер комментария или сразу цитату упоминаемого текста?


Часовой пояс GMT +3, время: 22:31.