我有以下功能,可以根据shoppingCart类生成购物车。
function render_shopping_cart()
{
$shopping_cart = get_shopping_cart();
$output = "<table class='shoppingCart'>
<tr>
<th>
Course
</th>
<th>
Valid Until
</th>
<th>
Quantity
</th>
<th>
Price
</th>
</tr>
";
$line_item_counter = 1;
foreach ($shopping_cart->GetItems() as $product_id)
{
$output .= render_shopping_cart_row($shopping_cart , $product_id, $line_item_counter);
$line_item_counter++;
}
//$output .= render_shopping_cart_shipping_row($shopping_cart);
$output .= render_shopping_cart_total_row($shopping_cart);
$output .="</table>";
return $output;
}
function render_shopping_cart_total_row(ShoppingCart $shopping_cart)
{
return "<tr>
<td>
</td>
<td>
</td>
<td>
Total:
</td>
<td>
<input type='hidden' name='no_shipping' value='0'>
$".$shopping_cart->GetTotal()."
</td>
</tr>";
}
function render_shopping_cart_row(ShoppingCart $shopping_cart , $product_id, $line_item_counter)
{
$quantity = $shopping_cart->GetItemQuantity($product_id);
$amount = $shopping_cart->GetItemCost($product_id);
$unit_cost = get_item_cost($product_id);
$shipping_amount = $shopping_cart->GetItemShippingCost($product_id);
$title = get_item_title($product_id);
$validUntil = expiration();
return "
<tr>
<td>
$title
<input type='hidden' name='item_name_$line_item_counter' value='$product_id' />
</td>
<td>
$validUntil
<input type='hidden' name='quantity_$line_item_counter' value='$validUntil' />
</td>
<td>
$quantity
<input type='hidden' name='quantity_$line_item_counter' value='$quantity' />
</td>
<td>
$$amount
<input type='hidden' name='amount_$line_item_counter' value='$unit_cost' />
</td>
</tr>
";
}
我想弄清楚的是如何获取为每个项目生成的$product_id
;特别是这部分$title
<input type='hidden' name='item_name_$line_item_counter' value='$product_id' />
并将其放入$ sqlProducts数组中,或者将它们分别插入到单个mysql字段中product1, product2, product3, etc
我添加了
$sqlProducts = serialize($product_id);
echo unserialize($sqlProducts);
到line_item计数器看起来像
$line_item_counter = 1;
foreach ($shopping_cart->GetItems() as $product_id)
{
$output .= render_shopping_cart_row($shopping_cart , $product_id, $line_item_counter);
$line_item_counter++;
$sqlProducts = serialize($product_id);
echo unserialize($sqlProducts); // I've made $abc = unserialize($sqlProducts) as well and it hasn't worked.
}
它们在函数内回显得很好,但我无法访问函数外部的变量。我需要在提交表单后将$sqlProducts
传递给process.php。或者,如果有一种替代方法来获取生成的$product_id
数组,并在表单发布后将它们插入到mysql表中。
更新
我试过了
$sqlProducts = serialize($product_id);
$_SESSION['sqlProducts'] = unserialize($sqlProducts);
有效,但只能回显数组中的最后一项,而不是整个事物。
在页面内,
$sqlProducts = serialize($product_id);
$_SESSION['sqlProducts'] = unserialize($sqlProducts);
echo $_SESSION['sqlProducts'];
工作正常
目前,表单发布到process.php,其中有一行简单到echo $_SESSION
或echo $sqlProducts
,当我回显$sqlProducts
时,该值未定义,如果我回显{{ 1}}我只得到数组中的最后一项
以下任何人都建议使用这个问题的解决方案
我重写了函数并创建了数组:
$_SESSION['sqlProducts']
现在我可以使用
function createCart()
{
//Create a new cart as a session variable with the value being an array
$_SESSION['paypalCart'] = array();
}
function insertToCart($productID, $productName, $price, $qty = 1)
{
//Function is run when a user presses an add to cart button
//Check if the product ID exists in the paypal cart array
if(array_key_exists($productID, $_SESSION['paypalCart']))
{
//Calculate new total based on current quantity
$newTotal = $_SESSION['paypalCart'][$productID]['qty'] + $qty;
//Update the product quantity with the new total of products
$_SESSION['paypalCart'][$productID]['qty'] = $newTotal;
}
else
{
//If the product doesn't exist in the cart array then add the product
$_SESSION['paypalCart'][$productID]['ID'] = $productID;
$_SESSION['paypalCart'][$productID]['name'] = $productName;
$_SESSION['paypalCart'][$productID]['price'] = $price;
$_SESSION['paypalCart'][$productID]['qty'] = $qty;
}
}
请记住在调用变量之前初始化页面中某处的<?php
if (isset ($_SESSION['paypalCart']))
{
foreach($_SESSION['paypalCart'] as $product)
{
$custom .= $product['name'].", ";
}
}
?>
<input type="hidden" name="custom" value="<?php echo $custom?>">
(或者您使用的任何内容),例如:$custom
答案 0 :(得分:1)
您可以尝试从函数render_shopping_cart_row
和render_shopping_cart_total_row
参数中删除“ShoppingCart”类名吗?我不知道为什么,但有时我在函数参数中指定类名后无法使我的程序工作。
检查传递给那些函数render_shopping_cart_row
和`render_shopping_cart_total_row的值中是否存在数据。调试函数可能有助于您找出问题。
答案 1 :(得分:1)
您自己说过,产品ID已经隐藏在输入中,这意味着在提交表单时可以通过process.php中的$_POST
数组访问它们,我只需要重命名输入,这样它们就可以了创建一个多维数组以便于处理,如:
return "
<tr>
<td>
$title
<input type='hidden' name='items[$line_item_counter][id]' value='$product_id' />
</td>
<td>
$validUntil
<input type='hidden' name='items[$line_item_counter][valid_until]' value='$validUntil' />
</td>
<td>
$quantity
<input type='hidden' name='items[$line_item_counter][quantity]' value='$quantity' />
</td>
<td>
$$amount
<input type='hidden' name='items[$line_item_counter][amount]' value='$unit_cost' />
</td>
</tr>
";
然后在process.php
中,您可以访问以下项目数组:
$items = isset($_POST['items']) ? $_POST['items'] : array();
要获得你可以做的ids:
if(count($items)){//Check if array is not empty
$ids = array_map(function($item){return $item['id'];},$items); //get ids array
$sql_ids = implode(',',$ids); //format a string like id1,id2,id3...
}
//*Note that anonymous functions are only supported starting from PHP 5.3
现在,如果您不想重命名输入,可以使用ID创建另一个隐藏字段:
$line_item_counter = 1;
$product_ids = $shopping_cart->GetItems();
foreach ($product_ids as $product_id)
{
$output .= render_shopping_cart_row($shopping_cart , $product_id, $line_item_counter);
$line_item_counter++;
}
$sqlProducts = implode(',',$ids);
$output.= "<input type='hidden' name='product_ids' value='$sqlProducts' />";
并使用$_POST['product_ids']
答案 2 :(得分:0)
也许您需要将register global设置为ON或使用session或cookie来访问全局变量,或者您可以使用隐藏字段或者可以使用get或post方法或其他方式发送参数