Avatar billede kvols Nybegynder
26. januar 2005 - 23:26 Der er 24 kommentarer

Shopping cart problem

Okay, here we go. Jeg er rimelig ny i php, men kan en smule kodning, har læst tutorials osv. Jeg skal have lavet en "indkøbskurv", havde fundet en god tutorial, troede jeg.

Her er link til tutorial: http://www.macromedia.com/devnet/mx/dreamweaver/articles/php_cart.html

Jeg benytter mig af B-one som webhost, og kan derfor ikke oprette en database, som jeg skal i følge denne tutorial. Jeg har prøvet at ændre i scriptet nogle steder, så det passede med min eksisterende database, uden resultat dog.

Jeg får følgende fejl: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /customers/domæne.dk/domæne.dk/httpd.www/a/products.php on line 1.

Har kæmpet med dette hele natten, og er ikke nået et skridt videre.

Her er hvad jeg har:

<----- products.php ----->



<?php

    // This page will list all of the items
    // from the items table. Each item will have
    // a link to add it to the cart

    include("db.php");
   
    // Get a connection to the database
    $cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);
    $result = mysql_query("select * from items order by itemName asc");
    ?>
        <html>
        <head>
        <title> Product List </title>
        </head>
        <body bgcolor="#ffffff">
        <h1>Products</h1>
        <table width="100%" cellspacing="0" cellpadding="0" border="0">
            <tr>
                <td width="30%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        &nbsp;&nbsp;<b>Product</b>
                    </font>
                </td>
                <td width="10%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        <b>Price</b>
                    </font>
                </td>
                <td width="50%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        <b>Description</b>
                    </font>
                </td>
                <td width="10%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        <b>Add</b>
                    </font>
                </td>
            </tr>
            <?php
            while($row = mysql_fetch_array($result))
            {
            ?>
                <tr>
                    <td width="30%" height="25">
                        <font face="verdana" size="1" color="black">
                            <?php echo $row["itemName"]; ?>
                        </font>
                    </td>
                    <td width="10%" height="25">
                        <font face="verdana" size="1" color="black">
                            $<?php echo $row["itemPrice"]; ?>
                        </font>
                    </td>
                    <td width="50%" height="25">
                        <font face="verdana" size="1" color="black">
                            <?php echo $row["itemDesc"]; ?>
                        </font>
                    </td>
                    <td width="10%" height="25">
                        <font face="verdana" size="1" color="black">
                            <a href="cart.php?action=add_item&id=<?php echo $row["itemId"]; ?>&qty=1">Add Item</a>
                        </font>
                    </td>
                </tr>
                <tr>
                    <td width="100%" colspan="4">
                        <hr size="1" color="red" NOSHADE>
                    </td>
                </tr>
            <?php
            }
        ?>
            <tr>
                <td width="100%" colspan="4">
                    <font face="verdana" size="1" color="black">
                        <a href="cart.php">Your Shopping Cart &gt;&gt;</a>
                    </font>
                </td>
            </tr>
        </table>
    </body>
</html>



<-----  cart.php ----->



