【发布时间】:2013-07-16 19:39:57
【问题描述】:
在我们正在构建的用户系统中,客户能够销售我们提供的多种产品。这些产品的数量不是太多,但我们可能会(并计划经常添加新产品)。当用户登录到他们的管理门户时,他们可以从提供的所有可用产品列表中启用或禁用他们想要销售的产品。
我们使用复选框和复选框name="products[]" 数组构建了接受“启用”产品值的表单。这部分一切正常。当我们试图为输入的数据构建最佳的 INSERT / UPDATE 方法时,这个问题就出现了。如果稍后(由我们)向客户提供新产品并选择启用该产品,则会插入值。只需选中或取消选中相应的产品复选框,就会发生更新,从而启用或禁用该产品。
INSERT 和 UPDATE if a product is currently disabled 但我无法拿出一个数组来比较正确地将产品更新为“禁用”,如果它当前在数据库中设置为启用。
foreach($_REQUEST['products'] as $productID) {
if ( array_key_exists($productID, $_SESSION['productsOffered']) && $_SESSION['productsOffered'][$productID]['status'] == 0) {
echo 'this product would be turned active.';
echo "<br>";
}
elseif ( array_key_exists($productID, $_SESSION['productsOffered']) && $_SESSION['MYADMIN']['products'][$productID]['status'] == 1) {
echo 'this product would be turned inactive.';
echo "<br>";
<b>THIS IS THE LOGIC WHICH DOES NOT WORK</b>
}
elseif ( !array_key_exists($productID, $_SESSION['MYADMIN']['products']) ) {
echo 'insert';
echo "<br>";
}
}
如前所述,此处的 IF 和最终 elseif 工作正常,但中间的英文语句:“如果用户取消选中最初设置为活动的产品,则禁用该特定产品 ID”是不正确的。
感谢您提供的任何建议。
更新 1:初步想法
我相信一种可能可行的方法是构建一个包含所有当前$_SESSION['productsOffered'] 的新数组,并找出哪些当前产品(在更新时)当前设置为活动状态。然后我将能够将新数组与$_REQUEST['products'] 数组进行比较,并确定哪些产品被遗漏(或基本上未选中),然后可以更新适当的产品。
虽然我相信这种方法可能会奏效,但它似乎很草率。 更新 2:这也必须在当前的 foreach 请求之外完成,因为很明显,已停用的产品不会存在于请求中。
更新 3
根据要求,数组中的一些示例数据如下(这是非常简单的数据,接近“真实”):
$_SESSION['productsOffered'] = array(
[1] => Array
(
[ID] => 1,
[status] => 1,
[name] => Product 1,
)
[2] => Array
(
[ID] => 2,
[status] => 1,
[name] => Product 2,
)
);
$_REQUEST['products'] = array('1','2','3','4','5','6','7');
【问题讨论】:
-
状态值 1(或 0)意味着什么?
-
1 - 有效,0 - 无效
-
初始化时你是否也在 $_SESSION['productsOffered'] 数组中存储了非活动产品?
-
在用户初次登录时——是的,我是。
-
基于这些信息,我认为我给出的初步答案是有道理的。由于您无法直接针对数据库或会话检查“未选择”产品,因此首先禁用先前启用的产品然后仅启用在此会话中选择的产品是有意义的。
标签: php mysql arrays array-intersect