Autor Zpráva
imtoo
Profil
Dobrý den,

upravuji svůj dříve napsaný eshop (kde nákupní košík v pořádku fungoval), ale v nové verzi mi moc nefunguje. Konkrétně mám stránku s produktem (product.php) a z toho vede tlačítkem odkaz na skript (cart_script) přidávající výrobek do $_SESSION["cart"] a přesměrovává ze skriptu na košík (cart.php). Ihned po přesměrování na cart.php se mi zobrazuje správně hodnota košíku (i když dám ctrl + F5), dokonce i když přejdu na odeslání objednávky (order_conf.php) je hodnota košíku správná. Jakmile, ale přejdu na nějakou další stránku (index.php, contact.php,product.php) tak hodnota $_SESSION["cart"] není žádná, i když poté z této stránky přejdu na cart.php nebo order_conf.php, tak nemám hodnotu session také žádnou. Na začátku každé stránky mám session_start();.

product.php - odkaz na přidání produktu
<a href="http://www.domain.com/eshop/cart_script.php?action=add&id=13" class="btn btn-ex btn-cart btn-black">

cart_script.php
<?
session_start();
if (htmlspecialchars($_GET["action"]) == "add")
{  
$_SESSION["cart"][intval($_GET["id"])] = "1";  // přidá 1 ks do košíku
Header("Location: http://www.domain.com/eshop/cart.php");
}
elseif (htmlspecialchars($_GET["action"]) == "delete")
{
unset($_SESSION["cart"][intval($_GET["id"])]); //smaže session výrobku
Header("Location: http://www.domain.com/eshop/cart.php");
}
else
{
Header("Location: http://www.domain.com/eshop/cart.php");
}
?>

Všechny stránky jsou tvořeny takto (začátek všech stránek jako index.php, cart.php, order_conf.php, contact.php, product.php)
<?
session_start();
include "res/connect.php"; //připojení k db
include "res/header.php";

...HTML kód
?>

Kde v header.php je právě zmíněný košík, který násobí počty druhů produktů s cenou uloženou v db a pak vypíše celkovou hodnotu košíku.

header.php - zobrazení košíku
...HTML kód
<?
if (!isset($_SESSION["cart"])) {   //vypsání celkové ceny
echo "0";
}
else{
$result = mysql_query("SELECT * FROM goods WHERE id IN ('" . implode("', '", array_keys($_SESSION["cart"])) . "')") or die ("");  //vybere údaje z tabulky goods podle všech klíču v session cart
        while ($row = mysql_fetch_assoc($result)) {
        $_SESSION["sum"][$row["id"]] = $_SESSION["cart"][intval($row["id"])]*$row["price"];
                            }
        mysql_free_result($result);
                    $sum_price = array_sum($_SESSION["sum"]);
            echo $sum_price;  
                 }?>
...HTML kód

Několik dní už nad tím dumám s googlem a nemůžu na nic přijít. Uvítám všechny rady a předem děkuji za věnovaný čas.
Alphard
Profil
Zkoušel jste už debugovat stylem, že na každou stránku dáte nějaké var_dump($_SESSION); a trochu to proklikáte? Odstíní se tím další podmínky a možné chyby. Pokud v nějakém případě přechodu na jinou stránku session skutečně zmizí a jste si jistý, že všude bylo validně session_start() (třeba selhání kvůli BOM a potlačená chybová hláška?), bude třeba hledat konkrétní příčinu. Zmizela cookie, nebo session soubor? Případně kouknout do nastavení, jestli jsou v pořádku všechny cesty apod.
(Podobných vláken pamatuji více, obvykle tazatel najde nějakou „hloupou“ chybu nebo překlep, který přehlížel.)
rafej
Profil
Taky bych si prověřila tok stránek - tj. průběh nákupního procesu a výstupní stránky.
Kde odstraňujete SESSION po úspěšném dokončení nákupu?
Nemůže se stát, že odskok na specifickou stránku resetuje SESSION?
Co se stane při nedokončeném nákupu nebo při neúspěšném odeslání objednávky/košíku?
imtoo
Profil
Alphard:

Zkoušel jsem var_dump($_SESSION) - U stránek kde je košík nulový (když by neměl být) mi to vypíše array(0) { }. Hned po přidání produktu do košíku to vypíše array(2) { ["cart"]=> array(1) { [13]=> string(1) "1" } ["sum"]=> array(1) { [13]=> int(2999) } }

Žádné chybové hlášky jsem po error_reporting(15); neobjevil.

Můžete mi prosím poradit kde mám hledat session soubor? session.save_path mám nastaveno na /fs/tmp, ale nemůžu ho nikde najít.

Díky moc.


rafej:

Session odstraňuji na stránce order_conf.php po uložení objednávky do databáze.

Žádný kód co by měl resetovat session jsem nikde nenašel.

Při nedokončeném nákupu/neúspěšně odeslané objednávce se se session nic neděje, mělo by zůstat stejné do zavření prohlížeče, popř. po určitém časovém intervalu zmizet, ne?

Zvláštní je, že mi to na prvním hostingu v rámci stejného poskytovatele v pohodě běží, ale na druhém hostingu už ne. A to jsem pouze přesunul kód do menu v souboru header.php, takže mě akorát napadá jestli to třeba není includováním souborů.
Davex
Profil
Liší se nějak výpis parametrů ve skriptech, kde je a není vidět obsah košíku?

<?php
  session_start();

  var_dump($_SERVER["HTTP_HOST"], $_SERVER["SERVER_PORT"], session_id(), session_save_path(), session_cache_limiter());
  print_r(session_get_cookie_params());
imtoo
Profil
Joooo, vyřešeno!

Díky Davex. U var_dump($_SERVER["HTTP_HOST"]) jsem si všimnul, že na stránkách kde jsem košík viděl bylo "domain.com" a tam kde nebyl košík vidět bylo "www.domain.com".

Takže jsem upravil odkaz pro přidání produktu do košíku z <a href="http://www.domain.com/eshop/cart_script.php?action=add&id=13" class="btn btn-ex btn-cart btn-black"> na <a href="domain.com/eshop/cart_script.php?action=add&id=13" class="btn btn-ex btn-cart btn-black"> a už to běží.

Ještě jednou moc díky!

Zamykám.
Moderátor jenikkozak: Pro zamknutí není důvod.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: