比较数组键和创建MySQL语句的方法

时间:2013-07-16 19:39:57

标签: php mysql arrays array-intersect

在我们正在构建的用户系统中,客户能够销售我们提供的许多产品。这些产品的数量不是太多,但我们可能(并计划经常添加新产品)。当用户登录其管理门户时,他们可以从所提供的所有可用产品列表中启用或禁用他们想要销售的产品。

我们使用复选框和已选中的name="products[]"数组构建了接受“已启用”产品值的表单。这部分一切正常。当我们尝试为输入的数据构建最佳的INSERT / UPDATE方法时,问题就会发挥作用。如果稍后向客户提供新产品(由我们提供),并且选择启用该产品,则值将被插入。只需选中或取消选中相应的产品复选框即可进行更新,从而启用或禁用该产品。

INSERTUPDATE 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和final elseif在这里工作正常,但中间语句用英语说:“如果用户取消选中最初设置为活动状态的产品,请禁用该特定产品ID”,这是不对的。

感谢任何建议。

更新1:初步想法

我认为可能工作的方法是构建一个包含所有当前$_SESSION['productsOffered']的新数组,并找出当前哪些产品(更新时)当前设置为活动状态。然后,我将能够将新数组与$_REQUEST['products']数组进行比较,并确定哪些产品被遗漏(或基本上未经检查),然后可以更新相应的产品。

虽然我相信这种方法可行,但看起来很草率。 Update2:这也必须在当前的foreach请求之外完成,因为很明显,REQUEST中不存在已停用的产品。

更新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');

2 个答案:

答案 0 :(得分:1)

$ _ REQUEST ['products']仅包含已被用户标记为已检查的产品。因此它不包含未经检查的产品。这意味着在上面的代码中,控件永远不会转到代码的第二部分,而这正是您要做的事情。 您可以采取的一种方法是在用户提交表单时最初禁用所有产品。示例SQL将是:

$sql = "update product_table set disabled='true' where user_id = 'this_user_id'";

然后您可以遍历逻辑以标记用户选择的产品:

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['MYADMIN']['products']) ) {
        echo 'insert';
        echo "<br>";
    }
}

这有点类似于您在Update 1:Initial Thought中发布的逻辑。 更多信息,比如你的$ _SESSION ['productsOffered']数组和示例$ _REQUEST ['products']数组都会有所帮助。

答案 1 :(得分:0)

你知道mysql中的REPLACE动词吗?

如果不存在则添加新的,如果它存在则更新。