我在尝试向某人订购的产品添加“数量”时遇到问题。我有一个Products表,一个订单表,一个order_item表(这是一个包含来自产品和订单的id的多对多表)。我在左边有一个下拉框,里面有你想要的数量。最大值是系统中可用的库存。
这就是表格的样子:
<form name ="order_form" method="post" action="add_order_action.php" enctype="multipart/form-data">
<table border=1 cellpadding=2 cellspacing=2>
<caption>Order Form</caption>
<tr>
<th align="right"> Property </th>
<th align="left"> Value </th>
</tr>
<tr>
<td class="col1"> Name </td>
<td class="col2"> <input type="text" name="customer" id ="customer" size=30> </td>
</tr>
<tr>
<td class="col1"> Address </td>
<td class="col2"> <input type="text" name="address" id ="address" size=30> </td>
</tr>
<tr>
<td class="col1"> Products </td>
<td class="col2">
<!-- Interests is an array of all interests in the database-->
{foreach $products as $product}
<select name="products[{$product.id}][quantity]" id ="quantities">
{section name=quantities start=0 loop=$product.stock + 1 step=1}
<option value="{$smarty.section.quantities.index}">{$smarty.section.quantities.index}</option>
{/section}
</select>
<input type="checkbox" name="products[{$product.id}][is_checked]" value="1">{$product.name}<br>
{/foreach}
</td>
</tr>
<tr>
<td colspan=2 align="center">
<input type="submit" name="submit" value="Submit">
<input type="reset" name="reset" value="Reset">
</td>
</tr>
</table>
</form>
产品名称和库存号均来自产品表:
create table if not exists SEProducts
(
id int not null auto_increment primary key,
price double not null,
name varchar(30) not null,
stock int not null,
original_stock int not null,
sold_stock int not null
)ENGINE=INNODB;
现在,我所做的是根据检查的产品名称创建一个数组。我想要做的是关联下拉菜单中的值,但是如果它们是检查值之一。此外,如果检查一个值,数量不能为0.我可能这样做非常令人沮丧,但这是我认为最好的。我可以完成一个文本字段但是你必须清理用户输入。如果它的工作方式与没有= /
的相反,那就没关系我通过获取产品数组来添加订单:
<?php
include "includes/defs.php";
$customer = $_POST['customer'];
$delivery_address = $_POST['address'];
if (isset($_POST['products']))
{
$products = $_POST['products'];
}
else
{
$error = "An order must consist of 1 or more items.";
header("Location: list_inventory.php?error=$error");
exit;
}
$id = add_order($customer, $delivery_address, $products);
header("Location: order.php?id=$id");
exit;
?>
然后我的添加订单功能就像这样:
function add_order($customer, $delivery_address, $products)
{
$connection = mysql_open();
$customer = mysql_escape_string($customer);
$delivery_address = mysql_escape_string($delivery_address);
$query = "insert into SEOrders (name, address, status) " .
"values ('$customer', '$delivery_address', 'New')";
$result = mysql_query($query, $connection) or show_error();
$id = mysql_insert_id();
foreach ($products as $product)
{
if ($product['is_checked'] != 0 && $product['quantity'] != 0)
{
$query2 = "insert into SEOrder_items (order_id, product_id, quantity) " .
"values ('$id', '$product.id', '$product.quantity')";
$result2 = mysql_query($query2, $connection) or show_error();
}
}
mysql_close($connection) or show_error();
return $id;
}
我以为我可能需要做一些JavaScript,但我绝对是垃圾。
如果我无法解释自己:长话短说;我需要在产品阵列中添加数量,但仅在检查产品且数量为&gt; 0
提前致谢, 干杯:)
编辑:我做了一些更改,但现在我收到以下错误:
错误1452:无法添加或更新子行:外键约束失败(db/SEOrder_items
,CONSTRAINT SEOrder_items_ibfk_2
FOREIGN KEY(product_id
)参考SEProducts
(id
))
答案 0 :(得分:2)
作为第一步,我将产品和数量组合在一起,因此数量,复选框和产品名称都在一个数组中:
<select name="products[{$product.id}][quantity]" id ="quantities">
…
</select>
<input type="checkbox" name="products[{$product.id}][is_checked]" value="1" />
将导致以下数组(其中1和2是products-id,仅在选中该框时才设置'is_checked'):
$_POST['products'] = array(
[1] => array(
'quantity' => 3,
'is_checked' => 1,
),
[2] => array(
'quantity' => 1,
// not checked
),
);
使用以下方法很容易通过这样的数组:
foreach($_POST['products'] as $currentProductId => $currentProductArray)
答案 1 :(得分:1)
我认为你只需稍微调整你的逻辑和模板。
首先,您希望从订购页面上提供的产品而不是返回的产品中推动整个产品;这样:
if (isset($_POST['products']))
{
$products = $_POST['products'];
}
else
{
$error = "An order must consist of 1 or more items."
header("Location: list_inventory.php?error=$error");
exit;
}
看起来应该更像这样:
$products = the_products_list_that_you_sent_to_the_page();
当然,如果产品列表非常庞大,那么您将不得不像现在一样将产品列表拉出页面(并验证每个产品)。但是,如果产品列表很小,则更容易从已知且有效的列表开始。
问题的关键在于您的数据库交互以及add_order
的工作原理。您的add_order
会在$products
中获取要查看的产品列表。您需要做的就是:
$products
,如果产品已经过检查并且有数量,请将其及其数量添加到列表中。add_order
可以将其全部添加到数据库中。add_order
可以返回错误代码(例如订单ID为零),并且调用者可以向用户抱怨完全没有订购是没有意义的。 基本策略是收集您的数据,然后对其进行操作,而不是在收集数据时尝试对其进行操作。
现在问题变成了:我们如何将数量与特定问题联系起来?这很容易解决,因为我们有产品ID;您的<select>
元素应为:
<!--
Note that this also avoids the evil of having
duplicate id attributes in one page
-->
<select name="quantity_{$product.id}">
然后,当您要查找特定产品的数量时,可以将其作为标$_POST
直接从$q = $_POST['quantity_' . $product_id]
中提取。
我知道我可以通过告诉您重命名<select>
元素来解决问题的根源,但我想我会在整个过程中解决一些其他可能的问题。