[PHP] Anders behandelen sessies/forms IE/Firefox

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een webshop gebouwd en zit vast met een heel vreemd probleem.

Het probleem:
Als je een product in je karretje gooit, wordt bij IE vaak 2 maal het gewenste aantal toegevoegd.

Wat ook vaak voorkomt is het volgende patroon:
- bijvoorbeeld 4 invullen -> add to cart
- er worden er 4 bij opgeteld
- hetzelfde nog een keer kopen -> 1 invullen, add to cart
- er worden er 5 bij opgeteld (snap ik niet)
- nog een keer -> 1 invullen, add to cart
- er wordt er gewoon 1 bijgeopgeteld.

In Firefox werkt alles zonder probleem. Ik maak nergens gebruik van cookies en weet ook wel dat sessies op de server opgeslagen worden. De gegevens van de cart worden overigens niet in de sessies opgeslagen, maar gewoon in de database a.d.h.v. het sessie-ID.

Nu ben ik een beetje ten einde raad. In Firefox werkt alles prima, maar ik snap niet hoe dat kan. Als je het zelf wilt proberen: de site staat op sfsbv.constantmutation.com.

De enige oplossing die ik me zo snel kan bedenken, is het sturen van HTTP-headers. Ik ken de HTTP-headers allemaal niet zo goed, en weet dus niet welke precies ik nodig heb, of waar ik het überhaupt moet zoeken (Cache-control misschien?).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik gok dat je je sessievariabelen niet helemaal netjes aanpast. Kun je wat relevante code laten zien? Dit is giswerk zo.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik gebruik dus geen sessie-variabelen.

Wat ik wel met de sessie doe:

iedere pagina beginnen met session_start();

Het ID van de cart ophalen uit de database a.d.h.v. session_id().

Verder automatisch carts uit de database verwijderen die ouder zijn de session.gc_maxlifetime (1440 sec. default).

maar goed, hier een stuk relevantie code. Dit komt uit een php-file, die op iedere pagina ge-include wordt. Het zorgt ervoor dat het karretje wordt weergegeven. Omdat het karretje toch op iedere pagina staat handel ik ook de add-to-cart-methodes etc. af in deze file.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    if ($_REQUEST['action'] == 'add' && isset($_REQUEST['prdID'])) {
        // item in karretje
        $addCount = isset($_REQUEST['count']) ? $_REQUEST['count'] : 1;
        $qry = "SELECT  crtID
                FROM    " . CART_TABLE . " C
                WHERE   C.crtSession = '" . session_id() . "'";
        $res = mysql_query($qry) or die("Database error<HR>" . mysql_error());
        if ($row = mysql_fetch_array($res)) {
            // gebruiker heeft al karretje
            $crtID = $row['crtID'];
            
            // sessie updaten
            $qry = "UPDATE  " . CART_TABLE . "
                    SET     crtLastUpdate = NOW()
                    WHERE   crtID = '$crtID'";
            mysql_query($qry) or die("Database error<HR>" . mysql_error());

            // 1. controleer of product al in karretje zit
            $qry = "SELECT  iteCount
                    FROM    " . CARTITEM_TABLE . "
                    WHERE   prdID = '" . $_REQUEST['prdID'] . "'
                    AND     crtID = '$crtID'";
            $resCount = mysql_query($qry) or die("Database error<HR>" . mysql_error());
            if ($rowCount = mysql_fetch_array($resCount)) {
                // product zit al in karretje
                $iteCount = $rowCount['iteCount'] + $addCount;
                $qry = "UPDATE  " . CARTITEM_TABLE . "
                        SET     iteCount = '$iteCount'
                        WHERE   crtID = '$crtID'
                        AND     prdID = '" . $_REQUEST['prdID'] . "'";
                mysql_query($qry) or die("Database error<HR>" . mysql_error());
            } // if
            else {
                // product toevoegen aan karretje
                $qry = "INSERT INTO " . CARTITEM_TABLE . "
                                    (crtID, prdID, iteCount)
                            VALUES  ('$crtID', '" . $_REQUEST['prdID'] . "', '$addCount')";
                mysql_query($qry) or die("Database error<HR>" . mysql_error());
            } // else
        } // if
        else {
            // er is nog geen cart
            // 1. cart maken
            $qry = "INSERT INTO " . CART_TABLE . "
                                (crtSession, crtLastUpdate)
                        VALUES  ('" . session_id() . "', NOW())";
            mysql_query($qry) or die("Database error<HR>" . mysql_error());
            $crtID = mysql_insert_id();

            // 2. product in karretje plaatsen
            $qry = "INSERT INTO " . CARTITEM_TABLE . "
                                (crtID, prdID, iteCount)
                        VALUES  ('$crtID', '" . $_REQUEST['prdID'] . "', '$addCount')";
            mysql_query($qry) or die("Database error<HR>" . mysql_error());
        } // else
    } // if

