这个变量是`global`关键字的候选者吗?

时间:2015-07-24 23:57:55

标签: php

我有这个代码(在Floral.php中),我作为一个购物车应用程序给我,它在一(1)个网页上工作;由于我的网页结构,我不得不肢解它,现在我试图将它重新组合在一起,因此它适用于多个网页(文件):

       <?php

session_start();

define("PRODUCTCODE", 0);
define("PRODUCTNAME", 1);
define("QUANTITY", 2);
define("PRICE", 3);

var_dump($_POST);

$action = isset($_POST['action']) ? $_POST['action'] : '';

if($action == 'Recalculate')  {
      RecalculateCart();
}

else if(isset($_POST['Check Out']))  {
     header("Location: "."./customer.php");
}


function RecalculateCart()  {  //  something changed, so recalculate everything

   $cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : '';  //  get current cart for this session (it's not saved between browser sessions!))
   $itemcount = isset($_SESSION['itemcount']) ? $_SESSION['itemcount'] : 0;  //  get the item count
echo "itemcount from SESSION: " .$itemcount;

   for ($i=0; $i < $itemcount; $i++)  {
        $quantity = $_POST['quantity'.[$i]];  //  get quantity of new item
echo "quantity from POST: ".$quantity;

        if (empty($quantity))  {  //  quantity is 'empty' so make it zero (0))
                $quantity = 0;
        }
        else if (($quantity < 0) || (!is_numeric($quantity)))  {  //  validate it
                $quantity = 0;
        }

        $cart[QUANTITY][$i] = intval($quantity);  //  passed validation, so move it to the cart
    }

    for ($j=0; $j < $itemcount; $j++)  {

         $quantity = $cart[QUANTITY] [$j];  //  add the quantity of the new item to accumulation

   if ($quantity == 0)  {   // remove item from the cart        
        $itemcount--;
        $curitem = $j;

        while(($curitem+1) < count($cart[0]))  {

                for($k = 0; $k < 4; $k++)  {
                    $cart[$k][$curitem] = $cart[$k][$curitem+1];
                    $cart[$k] [$curitem+1]   = '';
                }
                $curitem++;     
        }
    }
 }
    $_SESSION['itemcount'] = $itemcount;  //   save the item count
    $_SESSION['cart'] = $cart;  //  save cart contents

}
?>

$ itemcount 是4,根据回声,这是正确的。 $ quantity 在另一个文件中设置并成为 $ cart 的一部分(它来自表单中的文本字段;该表单中有一个提交按钮,做POST)。这是代码(在viewCart.php中):

<?php

session_start();

define("PRODUCTCODE", 0);
define("PRODUCTNAME", 1);
define("QUANTITY", 2);
define("PRICE", 3);

$action = isset($_POST['action']) ? $_POST['action'] : '';

if (isset($_POST['productcode']))  {
  AddToCart();
}


function AddToCart()  {

$cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : '';

$itemcount = isset($_SESSION['itemcount']) ? $_SESSION['itemcount'] : 0;
$cart[PRODUCTCODE][$itemcount] = $_POST['productcode'];
$cart[PRODUCTNAME][$itemcount] = $_POST['productname'];
$cart[QUANTITY][$itemcount] = intval($_POST['quantity']);
$cart[PRICE][$itemcount] = $_POST['price'];
$itemcount = $itemcount + 1;

$_SESSION['cart'] = $cart;
$_SESSION['itemcount'] = $itemcount;
echo "addToCart-itemcount: ".$itemcount;
}

?>

作为PHP的一个菜鸟,我假设第一个代码段中的POST是正确的,除了它在另一个文件中的事实,这使得它在范围内不是全局的。那么 global 关键字在这里适用吗?如果是的话,我该把它放在哪里? (在哪个文件和哪个声明中)?

1 个答案:

答案 0 :(得分:3)

您使用不正确的语法访问数量数组项:

$quantity = $_POST['quantity'.[$i]];

[$i]实际上创建了一个包含项$i的新数组(使用PHP 5.4中引入的数组语法),当您尝试将其用作字符串时,它将输出为&# 39;阵列&#39 ;.所以评估为$_POST['quantityArray']。如果您已启用通知,则应该看到&#34;数组到字符串转换&#34;请注意帮助你抓住这类事情。

所以只需将其更改为:

$quantity = $_POST['quantity'.$i];

或者:

$quantity = $_POST["quantity$i"];
BTW,通知对于检测错误非常有帮助,因此请确保已启用它们。在php.ini中启用display_errorserror_reporting或将其添加到您的代码中(但请确保您只在本地或开发服务器上显示错误,因为在生产服务器上报告它们可能存在安全风险):

ini_set('display_errors', 1);
error_reporting(E_ALL);