<?php

    include("db.php");
       
    switch($_GET["action"])
    {
        case "add_item":
        {
            AddItem($_GET["id"], $_GET["qty"]);
            ShowCart();
            break;
        }
        case "update_item":
        {
            UpdateItem($_GET["id"], $_GET["qty"]);
            ShowCart();
            break;
        }
        case "remove_item":
        {
            RemoveItem($_GET["id"]);
            ShowCart();
            break;
        }
        default:
        {
            ShowCart();
        }
    }

    function AddItem($itemId, $qty)
    {
        // Will check whether or not this item
        // already exists in the cart table.
        // If it does, the UpdateItem function
        // will be called instead
       
        global $dbServer, $dbUser, $dbPass, $dbName;

        // Get a connection to the database
        $cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);
       
        // Check if this item already exists in the users cart table
        $result = mysql_query("select count(*) from cart where cookieId = '" . GetCartId() . "' and itemId = $itemId");
        $row = mysql_fetch_row($result);
        $numRows = $row[0];
       
        if($numRows == 0)
        {
            // This item doesn't exist in the users cart,
            // we will add it with an insert query

            @mysql_query("insert into cart(cookieId, itemId, qty) values('" . GetCartId() . "', $itemId, $qty)");
        }
        else
        {
            // This item already exists in the users cart,
            // we will update it instead
           
            UpdateItem($itemId, $qty);
        }
    }
   
    function UpdateItem($itemId, $qty)
    {
        // Updates the quantity of an item in the users cart.
        // If the qutnaity is zero, then RemoveItem will be
        // called instead

        global $dbServer, $dbUser, $dbPass, $dbName;

        // Get a connection to the database
        $cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);
       
        if($qty == 0)
        {
            // Remove the item from the users cart
            RemoveItem($itemId);
        }
        else
        {
            mysql_query("update cart set qty = $qty where cookieId = '" . GetCartId() . "' and itemId = $itemId");
        }
    }
   
    function RemoveItem($itemId)
    {
        // Uses an SQL delete statement to remove an item from
        // the users cart

        global $dbServer, $dbUser, $dbPass, $dbName;

        // Get a connection to the database
        $cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);
       
        mysql_query("delete from cart where cookieId = '" . GetCartId() . "' and itemId = $itemId");
    }
   
    function ShowCart()
    {
        // Gets each item from the cart table and display them in
        // a tabulated format, as well as a final total for the cart
       
        global $dbServer, $dbUser, $dbPass, $dbName;

        // Get a connection to the database
        $cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);
       
        $totalCost = 0;
        $result = mysql_query("select * from cart inner join items on cart.itemId = items.itemId where cart.cookieId = '" . GetCartId() . "' order by items.itemName asc");
        ?>
        <html>
        <head>
        <title> Your Shopping Cart </title>
        <script language="JavaScript">
       
            function UpdateQty(item)
            {
                itemId = item.name;
                newQty = item.options[item.selectedIndex].text;
               
                document.location.href = 'cart.php?action=update_item&id='+itemId+'&qty='+newQty;
            }
       
        </script>
        </head>
        <body bgcolor="#ffffff">
        <h1>Your Shopping Cart</h1>
        <form name="frmCart" method="get">
        <table width="100%" cellspacing="0" cellpadding="0" border="0">
            <tr>
                <td width="15%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        &nbsp;&nbsp;<b>Qty</b>
                    </font>
                </td>
                <td width="55%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        <b>Product</b>
                    </font>
                </td>
                <td width="20%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        <b>Price Each</b>
                    </font>
                </td>
                <td width="10%" height="25" bgcolor="red">
                    <font face="verdana" size="1" color="white">
                        <b>Remove?</b>
                    </font>
                </td>
            </tr>
            <?php
           
            while($row = mysql_fetch_array($result))
            {
                // Increment the total cost of all items
                $totalCost += ($row["qty"] * $row["itemPrice"]);
                ?>
                    <tr>
                        <td width="15%" height="25">
                            <font face="verdana" size="1" color="black">
                                <select name="<?php echo $row["itemId"]; ?>" onChange="UpdateQty(this)">
                                <?php
                               
                                    for($i = 1; $i <= 20; $i++)
                                    {
                                        echo "<option ";
                                        if($row["qty"] == $i)
                                        {
                                            echo " SELECTED ";
                                        }
                                        echo ">" . $i . "</option>";
                                    }
                                ?>
                                </select>
                            </font>
                        </td>
                        <td width="55%" height="25">
                            <font face="verdana" size="1" color="black">
                                <?php echo $row["itemName"]; ?>
                            </font>
                        </td>
                        <td width="20%" height="25">
                            <font face="verdana" size="1" color="black">
                                $<?php echo number_format($row["itemPrice"], 2, ".", ","); ?>
                            </font>
                        </td>
                        <td width="10%" height="25">
                            <font face="verdana" size="1" color="black">
                                <a href="cart.php?action=remove_item&id=<?php echo $row["itemId"]; ?>">Remove</a>
                            </font>
                        </td>
                    </tr>
                <?php
            }
           
            // Display the total
            ?>
                    <tr>
                        <td width="100%" colspan="4">
                            <hr size="1" color="red" NOSHADE>
                        </td>
                    </tr>
                    <tr>
                        <td width="70%" colspan="2">
                            <font face="verdana" size="1" color="black">
                                <a href="products.php">&lt;&lt; Keep Shopping</a>
                            </font>
                        </td>
                        <td width="30%" colspan="2">
                            <font face="verdana" size="2" color="black">
                                <b>Total: $<?php echo number_format($totalCost, 2, ".", ","); ?></b>
                            </font>
                        </td>
                    </tr>
                </table>
                </form>
            </body>
            </html>
            <?php
    }

?>



<----- db.php ----->



<?php

    // This page contains the connection routine for the
    // database as well as getting the ID of the cart, etc

    $dbServer = "localhost";
    $dbUser = "domain";
    $dbPass = "password";
    $dbName = "databasename";

    function ConnectToDb($server, $user, $pass, $database)
    {
        // Connect to the database and return
        // true/false depending on whether or
        // not a connection could be made.
       
        $s = @mysql_connect($server, $user, $pass);
        $d = @mysql_select_db($database, $s);
       
        if(!$s || !$d)
            return false;
        else
            return true;
    }
   
    function GetCartId()
    {
        // This function will generate an encrypted string and
        // will set it as a cookie using set_cookie. This will
        // also be used as the cookieId field in the cart table
       
        if(isset($_COOKIE["cartId"]))
        {
            return $_COOKIE["cartId"];
        }
        else
        {
            // There is no cookie set. We will set the cookie
            // and return the value of the users session ID
           
            session_start();
            setcookie("cartId", session_id(), time() + ((3600 * 24) * 30));
            return session_id();
        }
    }

?>

Der er 200 point til den der kan få dette script til at virke på et B-one webhotel. :)
Avatar billede morpheus Nybegynder
27. januar 2005 - 00:09 #1
Kan du vedlægge et tabel dump?
Avatar billede kvols Nybegynder
27. januar 2005 - 00:11 #2
Ja, her:

# Struktur dump for tabellen `items`
#

