Avatar billede acmed Nybegynder
29. oktober 2005 - 02:19 Der er 25 kommentarer

Problemer med sessions mv

Jeg er stødt på et problem i forbindelse med implementering af et script med sessions.
Konkret drejer det sig om dette script:
http://easy-shave.com/shop.php

Det virker ganske fint når man bare kører det via ovenstående link.
Når jeg så prøver at indkorporere det i mit site, fungerer det ikke.
Når man trykker på tilføj et produkt på sitet indeholder linket pludselig sessionID - det gør det ikke i ovenstående link.
Jeg har lagt scriptet ind her på sitet så I kan se problemet (som jo er at der intet sker når man f.eks. vil tilføje et produkt mv.).
http://easy-shave.com/?menuID=13

Det skal tilføjes at jeg i forvejen bruger sessions på siden i anden sammenhæng og de fungerer ganske fint.
Avatar billede acmed Nybegynder
29. oktober 2005 - 02:20 #1
Scriptet ser således ud:
<SHOP.PHP>
<?

error_reporting(0);

require("merchantfront.php");

session_name("mysession");
session_start();
if (!session_is_registered("basket")) {
    $basket=new Basket;
    session_register("basket");
}

// Perform Cart Actions
if (isset($A))
{

if ($A=="Remove")
  {
  $basket->Del_Item($P);
  }
}


// End Cart Actions

if ($A=="Add") {
$basket->Add_Item("FORE2","George Foreman Grill",1,19.95,"YadaYada",".0675","black","XXL");
              }
// $basket->Set_Item_Quantity(0,2);
?>

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
<style>
<!--
.netscape6problem        { font-family: Verdana,Arial,Helvetica; font-size: 10px; }
.smallnormal            { font-family: Verdana,Arial,Helvetica; font-size: 10px; }
.smallnormaltable        { font-family: Verdana,Arial,Helvetica; font-size: 10px; color: black; }
.smallnormaltablealt        { font-family: Verdana,Arial,Helvetica; font-size: 10px; color: red; }
.mednormal                { font-family: Verdana,Arial,Helvetica; font-size: 12px }
.mednormaltable        { font-family: Verdana,Arial,Helvetica; font-size: 12px; color: black; }
.mednormalhighlight        { font-family: Verdana,Arial,Helvetica; font-size: 12px; color: black; background: yellow; }
.medbold                { font-family: Verdana,Arial,Helvetica; font-size: 12px; font-weight: bold }
.medboldalt                { font-family: Verdana,Arial,Helvetica; font-size: 12px; font-weight: bold; color: red; }
.medboldtable            { font-family: Verdana,Arial,Helvetica; font-size: 12px; font-weight: bold; color: black; }
.largebold                { font-family: Verdana,Arial,Helvetica; font-size: 18px; font-weight: bold }
.smallcompact            { font-family: Verdana,Arial,Helvetica; font-size: 10px }
.smallbold                { font-family: Verdana,Arial,Helvetica; font-size: 10px; font-weight: bold }
.smallboldtable            { font-family: Verdana,Arial,Helvetica; font-size: 10px; font-weight: bold; color: black; }
.smallboldtablealt        { font-family: Verdana,Arial,Helvetica; font-size: 10px; font-weight: bold; color: #99CCFF; }
.smallboldtabletop        { font-family: Verdana,Arial,Helvetica; font-size: 10px; font-weight: bold; color: black; }
.smallboldtemplate        { font-family: Verdana,Arial,Helvetica; font-size: 10px; font-weight: bold; color: black;}
.smallboldfooter            { font-family: Verdana,Arial,Helvetica; font-size: 10px; color: #999999;}
.locationbar                { font-family: Verdana,Arial,Helvetica; font-size: 10px; color: black; }

A:link                    {text-decoration: underline; color: black; }
A:visited                {text-decoration: underline; color: black; }
A:hover                    {text-decoration: underline; color: red; }

A.minibasket:link        {text-decoration: underline; color: blue; }
A.minibasket:visited        {text-decoration: underline; color: blue; }
A.minibasket:hover        {text-decoration: underline; color: red; }

A.table:link                {text-decoration: underline; color: blue; }
A.table:visited            {text-decoration: underline; color: blue; }
A.table:hover            {text-decoration: underline; color: red; }

A.templatemenu:link            {text-decoration: none; color: white; }
A.templatemenu:visited        {text-decoration: none; color: white; }
A.templatemenu:hover        {text-decoration: underline; color: red; background: #FFDD00; }


A.locationlink:link        {text-decoration: underline; color: black; }
A.locationlink:visited        {text-decoration: underline; color: black; }
A.locationlink:hover        {text-decoration: underline; color: red; }

table.minibasket            {background-color: white; }
tr.minibasketline         {background-color: #EEEEEE; }

hr        { height: 1; color: #DDDDDD }
pre        { font-family: Courier; font-size: 10px; }
select    { font-family: Verdana; font-size: 10px; color: black; background-color: white; border-color: #DDDDDD; }

table.mainpage                {background-color: white; }
tr.mainpagetableline             {background-color: #99CCFF; }
tr.mainpagetableline2         {background-color: #99CCFF; }
tr.mainpagetablespecial        {background-color: #DDDDDD; }
tr.mainpageversionhighlight    {background-color: #FFFF00; }

.buttonstyle    {font-family: Verdana; font-size: 10px; font-weight: bold; color: #666666; background-color: #DDDDDD; border-style: outset; border-color: #999999; border-width: 1px }
-->
</style>
</head>
<body>


<table class="mainpage" cellSpacing="0" cellPadding="5" width="100%" border="0">
  <tbody>
    <tr>
      <td>
        <div align="center">
          <center>
        <table cellSpacing="0" cellPadding="1" width="75%" border="0">
          <tbody>
            <tr>
              <td width="95"></td>
              <td width="252"></td>
              <td class="smallboldtabletop" align="right" width="66">price ($)</td>
              <td class="smallboldtabletop" align="right" width="59">
                <p align="center">&nbsp;&nbsp;&nbsp; qty</p>
              </td>
              <td width="57"></td>
            </tr>
<form method="post" action="shop.php?A=Update">
            <?
            $count=0;
            $myid="";
            $myquantity="";
            if ($basket->Get_Basket_Count()>0) {  # are there items in the basket
    $pos = $basket->Enum_Items(true);
    while ($pos>=0) {
        // Update Cart Quantities
        if (isset($A)) {
          if ($A=="Update")
            {
            $myvalue=$howmany[$pos];
            $basket->Set_Item_Quantity($pos,$howmany[$pos]);
            }
                    }

          $mytext="<tr class='mainpagetableline2'>";
          $mytext.="<td class='medboldtable' colSpan='6' width='614'> ".$basket->Get_Item_Name($pos)." - ".$basket->Get_Item_Color($pos)." - ".$basket->Get_Item_Size($pos)."</td>";
            $mytext.="</tr><tr>";
            $mytext.="<td class='smallnormaltable' vAlign='center' width='95'><a href='product.php?product=WHATEVER&V=27&ph=basket'>See Item</a></td>";
            $mytext.="<td class='smallnormaltable' vAlign='center' align='left' width='252'>".$basket->Get_Item_ID($pos)."</td>";
          $mytext.="<td class='smallboldtable' vAlign='center' align='right' width='66'>".$basket->Get_Item_Price($pos)."</td>";
          $mytext.="<td vAlign='center' align='right' width='59'><input size='3' value='".$basket->Get_Item_Quantity($pos)."' name='howmany[$pos]'></td>";
          $mytext.="<td class='smallnormaltable' vAlign='center' align='right' width='57'><a href='shop.php?A=Remove&P=".$pos."'>Remove</a></td>";
          $price=$basket->Get_Item_Price($pos);
          $quantity=$basket->Get_Item_Quantity($pos);
          $total=number_format(($total + ($price*$quantity)), 2, '.', '');
          print $mytext;
        $pos = $basket->Enum_Items();
    }
}

          if (!isset($pos)) { ?>
          <align="center">No Items in Cart</align>
          <? }

?>


          </tbody>
        </table><BR>
              <table width="75%">
              <TR>
              <td class="smallboldtabletop" align="right" width="100%">Total($): $<? print $total; ?></td>
            </tr>
            </table><BR>
        <input type="submit" name="submit" value="Update Quantities">
<form><BR><BR>
<a href="add.php?A=Add&itemid=FORE2">Add Product - FORE 2</a>
<BR><BR>
<a href="add.php?A=Add&itemid=FORE1">Add Product - FORE 1</a>
<BR><BR>
<a href="add.php?A=Add&itemid=FORE3">Add Product - FORE 3</a>
          </center>
        </div>
      </td>
    </tr>
  </tbody>
</table>
<p align="center">&nbsp;</p>
</body>

</html>
Avatar billede acmed Nybegynder
29. oktober 2005 - 02:20 #2
<ADD.PHP>
<?
error_reporting(0);

require("merchantfront.php");

session_name("mysession");
session_start();
if (!session_is_registered("basket")) {
    $basket=new Basket;
    session_register("basket");
}


$myid="";
$myquant="";
$zpos="";

  if ($basket->Get_Basket_Count()>0) {  # are there items in the basket
    $pos = $basket->Enum_Items(true);
    while ($pos>=0) {



          if ($basket->Get_Item_ID($pos)==$itemid)
              {
              $basket->Set_Item_Quantity($pos,($basket->Get_Item_Quantity($pos)+1));
              $addprod="no";
              }


          $myid=$basket->Get_Item_ID($pos);
          $myquant=$basket->Get_Item_Quantity($pos);
          $zpos=$pos;

          $pos = $basket->Enum_Items();
                  }
}

if ($addprod!="no")
              {
              $basket->Add_Item($itemid,"George Foreman Grill",1,19.95,"YadaYada",".0675","black","XXL","1");
              }

header("Location:shop.php");
?>
Avatar billede acmed Nybegynder
29. oktober 2005 - 02:21 #3
<MERCHANTFRONT.PHP>
<?
class Basket {
        var $basket_count;
        var $basket_item_id;
        var $basket_item_name;
        var $basket_item_quantity;
        var $basket_item_data;
        var $basket_item_price;
        var $basket_item_tax;
        var $basket_item_color;
        var $basket_item_size;

        function Basket() {
                $this->basket_count=0;
        }
        function Add_Item($ID,$name,$quantity=1,$price=0,$data='',$tax,$color,$size,$weight) {

                $this->basket_item_id[$this->basket_count]=$ID;
                $this->basket_item_name[$this->basket_count]=$name;
                $this->basket_item_quantity[$this->basket_count]=$quantity;
                $this->basket_item_data[$this->basket_count]=$data;
                $this->basket_item_price[$this->basket_count]=$price;
                $this->basket_item_tax[$this->basket_count]=$tax;
                $this->basket_item_color[$this->basket_count]=$color;
                $this->basket_item_size[$this->basket_count]=$size;
                $this->basket_item_weight[$this->basket_count]=$weight;

                $this->basket_count++;
                return ($this->basket_count-1);
        }
        function Del_Item($pos) {
                $this->basket_item_id[$pos]='';
        }
        function Get_Item_ID($pos) {
                return $this->basket_item_id[$pos];
        }
        function Get_Item_Name($pos) {
                return $this->basket_item_name[$pos];
        }
        function Get_Item_Price($pos) {
                return $this->basket_item_price[$pos];
        }
        function Get_Item_Quantity($pos) {
                return $this->basket_item_quantity[$pos];
        }
        function Get_Item_Data($pos) {
                return $this->basket_item_data[$pos];
        }
        function Get_Item_Tax($pos) {
                        return $this->basket_item_tax[$pos];
        }
        function Get_Item_Color($pos) {
                        return $this->basket_item_color[$pos];
        }
        function Get_Item_Size($pos) {
                        return $this->basket_item_size[$pos];
        }
        function Get_Item_Weight($pos) {
                                return $this->basket_item_weight[$pos];
        }
        function Set_Item_Quantity($pos,$quantity) {
                $this->basket_item_quantity[$pos]=$quantity;
        }
        function Set_Item_Data($pos,$data) {
                $this->basket_item_data[$pos]=$data;
        }
        function Enum_Items($start=false) {
                static $current;
                if ($current>=$this->basket_count) return -1;
                if (!$start) {
                        $current++;
                } else {
                        $current=0;
                }
                while (($this->basket_item_id[$current]=='') && ($current<$this->basket_count)) {
                        $current++;
                }
                return ($current<$this->basket_count) ? $current : -1;
        }
        function Empty_Basket() {
                $this->basket_count=0;
        }
        function Get_Basket_Count() {
            $num=0;
            for ($i=0;$i<$this->basket_count;$i++) {
                        if ($this->basket_item_id[$i]!='') $num++;
            }
            return $num;
        }
}
?>
Avatar billede jakobdo Ekspert
29. oktober 2005 - 07:52 #4
Har du evt et link til din side?
Det er sgu lidt meget kode at læse igennem! :o)
Avatar billede acmed Nybegynder
29. oktober 2005 - 13:40 #5
Hej Jakobdo.
Jeg har skrevet begge links i første post ;-)
Men her er de igen:

Konkret drejer det sig om dette script:
http://easy-shave.com/shop.php

Her har jeg indsat dem på min egen side.
http://easy-shave.com/?menuID=13

Koden er der sådan set ikke noget i vejen med - den fungerer jo i det første link. Mit problem  er at den ikke fungerer når jeg sætter den ind på min egen side...
Avatar billede jakobdo Ekspert
29. oktober 2005 - 13:45 #6
Hvordan ser du session_id()?
Er det i din DB?
Eller andet steds?
Avatar billede acmed Nybegynder
29. oktober 2005 - 13:50 #7
Well, normalt (uden ovennævnte script) ser jeg ikke sessionID. De andre sessions der kører på min side bliver blot kaldt frem via session_start() og så kan jeg bruge de variable der indeholder værdierne, f.eks. MenuID_ses.

Er det noget jeg ikke ved om hvordan sessions fungerer?
Avatar billede jakobdo Ekspert
29. oktober 2005 - 14:05 #8
Måske vi snakker forbi hinanden.
Hvad er dit problem?
Kan du vise mig fejlen?
Avatar billede acmed Nybegynder
29. oktober 2005 - 14:34 #9
Mit problem er:
Når jeg kører ovennævnte script (Alle de linier kode jeg har indsat) via dette link
http://easy-shave.com/shop.php
så fungerer det fint. Det indsætter de produkter man vælger og opdaterer kurven mv.

Når jeg så indsætter scriptet på min side
http://easy-shave.com/?menuID=13
så fungerer det ikke. Der sker ikke noget når man vil indsætte et produkt eller opdatere kurven.
Endvidere kan jeg se, at når man trykker på et link, så sender den PHPSESID med i linket
(F.eks http://easy-shave.com/?act=add_product&itemid=FORE1&PHPSESSID=a8951ef9fa6b41a25bafe37f4e5fbcdb).

Det gør den ikke når man trykker på et link i førstnævnte
(http://easy-shave.com/shop.php)
Avatar billede jakobdo Ekspert
29. oktober 2005 - 14:41 #10
Det kan jeg godt se, men phpsessid burde ikke gøre noget.
Men prøv at se dine links:
http://easy-shave.com/?act=add_product&itemid=FORE1
http://easy-shave.com/add.php?A=Add&itemid=FORE1
Der er jo lidt forskel på dem, kan det evt være det?
Avatar billede acmed Nybegynder
29. oktober 2005 - 14:43 #11
det er fordin på den første side kalder den det eksterne script add.php
På min egen side har jeg sat det ind på siden så den kører scriptet når act==add
Avatar billede acmed Nybegynder
29. oktober 2005 - 14:47 #12
Jeg undrede mig også bare over hvorfor den indsætter PHPSESSID i linket af sig selv...
Avatar billede jakobdo Ekspert
29. oktober 2005 - 14:48 #13
Prøv at lav noget debug i din act==add_product
echo $_GET["itemid"];
og hvad du ellers mener skulle ske når du klikker på linket.
Avatar billede jakobdo Ekspert
29. oktober 2005 - 14:54 #14
Det er noget php noget! :o)
Mener man kan fjerne det, men kan ikke huske nærmere.
Avatar billede acmed Nybegynder
29. oktober 2005 - 15:10 #15
echo $_GET["itemid"]; udskriver den værdi jeg forventer.
Det virker som om problemet opstår længere nede i scriptet.

Hvis jeg sætter breaks ved denne stump kode udskriver den ikke break2. Resten af siden udskrives iøvrigt heller ikke.

if ($act=='add_product'){

echo 'itemid: '.$_GET["itemid"];

$myid="";
$myquant="";
$zpos="";

print ('break1');
  if ($basket->Get_Basket_Count()>0) {  # are there items in the basket
    $pos = $basket->Enum_Items(true);
    while ($pos>=0) {



          if ($basket->Get_Item_ID($pos)==$itemid)
              {
              $basket->Set_Item_Quantity($pos,($basket->Get_Item_Quantity($pos)+1));
              $addprod="no";
              }


          $myid=$basket->Get_Item_ID($pos);
          $myquant=$basket->Get_Item_Quantity($pos);
          $zpos=$pos;

          $pos = $basket->Enum_Items();
                  }
}

if ($addprod!="no")
              {
              $basket->Add_Item($itemid,"George Foreman Grill",1,19.95,"YadaYada",".0675","black","XXL","1");
              }
}
print ('break2');
Avatar billede acmed Nybegynder
29. oktober 2005 - 15:12 #16
endvidere, hvis jeg sætter et print her, så udskriver den "starter basket" hver gang jeg opdaterer siden - jeg ville forvente at den kun gjorde det første gang - næste gang burde basket jo være "session_is_registered"!

session_name("mysession");
session_start();
if (!session_is_registered("basket")) {
    $basket=new Basket;
    session_register("basket");
print ('starter basket');
}
Avatar billede acmed Nybegynder
29. oktober 2005 - 15:16 #17
Hvis jeg indsætter samme print ('starter basket'); i første script
(http://easy-shave.com/shop.php)
udskriver den det kun første gang - som jeg ville forvente...
Avatar billede jakobdo Ekspert
29. oktober 2005 - 15:17 #18
Du husker at smide session_start(); i toppen af dit script?
Avatar billede acmed Nybegynder
29. oktober 2005 - 15:21 #19
session_start(); kører i forvejen som det første på min side - i forbindelse med de andre session variable jeg bruger.

Jeg har prøvet at slette linierne

session_name("mysession");
session_start();

fra scriptet ovenfor - det gør ikke nogen forskel.
Avatar billede acmed Nybegynder
29. oktober 2005 - 15:25 #20
Det script jeg kører først på siden ser sådan her ud:

<?PHP
session_start();

// FØRSTE SESSIONS NÅR BRUGEREN BESØGER SIDEN
if(!isset($menuID_ses)) {
$userlevel_ses = "0";
$langvar_ses = 'dan';
$menuID_ses = '0';
$product_maincats_ses = '0';
$edittext_ses = '0';
$editproducts_ses='0';
$dummy_random = '0';
}

// Registrer sessions
session_register("langvar_ses","ext_secret_word","menuID_ses","product_maincats_ses","product_ses","edittext_ses","editproducts_ses","picDB_dummy_ses","dummy_random");
?>
Avatar billede jakobdo Ekspert
29. oktober 2005 - 15:42 #21
Den måde du laver variabler på, er lidt outdated!
Prøv at kig på denne side, og overvej evt at gå over til:
$_SESSION
http://dk2.php.net/session_start
Avatar billede acmed Nybegynder
29. oktober 2005 - 16:05 #22
Jeg kan godt se de gør det på en anden måde. Men hvilken fordel har det?
Avatar billede jakobdo Ekspert
29. oktober 2005 - 16:41 #23
Ikke nogen fordel!
Forskellen er ens! :o)
Avatar billede acmed Nybegynder
31. oktober 2005 - 20:22 #24
Problemet bestod I at jeg havde indsat enkelte koder det forkerte sted i mit script.
Men tak for assistancen jaobdo - smit et svr så får du point...
Avatar billede jakobdo Ekspert
31. oktober 2005 - 21:02 #25
Svar! :o)
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

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