Avatar billede identity Nybegynder
06. februar 2007 - 17:52 Der er 6 kommentarer

Problem med session, cannot send session cache

Jeg har et problem med sessions, jeg har fundet et lille simpelt shopping cart som jeg benytter.
Scriptet er hentet herfra :
http://www.thewatchmakerproject.com/journal/276/building-a-simple-php-shopping-cart

Jeg har så delt scriptet op, så jeg har 2 filer, en der hele tiden viser hvor mange "items" man har i sin kurv - og så en anden fil med selve oversigten.

Den som viser antal af vare i kurv virker fint, men når jeg så går ind på selve kurven med oversigten, får jeg følgende error :

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /var

Den får jeg vel fordi at sessionen allerede kører ikke?
Den viser antal fint nok i kurv, men den melder overstående fejl.

I begge filer har jeg følgende kode i toppen :
<?php
// Include MySQL class
require_once('inc/mysql.class.php');
// Include database connection
require_once('inc/global.inc.php');
// Include functions
require_once('inc/functions.inc.php');
// Start the session
session_start();
// Process actions
$cart = $_SESSION['cart'];
$action = $_GET['action'];
switch ($action) {
    case 'add':
        if ($cart) {
            $cart .= ','.$_GET['id'];
        } else {
            $cart = $_GET['id'];
        }
        break;
    case 'delete':
        if ($cart) {
            $items = explode(',',$cart);
            $newcart = '';
            foreach ($items as $item) {
                if ($_GET['id'] != $item) {
                    if ($newcart != '') {
                        $newcart .= ','.$item;
                    } else {
                        $newcart = $item;
                    }
                }
            }
            $cart = $newcart;
        }
        break;
    case 'update':
    if ($cart) {
        $newcart = '';
        foreach ($_POST as $key=>$value) {
            if (stristr($key,'qty')) {
                $id = str_replace('qty','',$key);
                $items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart);
                $newcart = '';
                foreach ($items as $item) {
                    if ($id != $item) {
                        if ($newcart != '') {
                            $newcart .= ','.$item;
                        } else {
                            $newcart = $item;
                        }
                    }
                }
                for ($i=1;$i<=$value;$i++) {
                    if ($newcart != '') {
                        $newcart .= ','.$id;
                    } else {
                        $newcart = $id;
                    }
                }
            }
        }
    }
    $cart = $newcart;
    break;
}

Er der en slags session resume ting i php?
Avatar billede mccookie Seniormester
06. februar 2007 - 18:01 #1
Det lyder mere som du sender output før din session_start() er startet....


Sæt den lige under <?php

///McCookie
Avatar billede identity Nybegynder
06. februar 2007 - 18:19 #2
Nej det er ikke det, har prøvet at sætte session start helt i top.
Nedenstående kan du se koden jeg bruger - der er ikke nogle problemer hvis jeg ikke har session start i den anden fil, men så får jeg jo ikke vist indholdet på de andre sider....

<?php
// Start the session
session_start();
// Include MySQL class
require_once('inc/mysql.class.php');
// Include database connection
require_once('inc/global.inc.php');
// Include functions
require_once('inc/functions.inc.php');
// Process actions
$cart = $_SESSION['cart'];
$action = $_GET['action'];
switch ($action) {
    case 'add':
        if ($cart) {
            $cart .= ','.$_GET['id'];
        } else {
            $cart = $_GET['id'];
        }
        break;
    case 'delete':
        if ($cart) {
            $items = explode(',',$cart);
            $newcart = '';
            foreach ($items as $item) {
                if ($_GET['id'] != $item) {
                    if ($newcart != '') {
                        $newcart .= ','.$item;
                    } else {
                        $newcart = $item;
                    }
                }
            }
            $cart = $newcart;
        }
        break;
    case 'update':
    if ($cart) {
        $newcart = '';
        foreach ($_POST as $key=>$value) {
            if (stristr($key,'qty')) {
                $id = str_replace('qty','',$key);
                $items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart);
                $newcart = '';
                foreach ($items as $item) {
                    if ($id != $item) {
                        if ($newcart != '') {
                            $newcart .= ','.$item;
                        } else {
                            $newcart = $item;
                        }
                    }
                }
                for ($i=1;$i<=$value;$i++) {
                    if ($newcart != '') {
                        $newcart .= ','.$id;
                    } else {
                        $newcart = $id;
                    }
                }
            }
        }
    }
    $cart = $newcart;
    break;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>test</title>
<link href="../images/style.css" rel="stylesheet" type="text/css">

</head>
<body>

<?php
echo showCart();
?>

</body>
</html>
Avatar billede identity Nybegynder
06. februar 2007 - 18:22 #3
Det kan vel ikke have noget at gøre med min anden fil : inc/functions.inc.php
Den ser sådan her ud
<?php
function showCart() {
    global $db;
    $cart = $_SESSION['cart'];
    if ($cart) {
        $items = explode(',',$cart);
        $contents = array();
        foreach ($items as $item) {
            $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
        }
        $output[] = '<form action="cart.php?action=update" method="post" id="cart">';
        $output[] = '<table>';
        foreach ($contents as $id=>$qty) {
            $sql = 'SELECT * FROM db_article WHERE num = '.$id;
            $result = $db->query($sql);
            $row = $result->fetch();
            extract($row);
            $output[] = '<tr>';
            $output[] = '<td><a href="cart.php?action=delete&id='.$id.'" class="r">Remove</a></td>';
            $output[] = '<td>'.$title.' by '.$author.'</td>';
            $output[] = '<td>&pound;'.$price.'</td>';
            $output[] = '<td><input type="text" name="qty'.$id.'" value="'.$qty.'" size="3" maxlength="3" /></td>';
            $output[] = '<td>&pound;'.($price * $qty).'</td>';
            $total += $price * $qty;
            $output[] = '</tr>';
        }
        $output[] = '</table>';
        $output[] = '<p>Grand total: <strong>&pound;'.$total.'</strong></p>';
        $output[] = '<div><button type="submit">Update cart</button></div>';
        $output[] = '</form>';
    } else {
        $output[] = 'Der er ikke tilføjet noget';
    }
    return join('',$output);
}

function writeShoppingCart() {
    $cart = $_SESSION['cart'];
    if (!$cart) {
        return 'Din kurv er tom!';
    } else {
        // Parse the cart session variable
        $items = explode(',',$cart);
        $s = (count($items) > 1) ? 'er':'';
        return '<a href="http://www.funtastic.dk/tilbud/cart.php">'.count($items).' enhed'.$s.' i din kurv</a>';
    }
}
?>
Avatar billede mccookie Seniormester
06. februar 2007 - 18:23 #4
og du er 100 på at du ikke har nogen linieskift som driller.....

Den siger jo at der er allerede er sendt noget til browseren
Avatar billede identity Nybegynder
06. februar 2007 - 18:54 #5
Hmm, det er underligt, der er et eller andet i mit design, der gør at den laver den fejl. Hvis jeg tager originalen så virker det, hvis jeg så lægger mit design efter det originale melder den straks fejl.

Hvad kan det være der gør det?
Avatar billede identity Nybegynder
06. februar 2007 - 19:40 #6
Det er lige så snart jeg fjerner det oprindelige style sheet.
Scriptet jeg har fundet kører med div men jeg bruger tabeller.

Men hvorfor påvirker det headeren?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester