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)

Zhenyaxxxx 04.11.2018 19:35

Почему то не работает 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;
}

Белый шум 04.11.2018 23:48

Попробуйте так:
header('Location: /index.php?page=cart');

Если не сработает - смотрите реальные заголовки ответа (в браузере F12 -> вкладка Network).

laimas 05.11.2018 04:51

$.ajax(
dataType: 'json'
succes: function(data){
if(data['success']){
$('#cartCntItems') .html(data['cntItems']);
......

и какие в этом случае могут быть header('Location.... ?

Zhenyaxxxx 05.11.2018 16:42

Вот, забыл показать функции по корзине и стандартный блок с товаром, который выводится из БД (внизу). До сих пор не получилось сделать переадресацию 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

laimas 05.11.2018 18:35

Цитата:

Сообщение от Zhenyaxxxx
До сих пор не получилось сделать переадресацию header('Location: /index.php?page=cart'); после нажатия на кнопку купить...

И не получится, и функции корзины и прочее к этой проблеме отношения не имеют. Причина в асинхронном запросе клиента, а при нем ответ сервера помещается в некий контейнер, и это есть фоновый запрос на странице, и перенаправление не обязывает браузер делать переход для страницы текущей, просто он запросит данные по указанному в header адресу и ответ также поместит в контейнер. Если при этом ответ не будет JSON, то кроме ошибки вы ничего не получите.

Клиент должен делать перенаправление после ответа сервера на асинхронный запрос, при этом сервер может передать клиенту параметры запроса.

Zhenyaxxxx 05.11.2018 19:01

подскажите как мне исправить этот асинхронный запрос, на JSON?

laimas 05.11.2018 19:31

Цитата:

Сообщение от Zhenyaxxxx
как мне исправить этот асинхронный запрос, на нормальный?

Что значит "нормальный"? Асинхронный (ajax) запрос позволяет обмениваться данными с сервером без перезагрузки страницы.

Вы можете пояснить связь представленного вами кода Ajax запроса с кодом РНР и вашей проблемой? Если этот Ajax запрос есть выбор товара (добавление в корзину), причем клиенту предписано принимать JSON, то сервер и должен отдавать только json. Ну ежику же понятно, что о перенаправлении на другую страницу при этом не может быть и речи. Перейти можно только клиентом, как window.location.href = url?page=cart. Но как тогда быть с $('#cartCntItems') .html(data['cntItems']); и т.д.?

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

Zhenyaxxxx 05.11.2018 19:41

Нечего мне недоговаривать.... Раньше все работало.... постепенно редактировал сайт.... и не заметил когда появилась эта проблема.... но скрипты корзины не трогал.... теперь пытаюсь исправить.... Что нужно показать еще чтоб понять что я такого "наворотил"..? Мне этот switch не нравится.... он добавляет мне страницы, которые нужно скрывать от индекса... Скажите где, какой код вытащить, я все покажу....

laimas 05.11.2018 20:06

Цитата:

Сообщение от Zhenyaxxxx
Скажите где, какой код вытащить

Не надо никакого кода, достаточно пояснения - что есть ваш $.ajax, это и есть добавления товара в корзину? Если да, то после этого запроса вы и пытаетесь выполнить переход?

Или ... ?

Zhenyaxxxx 05.11.2018 20:27

Когда нажимаю кнопку "Купить", происходит переход по ссылке 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...

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 из запроса.

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

laimas 06.11.2018 11:05

Цитата:

Сообщение от Nexus
Все "ковыряние" в 2 строки вмещается

Ну да, и все ради того чтобы потом все равно ручками написать "перейти ...."?

Цитата:

Сообщение от Nexus
Не понял о чем вы, можете написать номер комментария

Какие комментарии, обмен с клиентом объявляется в json, мало того что он как собаке пятая лапа (судя по коду), так еще и хочется только перехода, так к чему он?

Nexus 06.11.2018 11:18

Цитата:

Сообщение от laimas
Какие комментарии, обмен с клиентом объявляется в json, мало того что он как собаке пятая лапа (судя по коду), так еще и хочется только перехода, так к чему он?

Понял о чем вы.

Цитата:

Сообщение от laimas
Ну да, и все ради того чтобы потом все равно ручками написать "перейти ...."?

Фактически да, так и будет, за исключением того, что адрес редиректа не будет жестко задан в js-коде.

laimas 06.11.2018 11:31

Цитата:

Сообщение от Nexus
адрес редиректа не будет жестко задан в js-коде

Это единственный плюс в данной ситуации. Но при большом минусе всей логики обмена с сервером - запрос на добавление -> обработка ответа, не несет вообще ничего полезного.

Zhenyaxxxx 06.11.2018 15:39

Еще раз со своей измучанной проблемой... переделал код 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...

Zhenyaxxxx 06.11.2018 15:56

Вообще удалил код js... и все равно зависаю в add_to cart

Nexus 06.11.2018 16:00

Цитата:

Сообщение от Zhenyaxxxx
window.location.href = url?page=cart;

Это не какое-то заклинание, а инструкция для браузера.
"window.location.href" говорит браузеру, что нужно открыть в этой вкладке страничку с другим адресом.
Вместо "url?page=cart" вы должны были написать адрес странички, на которую пользователя нужно перенаправить.
В итоге должно было получиться:
window.location.href='/index.php?page=cart';

laimas 06.11.2018 16:01

А причем add_to_cart при переходе или "зависает" при добавлении товара? Вы в отладчик заглядывали или до сих пор нет, что отвечает сервер?

В общем-то если при асинхронном добавлении товара после него делается переход, то выбрасывайте Ajax из добавления товара, толку то от него при этом никакого. Вместо этого кнопки добавления товара, это копки submit одной формы, отправляемой методом POST, значениями которых должны быть ID товаров, а именами ключ ожидаемый на сервере. Атрибут action формы можно сделать равным адресу корзины, куда и требуется перейти, то есть это позволит исключить лишнее перенаправление, а скрипт принимающий товары сделать на этой странице подключаемый.

Zhenyaxxxx 06.11.2018 16:03

Я думаю проблема не 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'); 

}

Zhenyaxxxx 06.11.2018 16:08

вот так переделал:
$('document').ready(function(){	
 function addtoCart(itemId){        
          window.location.href='/index.php?page=cart';
             } 
});

после перехода по ссылке /add_to_cart&id=666 - не перенаправляет

laimas 06.11.2018 16:09

Цитата:

Сообщение от Zhenyaxxxx
Я думаю проблема не js

Если вы воткнули в скрипт реально что я написал, а это просто пример, url?... то работать естественно не будет.

В switch на 80% одно и тоже, не нравится он, применяйте if...else, где для разного ключа страницы описать свои действия, общие после условия.

laimas 06.11.2018 16:11

Цитата:

Сообщение от Zhenyaxxxx
после перехода по ссылке /add_to_cart&id=666

А откуда взялся этот переход? Вы в конце концов можете объяснить как у вас добавляется товар? Когда можно будет лицезреть результат из отладчика?

Nexus 06.11.2018 16:21

И еще: mysql deprecated, используйте mysqli.
Цитата:

Внимание
Данное расширение устарело, начиная с версии PHP 5.5.0, и удалено в PHP 7.0.0. Используйте вместо него MySQLi или PDO_MySQL.

Zhenyaxxxx 06.11.2018 16:28

Цитата:

Сообщение от laimas (Сообщение 498009)
А откуда взялся этот переход? Вы в конце концов можете объяснить как у вас добавляется товар? Когда можно будет лицезреть результат из отладчика?

Сижу копаюсь в отладчике, не могу разобраться... уже и js удалил...
Перехожу по этой ссылке, когда нажимаю кнопку купить.... и выбирается по id товара... может вы заглянете...? https://ensy.com.ua/?page=vents

laimas 06.11.2018 16:35

А что там смотреть, 17 товаров, которых я не заказывал, на 0 гривен? :) Ссылку на страницу с товарами хотя бы покажите, чтобы ....

Zhenyaxxxx 06.11.2018 16:43

https://ensy.com.ua/?page=vents - это и есть ссылка, вниз прокручиваете...

laimas 06.11.2018 16:46

Цитата:

Сообщение от Zhenyaxxxx
вниз прокручиваете...

И что, внизу

ООО "Энергосистемы"
Киев, ул.Ильинская,11
☎ (050)44-33-502
ensycomua@gmail.com

Где товары с ценой, кнопкой добавить ...?

Zhenyaxxxx 06.11.2018 16:54

вроде исправил, посмотрите сейчас.. нужно нажать кнопку поиск в табличке

laimas 06.11.2018 16:58

Не вижу изменений: https://screenshots.firefox.com/NRy4...lU/ensy.com.ua

Где товары?

Zhenyaxxxx 06.11.2018 17:01

на фильтре по центру, нажмите красную кнопку поиск...

laimas 06.11.2018 17:09

Да.... сказать нечего.

У вас обычной ссылкой добавление товаров методом GET, поэтому скрипт JS боком и перенапрваить может РНР посредством header(). Причины по которым это может не работать я уже называл.

Вы что отладкой занимаетесь на удаленном сервере? Устанавливайте локальный, самый простой для установки, но приличный сервер, это Open Server. В нем отлаживайте, на удаленный загружается уже отлаженное. На локальном же включите вывод предупреждений и ошибок, тогда и увидите проблему. Можете и на удаленном включить вывод ошибок, но это не есть гут.


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