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

Php 用于比较数组键和创建MySQL语句的方法,php,mysql,arrays,array-intersect,Php,Mysql,Arrays,Array Intersect,在我们正在构建的用户系统中,客户能够销售我们提供的许多产品。这些产品的数量不是太多,但我们可能(并计划经常添加新产品)。当用户登录到其管理门户时,他们可以从提供的所有可用产品列表中启用或禁用他们想要销售的产品 我们构建的表单使用复选框和复选框name=“products[]”数组接受“enabled”产品的值。这部分很好用。当我们试图为输入的数据构建最佳的插入/更新方法时,这个问题就出现了。如果客户以后(由我们)提供新产品,并选择启用该产品,则会插入值。只需选中或取消选中相应的产品复选框即可进行

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

我们构建的表单使用复选框和复选框
name=“products[]”
数组接受“enabled”产品的值。这部分很好用。当我们试图为输入的数据构建最佳的插入/更新方法时,这个问题就出现了。如果客户以后(由我们)提供新产品,并选择启用该产品,则会插入值。只需选中或取消选中相应的产品复选框即可进行更新,从而启用或禁用该产品

如果产品当前被禁用,
插入
将更新
,但是如果产品当前在数据库中设置为启用,我无法找到一个数组比较来正确地将产品更新为“禁用”

 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>";
    }
}

你知道mysql中的
REPLACE
动词吗


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

$\u请求['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>";
    }
}
foreach($\u请求['products']作为$productID){
如果(数组\u键\u存在($productID,$\u会话['PRODUCTSOFERED'])和&$\u会话['PRODUCTSOFERED'][$productID]['status']==0){
echo“此产品将被激活。”;
回声“
”; } elseif(!array_key_exists($productID,$_SESSION['MYADMIN']['products'])){ 回声“插入”; 回声“
”; } }
这有点类似于您在更新1:初始想法中发布的逻辑。
更多信息,如您的$\u会话['productsOffered']数组和示例$\u请求['products']数组是什么,可能会有所帮助。

问题不是决定如何确定插入或更新,它是如何根据现有产品的当前状态和用户输入的状态正确识别和创建更新语句。此外,替换需要“插入”和“删除”权限。对于这个问题,我们假设DB用户由于许多原因没有删除权限。这样做需要额外的执行查询,但我没有想到简单地禁用每个产品,然后按照您的建议运行逻辑。我正在考虑如果更新运行,但之后发生了其他事情,导致产品被永久禁用,但这似乎是一个可行的选择。有一些方法可以修复我认为值得注意的问题,提前禁用所有产品不会获得预期的效果。假设所有产品都已启用,而用户只想禁用单个产品,此逻辑将禁用所有产品,而无法重新启用它们。我假设,为了启用产品,用户必须使用复选框选择它。如果是这样的话,那么即使用户想要禁用单个产品,逻辑仍然有效。此应用程序面临的限制是因为信息通过复选框从一个页面传递到另一个页面的方式。复选框只传递已选中字段的值,不提供未选中字段的任何信息。@Maximum2012-理解。刚刚用一些类似于“真实”信息的示例数据进行了更新。状态值1(或0)意味着什么?1-活动,0-不活动初始化时您是否也将不活动的产品存储在$\u会话['productsOffered']数组中?在用户的初始登录时-是。基于此信息,我认为我最初给出的答案是有道理的。由于您无法直接根据数据库或会话检查“未选择”的产品,因此首先禁用以前启用的产品,然后仅启用在此会话中选择的产品是有意义的。
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>";
    }
}