2009-09-10 81 views
1

我有一个header.html开始与session_start();. 然后下面的代码,$ _SESSION ['cart'] [$ sw_id]没有设置,但突然出来。 Q1。你能以这种方式开始会话吗? Q2。如何通过$ _SESSION ['cart'] [$ sw_id] ++增加购买量? 在我看来,增加了身份证号码。这个环节来自哪里?

<?php # Script 5.7 - cart.php 

/* 
* This is the shopping cart page. 
* This page has two modes: 
* - add a product to the cart 
* - update the cart 
* The page shows the cart as a form for updating quantities. 
*/ 

// Require the configuration file before any PHP code: 
require_once ('./includes/config.inc.php'); 

// Include the header file: 
$page_title = 'Shopping Cart'; 
include_once ('./includes/header.html'); 

echo '<h1>View Your Shopping Cart</h1>'; 

// This page will either add to or update the 
// shopping cart, based upon the value of $_REQUEST['do']; 
if (isset($_REQUEST['do']) && ($_REQUEST['do'] == 'add')) { // Add new item. 

    if (isset($_GET['sw_id'])) { // Check for a product ID. 

     // Typecast to an integer: 
     $sw_id = (int) $_GET['sw_id']; 

     // If it's a positive integer, 
     // get the item information: 
     if ($sw_id > 0) { 

      // Define and execute the query: 
      $q = "SELECT name, color, size FROM general_widgets LEFT JOIN specific_widgets USING (gw_id) LEFT JOIN colors USING (color_id) LEFT JOIN sizes USING (size_id) WHERE sw_id=$sw_id"; 
      $r = mysqli_query($dbc, $q); 

      if (mysqli_num_rows($r) == 1) { 

       // Get the information: 
    list ($name, $color, $size) = mysqli_fetch_array($r, MYSQLI_NUM); 

       // If the cart already contains 
       // one of these widgets, increment the quantity: 
       if (isset($_SESSION['cart'][$sw_id])) { 

        $_SESSION['cart'][$sw_id]++; 

        // Display a message: 
    echo "<p>Another copy of '$name' in color $color, size $size has been added to your shopping cart.</p>\n"; 

       } else { // New to the cart. 

        // Add to the cart. 
        $_SESSION['cart'][$sw_id] = 1; 

        // Display a message: 
        echo "<p>The widget '$name' in color $color, size $size has been added to your shopping cart.</p>\n"; 

       } 

      } // End of mysqli_num_rows() IF. 

     } // End of ($sw_id > 0) IF. 

    } // End of isset($_GET['sw_id']) IF. 

} elseif (isset($_REQUEST['do']) && ($_REQUEST['do'] == 'update')) { 

    // Change any quantities... 
    // $k is the product ID. 
    // $v is the new quantity. 
    foreach ($_POST['qty'] as $k => $v) { 

     // Must be integers! 
     $pid = (int) $k; 
     $qty = (int) $v; 

     if ($qty == 0) { // Delete item.  
      unset ($_SESSION['cart'][$pid]);    
     } elseif ($qty > 0) { // Change quantity.  
      $_SESSION['cart'][$pid] = $qty;   
     } 

    } // End of FOREACH. 

    // Print a message. 
    echo '<p>Your shopping cart has been updated.</p>'; 

} // End of $_REQUEST IF-ELSE. 

