Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Корзина на COOKIE


Автор: maugli 10.8.2008, 11:20
Здравствуйте, у меня возникла проблема при создании корзины на основе COOKIE. Есть у меня куки cart - в которых хранятся данные, т.е. это своего рода массив. Посмотрел и сделал как в мануале.
Есть файл класса:
Код
<?php
class cart
{    
    function cart_add()
    {
        $id = $_GET['id'];
        
        setcookie("cart[0]", "0");
        setcookie("cart[1]", "1");
        setcookie("cart[2]", "2");
        
        //Перезагрузка страницы
        $refresh = '<html>
        <head>
        <meta http-equiv="refresh" content="0; url=http://'.$_SERVER['HTTP_HOST'].'/cart/">
        </head>
        <body></body>';
        echo $refresh;              
    }
    function cart_print()
    {
        var_dump($_COOKIE['cart']);
    }
}
?> 
  

Есть файл который вызывает эти функции:
Код
<?php
if( isset($_GET['id']) )
{
    include "classes/class_cart.php";
    $object_cart = new cart();
    
    $object_cart->cart_add();
}
if( !isset($_GET['id']) )
{
    include "header.php";
    $object_cart->cart_print();
    include "footer.php"; 
}
?> 
  
И ничего не выводится. Когда просто втупую вставляю куки где-нибудь, то все нормально, а именно так не работает, подскажите в чем проблема?

P.S.
В корзину добавляется если ссылка cart/id/ (id - целое число) и с помощью .htaccess перенаправляется на файл в котором идем вызов функции cart_add();
Если ссылка cart/, то идет просто просмотр $_COOKIE с помощью функции cart_print();

Спасибо!

Автор: Ockonal 10.8.2008, 11:35
Вы пробывали проверять кукисы в браузере? 
Или написать: if( isset( $_COOKIES['cart'] ) ) { echo "true"; } else { echo "false"; };

Автор: maugli 10.8.2008, 11:46
Ockonal, я пробовал другие кукисы прописать, и даже эти но просто тупо вставив их выше хедера. А вот так вот когда функция, то он почему-то не ставит их. 
И если он выводит NULL значит и не прописались.

Автор: Ockonal 10.8.2008, 12:06
Цитата

и даже эти но просто тупо вставив их выше хедера. А вот так вот когда функция, то он почему-то не ставит их. 

Установка cookies должна быть раньше до отправки любого текста.
Попробуйте просмотреть исходный код страницы( в браузере ), может там есть закомментированные ошибки.

Автор: maugli 10.8.2008, 12:12
Ockonal, А как их можно просмотреть?

Автор: Ockonal 10.8.2008, 12:22
Их? Исходный код, или кукисы?
Cookies:
Например, в FireFox:
Инструменты->Настройки->Приватность->Показать Cookies

Автор: maugli 10.8.2008, 12:41
Ockonal, Ну тут теперь вообще ужас какой-то, в фаерфоксе, они установились, а в остальных броузерах нет. И то повторно они переставляться, на другие значения, не захотели. :(
Точнее они добавились, но не поверх старых значений, а просто добавили точно такие же куки с другими значениями.
Вообщем я уже совсем ничего не понимаю (это в фаерфоксе).

Как можно в других броузерах посмотреть значения кукисов?

Автор: Ockonal 10.8.2008, 12:46
Попробуйте ставить проверку, если такой cookies уже существует - удалить его.

Автор: maugli 10.8.2008, 12:48
Ockonal, Это я понял, спасибо
А что делать с тем, что в других броузерах они не отображаются?

Автор: Ockonal 10.8.2008, 12:52
Код

$id = $_GET['id'];
        
        setcookie("cart[0]", "0");
        setcookie("cart[1]", "1");
        setcookie("cart[2]", "2");
        
        //Перезагрузка страницы
        $refresh = '<html>
        <head>
        <meta http-equiv="refresh" content="0; url=http://'.$_SERVER['HTTP_HOST'].'/cart/">
        </head>
        <body></body>';
        echo $refresh;   

1) $id = $_GET['id']; - зачем вам это? Попробуйте пока закомментировать.
2) $refresh - допишите </html>