[ Voor 14% gewijzigd door NMe op 05-05-2005 17:17 . Reden: Syntax highlighting toegevoegd ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Misschien wordt het form 2x gesubmit (bijvoorbeeld omdat je ook met javascript nog dingen clientside doet)?

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

crisp schreef op donderdag 05 mei 2005 @ 17:15:
Misschien wordt het form 2x gesubmit (bijvoorbeeld omdat je ook met javascript nog dingen clientside doet)?
Lijkt me niet:
Wat ook vaak voorkomt is het volgende patroon:
- bijvoorbeeld 4 invullen -> add to cart
- er worden er 4 bij opgeteld
- hetzelfde nog een keer kopen -> 1 invullen, add to cart
- er worden er 5 bij opgeteld (snap ik niet)
- nog een keer -> 1 invullen, add to cart
- er wordt er gewoon 1 bijgeopgeteld.
Het lijkt me dat ie die 4 onthoudt op de een of andere manier, anders zouden er de eerste keer wel 8 bij opgeteld worden, of de tweede keer 2. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nope, ik heb op diverse plaatsen in het PHP-script wat laten echoën, om te zien of die code wordt uitgevoerd. Het benodigde stuk code wordt slechts 1 maal uitgevoerd, zoals het hoort.

Maar toch zit volgens mij is het niet zo'n simpele PHP-fout. Hoe verklaar je anders, dat het in Firefox wel goed werkt. (Probeer het maar, de site is toch nog in ontwikkeling en er wordt niks met bestellingen gedaan)

[ Voor 38% gewijzigd door Verwijderd op 05-05-2005 17:21 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21-09 12:54
Kun je niet de gegevens die de browser verstuurd, opvangen en uitlezen/analyseren mbv $_REQUEST en dan de verschillen naast elkaar leggen. Ik weet niet tot hoever je probleem reproduceerbaar is, maar dan kun je een pagina pakken waarbij deze problemen optreden.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tuurlijk. Een print_r($_REQUEST) van IE:

Array
(
[prdID] => 24
[action] => add
[count] => 2
[x] => 13
[y] => 13
[PHPSESSID] => 496ab4db5ca8b183fa37216044180fcc
)

en nog eentje van Firefox:

Array
(
[prdID] => 24
[action] => add
[count] => 2
[x] => 15
[y] => 10
[PHPSESSID] => 8f41c7137865bc0e0d86d73ed5b3407e
)

Het verschil: een andere sessie-waarde (nogal logisch). De [x] en [y] heb ik nergens zelf ingegeven. Ik heb wel ergens <input type="image" onClick="submit();"> gebruikt, dus ik verwacht dat x en y de coördinaten zijn, waarop geklikt is binnen het plaatje.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

waar is die onclick="submit()" voor? Een input type="image" doet standaard al een submit van het formulier.
Aangezien je de default action (het submitten dus) niet cancelled denk ik toch dat IE in bepaalde situaties 2x een formulier submit.

[ Voor 39% gewijzigd door crisp op 05-05-2005 17:32 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat was dus de 2e submit volgens mij. Ik ga het nog heel even testen, maar volgens mij heb je me de goede oplossing gegeven. Bedankt!

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Mag ik je een tip geven buiten het probleem om? Maak eens van alle die stukjes code waar commentaar bij staat een aparte functie. Geef hem dan een naam waaruit duidelijk wordt waar hij voor dient. Sowieso wordt je conditionele code dan een stuk duidelijker, ook is het een stuk leesbaarder en overzichtelijker. Bovendien zijn errors ook nog eens gemakkelijker op te sporen, omdat je alles in aparte functies indeelt (eigenlijk precies waarvoor functies bestaan dus) :)

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Daar geef ik je helemaal gelijk in. Dat doe ik wel in het onderhoudssysteem dat hier ook aan gekoppeld is. Als ik de shop voor een volgende opdracht kan gebruiken zal ik dit zeker zo maken.

Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

omg wat reageer ik traag

[ Voor 86% gewijzigd door Bergen op 05-05-2005 18:00 ]

Pagina: 1