// Show the shopping cart if it's not empty: 
if (isset($_SESSION['cart']) && !empty($_SESSION['cart'])) { 

    // Retrieve all of the information for the products in the cart: 
    $q = "SELECT sw_id, name, color, size, default_price, price FROM general_widgets LEFT JOIN specific_widgets USING (gw_id) LEFT JOIN colors USING (color_id) LEFT JOIN sizes USING (size_id) WHERE sw_id IN ("; 

    // Add each product ID. 
    foreach ($_SESSION['cart'] as $sw_id => $v) { 
     $q .= (int) $sw_id . ','; 
    } 
    $q = substr ($q, 0, -1) . ') ORDER BY name, size, color'; 
    $r = mysqli_query ($dbc, $q); 

    if (mysqli_num_rows($r) > 0) { 

     // Create a table and a form: 
     echo '<table border="0" width="90%" cellspacing="2" cellpadding="2" align="center"> 
     <tr> 
      <td align="left" width="20%"><b>Widget</b></td> 
      <td align="left" width="15%"><b>Size</b></td> 
      <td align="left" width="15%"><b>Color</b></td> 
      <td align="right" width="15%"><b>Price</b></td> 
      <td align="center" width="10%"><b>Qty</b></td> 
      <td align="right" width="15%"><b>Total Price</b></td> 
     </tr> 
    <form action="cart.php" method="post"> 
    <input type="hidden" name="do" value="update" /> 
    '; 

     // Print each item: 
     $total = 0; // Total cost of the order. 
     while ($row = mysqli_fetch_array ($r, MYSQLI_ASSOC)) { 

      // Determine the price: 
      $price = (empty($row['price'])) ? $row['default_price'] : $row['price']; 

      // Calculate the total and sub-totals: 
      $subtotal = $_SESSION['cart'][$row['sw_id']] * $price; 
      $total += $subtotal; 
      $subtotal = number_format($subtotal, 2); 

      // Print the row: 
      echo <<<EOT 
<tr> 
    <td align="left">{$row['name']}</td> 
    <td align="left">{$row['size']}</td> 
    <td align="left">{$row['color']}</td> 
    <td align="right">\$$price</td> 
    <td align="center"><input type="text" size="3" name="qty[{$row['sw_id']}]" value="{$_SESSION['cart'][$row['sw_id']]}" /></td> 
      <td align="right">\$$subtotal</td> 
     </tr>\n 
EOT; 

     } // End of the WHILE loop. 

     // Print the footer, close the table, and the form: 
     echo ' <tr> 
      <td colspan="5" align="right"><b>Total:</b></td> 
      <td align="right">$' . number_format ($total, 2) . '</td> 
     </tr> 
     <tr> 
      <td colspan="6" align="center">Set an item\'s quantity to 0 to remove it from your cart.</td> 
     </tr> 
     </table><div align="center"><button type="submit" name="submit" value="update">Update Cart</button> &nbsp; &nbsp; &nbsp; &nbsp; 
     <a href="checkout.php"><button type="button" name="checkout" value="Checkout">Checkout</button></a></div> 
    </form>'; 

    } // End of mysqli_num_rows() IF. 

} else { 
    echo '<p>Your cart is currently empty.</p>'; 
} 

// Include the footer file to complete the template: 
include_once ('./includes/footer.html'); 

?> 

回答

0

A1。 是的,你可以这样开始一个会话。 PHP以与实例化任何其他变量相同的方式实例化会话密钥。

A2。 当你做$ _SESSION ['cart'] [$ sw_id] ++时,你说的是加1而不是键。换句话说,如果$ array [0] == 5并且你做$ array [0] ++,那么你得到6,而不是$ array [1]。

+0

你不能以这种方式开始会话。但是,您可以通过这种方式在会话中初始化密钥。会话必须以'session_start()'开始。 – 2009-09-11 20:34:06

+0

@Lucas阿曼:来自最初的问题的引述:“我有一个header.html开始session_start();” – dnagirl 2009-09-12 01:32:42

4

A1。当您致电session_start()时,会议开始。尽管可能没有在$ _SESSION中设置某个变量,但会话仍然启动。

A2。如果仔细观察代码,您会发现它会检查是否已设置$_SESSION['cart'][$sw_id]。如果是,则使用++运算符。如果不是,则使用值1对其进行初始化。

另外,您可以用PHP中的++初始化一个变量。如果变量或数组键未初始化,PHP假定其起始值为0

0

当您致电$_SESSION['cart'][$sw_id]++时,您正在增加存储在$_SESSION['cart'][$sw_id]处的值,该值恰好代表数量。

如果您正在更新产品ID,它看起来像$sw_id++

至于你的问题的第一部分,我不完全确定你在问什么。 session_start()只是“启动”或激活会话以供使用。一旦被调用,它将使用存储在会话中的值填充超全局的$_SESSION