CREATE TABLE `items` (
  `itemId` int(11) NOT NULL auto_increment,
  `itemName` varchar(50) default NULL,
  `itemDesc` varchar(250) default NULL,
  `itemPrice` decimal(4,2) default NULL,
  PRIMARY KEY  (`itemId`),
  UNIQUE KEY `id` (`itemId`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

og her:

# Struktur dump for tabellen `cart`
#

CREATE TABLE `cart` (
  `cartId` int(11) NOT NULL auto_increment,
  `cookieId` varchar(50) default NULL,
  `itemId` int(11) default NULL,
  `qty` int(11) default NULL,
  PRIMARY KEY  (`cartId`),
  UNIQUE KEY `id` (`cartId`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
Avatar billede morpheus Nybegynder
27. januar 2005 - 00:14 #3
Nevermind... Følger bare lige tutorialen på det angivne link ... hehe
Avatar billede kvols Nybegynder
27. januar 2005 - 00:17 #4
Fair :D
Avatar billede morpheus Nybegynder
27. januar 2005 - 00:21 #5
Bruger du MSN?
Avatar billede kvols Nybegynder
27. januar 2005 - 00:22 #6
Ja, kvols (at) tdcadsl.dk
Avatar billede detox Nybegynder
27. januar 2005 - 00:22 #7
Allerførst må du tjekke at db.php connecter til din database. Ret:

        $s = @mysql_connect($server, $user, $pass);
        $d = @mysql_select_db($database, $s);

til:

        $s = mysql_connect($server, $user, $pass) or die(mysql_error());
        $d = mysql_select_db($database, $s) or die(mysql_error());
Avatar billede kvols Nybegynder
27. januar 2005 - 00:29 #8
Har jeg prøvet nu, intet resultat, stadig samme fejl.
Avatar billede detox Nybegynder
27. januar 2005 - 00:49 #9
Så må næste skridt være at rette 'product.php':

$result = mysql_query("select * from items order by itemName asc");

til:

$result = mysql_query("select * from items order by itemName asc") or die(mysql_error());
Avatar billede kvols Nybegynder
27. januar 2005 - 00:52 #10
Har jeg prøvet nu, intet resultat, stadig samme fejl.

Siden kan forresten ses på http://www.bitshop.dk/a/products.php  -  Hvis det måtte være til nogen hjælp.
Avatar billede nyhuus Nybegynder
27. januar 2005 - 00:55 #11
du skal nemt lave en database ved b-one, jeg har selv ved bone, http://phpmyadmin.ditdomæne.dk

der inde skal du bare logge ind med dit info og lave dine tabeller i mysql
Avatar billede kvols Nybegynder
27. januar 2005 - 00:58 #12
nyhuusdk - Ja jeg kan nemt lavet tabeller, men du kan ikke oprette en ny database udover den allerede eksisterende, som jo hedder: domæne_dk f.eks. Jeg kan ihvertfald ikke på mine webhoteller, som tæller omkring 10 vel.
Avatar billede nyhuus Nybegynder
27. januar 2005 - 01:01 #13
Nej, men hvad skal du bruge en ny database til? du kan jo saktens lave det du skal bruge under den der følger med til dit webhotel, der er jo ingen bregrænsing af en database..
Avatar billede detox Nybegynder
27. januar 2005 - 01:02 #14
Prøv osse rette:

$cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);

til:

$cxn = ConnectToDb($dbServer, $dbUser, $dbPass, $dbName) or die(mysql_error());
Avatar billede kvols Nybegynder
27. januar 2005 - 01:03 #15
Jeg har da ikke nævnt at jeg skulle bruge en database, udover den jeg har. Skrev blot at jeg ikke kunne oprette en ny db hos B-one.dk :)
Avatar billede kvols Nybegynder
27. januar 2005 - 01:05 #16
detox: Stadig det samme. Der ser ikke ud til at ske det store ved disse ændringer, af en eller anden mærkelig grund.
Avatar billede detox Nybegynder
27. januar 2005 - 01:15 #17
Ja, så ved jeg snart ikke hvad der går galt. Prøv at indsætte i 'product.php':

    $result = mysql_query("select * from items order by itemName asc") or die(mysql_error());
    echo "cxn: $cxn<br />result: $result";exit; // INDSÆT DENNE
Avatar billede kvols Nybegynder
27. januar 2005 - 01:17 #18
detox: Det kommer nok ikke bag på dig, men stadig samme resultat. :(
Avatar billede kvols Nybegynder
27. januar 2005 - 01:19 #19
detox: Hov, nu fik jeg en blank side istedet.
Avatar billede detox Nybegynder
27. januar 2005 - 01:21 #20
Er du sikker på det er den rette 'db.php' den includer?
Avatar billede kvols Nybegynder
27. januar 2005 - 01:22 #21
Ja, 100%.
Avatar billede detox Nybegynder
27. januar 2005 - 01:27 #22
Det virker osse sært, når jeg trykker mig ind på:
http://www.bitshop.dk/a/cart.php

siger den:
Fatal error: Call to undefined function: showcart() in /customers/bitshop.dk/bitshop.dk/httpd.www/a/cart.php on line 1

I den kode du viser her kalder du: ShowCart(), altså med stort S og C, hvilket funktionen osse retteligt hedder???

Og begge fejl fremkommer angiveligt på linje 1, selvom det jo ikke er tilfældet??
Avatar billede kvols Nybegynder
27. januar 2005 - 01:31 #23
Ja, morpheus prøvede scriptet på to sider, det virkede på begge, men bare ikke hos mig/b-one. Jeg ved ikke helt hvorfor, php info kan ses på http://www.bitshop.dk/a/info.php - Jeg vil ikke udelukke at det er mig der laver en fejl, men tror det dog næppe, det er jo rimeligt simpet at sætte op.

Så er spørgsmålet så bare, hvordan laver man set en "indkøbskurv" der virker hos B-one. :(
Avatar billede detox Nybegynder
27. januar 2005 - 01:53 #24
Hmmm, jeg prøvede lige at copy/paste din kode. Den virker osse fint her.
Så hvad der er galt ved jeg ikke?
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