Автор: maugli 10.8.2008, 13:05
Ockonal, сделал так
Код
        setcookie("cart[0]", "50");
        setcookie("cart[1]", "60");
        setcookie("cart[2]", "70");
        
        //Перезагрузка страницы
        $refresh = '<html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
        <meta http-equiv="refresh" content="0; url=http://'.$_SERVER['HTTP_HOST'].'/cart/">
        </head>
        <body>&nbsp;</body></html>';
        echo $refresh; 


Ничего не отображается. Смотрю как вы и говорили в Фаерфоксе Инструменты->Настройки->Приватность->Показать Cookies
они там стоят, но не отображается ничего :(
просматриваю через var_dump($_COOKIE['cart']);

Автор: Ockonal 10.8.2008, 13:15
попробуйте 
Код

print_r( $_COOKIES );
print_r( $_COOKIES['cart']; );

Автор: maugli 10.8.2008, 13:22
Ockonal, сделал
Код
        if( isset($_COOKIE['cart']) )
            echo 'da';
        if( !isset($_COOKIE['cart']) )
            echo 'no';
        
        print_r($_COOKIE);

Они не установлены :(

Добавлено через 1 минуту и 4 секунды
А если просмотреть через настройки... в Фаерфоксе, то они там присутствуют :(

Автор: Ockonal 10.8.2008, 13:31
Попробуйте создать другой файл( temp.php )
записать просто ф-цию:
cart_add() {
  setcookie("cart", "0");
};
Инклудить ее, вызывать.

Добавлено через 1 минуту и 17 секунд
Попробуйте создавать не массив cart, а cart1, cart2, cart3

Автор: Letov 10.8.2008, 13:36
А у вас фал, устанавливающий кукисы и файл, на который происходит Refresh находятся с одной папке или в разных?
Может стоит установить хост и папку доступа к кукису.

---- Или вообще через сессии делать?

Автор: maugli 10.8.2008, 13:39
Ockonal,  сделал так:
Код
<?php
if( isset($_GET['id']) )
{
    setcookie("cart[0]", "50");
    setcookie("cart[1]", "150");
}
if( !isset($_GET['id']) )
{
    include "header.php";
    print_r($_COOKIE);
    include "footer.php";
}
?>


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

Автор: Ockonal 10.8.2008, 13:40
Сессии - установка кукиса...

Автор: Letov 10.8.2008, 13:43
Цитата(Ockonal @  10.8.2008,  14:40 Найти цитируемый пост)
Сессии - установка кукиса...

Ошибаетесь - все зависит от настройки php.
Даже если php настроен на установку кукиса для сохранения сессии, то он точно установит кукис=)

Автор: maugli 10.8.2008, 13:44
Letov, Это один и тот же файл.
Сессии не подходят, т.к. должны сохранять данные после закрытия окна.

Сделал следующее:
Код
<?php
if( isset($_GET['id']) )
{
    setcookie("cart[0]", "5");
    setcookie("cart[1]", "10");
    
    $refresh = '<html>
    <head>
    <meta http-equiv="refresh" content="0; url=http://'.$_SERVER['HTTP_HOST'].'/cart/">
    </head>
    <body>&nbsp;</body></html>';
    echo $refresh;  
}
if( !isset($_GET['id']) )
{
    include "header.php";
    print_r($_COOKIE);
    include "footer.php";
}
?>


Перестало работать, почему-то рефреш все портит. Что вообще происходит с этим миром? smile

Автор: Ockonal 10.8.2008, 13:45
По-ходу, из-за инклуда файла с классом.

Автор: Ockonal 10.8.2008, 13:48
Цитата(Letov @ 10.8.2008,  14:43)
Цитата(Ockonal @  10.8.2008,  14:40 Найти цитируемый пост)
Сессии - установка кукиса...

Ошибаетесь - все зависит от настройки php.
Даже если php настроен на установку кукиса для сохранения сессии, то он точно установит кукис=)

smile Если ошибка из-за отправки хедера браузеру - кукис не поставиться и при создании сессии.

Автор: Letov 10.8.2008, 13:48
Цитата(maugli @  10.8.2008,  14:44 Найти цитируемый пост)
Перестало работать, почему-то рефреш все портит. Что вообще происходит с этим миром? 

А если вместо рефреша ставить
Код

header('Location: '._SERVER['HTTP_HOST'].'/cart/');


Добавлено через 1 минуту и 14 секунд
Цитата(Ockonal @  10.8.2008,  14:48 Найти цитируемый пост)
Цитата(Letov @ 10.8.2008,  14:43)Цитата(Ockonal @  10.8.2008,  14:40 )Сессии - установка кукиса...Ошибаетесь - все зависит от настройки php.Даже если php настроен на установку кукиса для сохранения сессии, то он точно установит кукис=) Если ошибка из-за отправки хедера браузеру - кукис не поставиться и при создании сессии.

Надо ставить session_start(); перед выводом в браузер, и все будет нормально, или изменить настройки php, чтоб он сессии через адреса определял...

Добавлено через 2 минуты и 18 секунд
Да, если будет хоть бы один символ (и пробел тоже) перед <?php, то кукис тоже не поставится!

Автор: maugli 10.8.2008, 13:58
Letov, Все тоже самое.
Только если отдельный файл делаю, то все нормаль smile даже с рефрешом.

Буду тогда отдельный файл делать, для добавления куков smile

Всем спасибо, но все равно интересно что за лажа вообще smile естественно из-за моего незнания.

Автор: Ockonal 10.8.2008, 14:10
Я думаю, из-за инклуда smileПопробуйте создать класс в том же документе и использовать его? 

Автор: Letov 10.8.2008, 14:25
Цитата(Ockonal @  10.8.2008,  15:10 Найти цитируемый пост)
Я думаю, из-за инклуда Попробуйте создать класс в том же документе и использовать его? 

Из-за Инклуда не должно. У меня весь сайт на инклудах - и все работает.

Автор: HackMan 10.8.2008, 20:19
Так, давай попорядку.


Цитата(maugli @  10.8.2008,  13:44 Найти цитируемый пост)
Сессии не подходят, т.к. должны сохранять данные после закрытия окна.

Вообще-т кука с данными о сессии хранится до закрытия браузера, а не окна. Или это и имелось в виду? Ну да ладно, допустим. 

Цитата(maugli @  10.8.2008,  13:44 Найти цитируемый пост)
    setcookie("cart[0]", "5");
    setcookie("cart[1]", "10");


Идёт на php.net и читаем:
Цитата

bool setcookie  ( string $name  [, string $value  [, int $expire  [, string $path  [, string $domain  [, bool $secure  [, bool $httponly  ]]]]]] )


Теперь читаем дальше:
Цитата

 expire

    The time the cookie expires. This is a Unix timestamp so is in number of seconds since the epoch. In other words, you'll most likely set this with the time() function plus the number of seconds before you want it to expire. Or you might use mktime(). time()+60*60*24*30 will set the cookie to expire in 30 days. If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).

        Замечание: You may notice the expire parameter takes on a Unix timestamp, as opposed to the date format Wdy, DD-Mon-YYYY HH:MM:SS GMT, this is because PHP does this conversion internally.
        expire is compared to the client's time which can differ from server's time. 


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

Читаем ещё дальше:
Цитата

 path

    The path on the server in which the cookie will be available on. If set to '/', the cookie will be available within the entire domain . If set to '/foo/', the cookie will only be available within the /foo/ directory and all sub-directories such as /foo/bar/ of domain . The default value is the current directory that the cookie is being set in.


У меня такое подозрение, что кука устанавливается из какого-нибудь /public_html/subdirectory/index.php, а вызывается из /public_html/index.php. Попробуй явно задать '/'

Автор: maugli 10.8.2008, 20:37
HackMan, Спасибо за ответ, сделал уже по-другому.
Тут у меня теперь в другом вопрос smile записывать я их записываю, а вот с удалением проблема.
Написал следующее:
Код
if( isset($_GET['id']) && $_GET['action'] == "delete" )
{
    $id = $_GET['id'];
    $i = $_GET['i'];
    
    //print_r($_COOKIE['cart']); echo '<br>';
    
    setcookie("cart[$i]", $id, time()-60*60*24*30);
}
header('Location: http://'.$_SERVER['HTTP_HOST'].'/cart/');

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

Автор: HackMan 10.8.2008, 21:06
Пропускай второй параметр:
Код

setcookie("cart[$i]", "", time()-3600);

Автор: maugli 10.8.2008, 21:29
HackMan, Сделал так, но все равно не удаляет. В чем может быть проблема?

Автор: Letov 10.8.2008, 21:43
Процитирую из книги М. Кузнецова и И. Симдянова: PHP 5
Цитата

Уничтожить cookie можно, установив нулевое время жизни, как это продемонстрировано в листинге
Код

<?php
   setcookie("name", "value");
?>

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

Автор: maugli 10.8.2008, 21:50
Letov, Я никаких ограничений не ставил smile
удаляю так как в мануалах написано. Я не понимаю почему первый удаляющийся, удаляются, а все последующий нет?

Автор: Ockonal 10.8.2008, 21:56
Letov, если уж так уничтожать, то есть специальная ф-ция: unsetcookie... Или я не прав?

Автор: HackMan 10.8.2008, 21:58
Letov, это я уже процитировал из мануала:

Цитата(HackMan @  10.8.2008,  20:19 Найти цитируемый пост)
If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).


maugli, ты может и не ставил, но всё же

Цитата(HackMan @  10.8.2008,  20:19 Найти цитируемый пост)
The default value is the current directory that the cookie is being set in.

Цитата(HackMan @  10.8.2008,  20:19 Найти цитируемый пост)
Попробуй явно задать '/' 

имеется в виду, когда создаёшь куку, а не уничтожаешь

Ockonal, не прав, нет такой функции

Автор: Ockonal 10.8.2008, 22:03
HackMan
Спасибо! Напомнил... Я просто удалял кукисы с помощью unset( $_COOKIES .. )

Автор: HackMan 10.8.2008, 22:05
Ockonal, не за что. А таким вот образом нельзя куки удалять

Автор: Ockonal 10.8.2008, 22:10
smile А можно спросить, как тогда?
На сколько я помню, я использовал это для выхода( как назвать... заканчивание сессии юзера ).

Автор: maugli 10.8.2008, 22:10
HackMan, Все равно не удаляет :(

Добавлено @ 22:11
И еще не подскажете функцию, которая дает ключи массива, или последний ключ массива, а то обыскался уже, или функцию которая переписывает ключи заново?
Спасибо!

Автор: HackMan 10.8.2008, 22:16
Ockonal, прочитай предыдущие сообщения

Цитата(maugli @  10.8.2008,  20:37 Найти цитируемый пост)
    $i = $_GET['i'];

что такое $_GET['i']?


Цитата(maugli @  10.8.2008,  22:10 Найти цитируемый пост)
функцию, которая дает ключи массива,

http://php.net/array_keys

Автор: maugli 10.8.2008, 22:17
HackMan, я передаю значение куки и ее номер в массиве, чтобы удалить можно было
i - это номер в массиве, ее ключ.

Автор: HackMan 10.8.2008, 22:20
Цитата(maugli @  10.8.2008,  20:37 Найти цитируемый пост)
Удаляет только то, что удалю первым

это как?

Что в дампе массивов $_GET и $_COOKIE

Автор: maugli 10.8.2008, 22:23
Извините, за мой тупизм, из-за того, что передавал не те ключи, он и не удалял.
Всем спасибо, еще раз Извините, что отнял время.

Спасибо!

Автор: HackMan 10.8.2008, 22:26
maugli, всегда пожалуйста. Обращайся ещё  smile 
Не забудь тему пометить решённой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)