我有这个代码(在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 关键字在这里适用吗?如果是的话,我该把它放在哪里? (在哪个文件和哪个声明中)?
答案 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_errors
和error_reporting
或将其添加到您的代码中(但请确保您只在本地或开发服务器上显示错误,因为在生产服务器上报告它们可能存在安全风险):
ini_set('display_errors', 1);
error_reporting(E_ALL);