【问题标题】:sql updating whole data in databasesql更新数据库中的整个数据
【发布时间】:2019-01-31 13:56:53
【问题描述】:

我已经编写了添加和更新用户的代码,并且我想添加和更新他们可以工作的类别。添加的用户将进入 users 表,他们可以访问的类别进入 category_permitted 表。我有以下用于添加和更新表的代码:

if ($user_info) {


if ($act == "add") {

if ($user_info) {
    $array = array(
            'user_id' => $user_info,
            'category_id' => $temp['cat_access']
    );

$category_permitted->addCategoryAccess($array);
}

} else {

if ($user_info) {

    $array = array(
            'user_id' => $id,
            'category_id' => $temp['cat_access']
    );

$deleteold = $category_permitted->deleteCategoryAccess($id);

$category_permitted->addCategoryAccess($array);
    }
}
    }

这是我添加和更新类别访问权限的功能:

public function addCategoryAccess($data, $is_die = false){

    return $this->insert($data, $is_die);

}

public function updateCategoryAccess($data, $id, $is_die = false){

    $args = array(
        'where' => array('user_id' => $id),
    );

    return $this->update($data, $args, $is_die);

}

这是数据库表中的数据。

我的更新功能是在更新用户的类别访问权限时使用正在添加的数字更新 category_id 列的所有数据。

我想保留 2 和 3 原样并添加另一个类别 id,它是 1,但在运行更新代码后,它会像这样更新数据。 我是否必须向WHERE CLAUSE 添加另一个条件才能获得预期的输出?

【问题讨论】:

  • 你应该删除这个更新功能并添加一个删除一个,这样当用户可以访问一个新类别时,你在表中添加他的id和类别id,当他不能再访问你的类别时删除他(其中 user_id 和 category_id)。要更新只需删除然后添加

标签: php sql-update


【解决方案1】:

要仅更新一行,您需要该行的唯一标识符

如果列 id 是主键,则可以使用该列只更新对应的行。

$args = array(
    'where' => array('id' => $category_permitted_id),
);

作为替代方案,如果您知道哪个类别正在发生变化,并且关系 (user_id,category_id) 是唯一的,则可以将变化的类别添加到 where。

$args = array(
    'where' => array(
        'user_id' => $user_id,
        'category_id' => $category_id
    ),
);

请注意,我不知道您的数据库抽象层,我的意思是您可以简单地在数组中添加另一个条目以将条件置于“AND”中,这可能是 在你的情况下。

以这种方式管理关系需要一些努力,而且在我看来是不值得的。 如果您能够修改应用程序逻辑,我建议您切换到仅使用插入/删除,如下所示:

  • 添加允许的类别:只需添加它即可使用插入创建新记录

  • 删除允许的类别:通过删除功能将其删除

  • 将允许的类别更改为另一个:删除正在更改的类别并添加新的类别

【讨论】:

  • 我已删除或添加列 user_id 中已存在的用户的 category_id 列。
  • 您无法通过这种方式获得预期的结果,因为 user_id 是非唯一的,如果您不能基于唯一标识符(如 id 或组合 user_id,category_id)进行更新,您可以尝试删除与user_id 关联的所有类别并重新插入新类别,但要这样做,您必须在应用程序逻辑中批量更新而不是单个更新
  • 另外,在您的示例中,当您有类别 2 和 3,并且想要 1,2 和 3 时,您必须执行插入,而不是更新,因此请检查它是否称为更新方法而不是插入,也许这也是一个问题
  • 我已经更新了我的代码,在调用$deleteOld 之后,我只得到$temp['cat_access'] 中的一个数据。但是评论$deleteOld我得到了$temp['cat_access']中的所有数据。
  • 抱歉,我无法为您提供更多关于上下文的信息,您能否将变量$user_info$id$temp 的var_dumps 添加到您的问题中?然后我会更新我的答案
【解决方案2】:

在我的代码中这样做对我有用。我在 for 循环之前调用了函数$deleteold = $category_permitted->deleteCategoryAccess($id);,以避免在每次迭代中删除之前被删除的数据。

if ($user_info) {

$cat_access = (isset($_POST['cat_access']) && !empty($_POST['cat_access'])) ? ($_POST['cat_access']) : $_SESSION['cat_access'];

$value = array();

if (!empty( $cat_access ) && is_array( $cat_access ) ) {

  foreach( $cat_access as $key => $item ) {

    $value[] = filter_var( $item, FILTER_SANITIZE_NUMBER_INT );

  }

}

$categoryData = $value;

$temp = array();

    if ($categoryData) {

        $count = count($categoryData);

        if ($count > 0) {

            $deleteold = $category_permitted->deleteCategoryAccess($id);

            for($i=0; $i<$count; $i++){

            $temp =array(

                'cat_access' => $categoryData[$i]

            );

            if ($act == "add") {

                if ($user_info) {
                    $array = array(
                            'user_id' => $user_info,
                            'category_id' => $temp['cat_access']
                    );

                $category_permitted->addCategoryAccess($array);
                }

            } else {

                if ($user_info) {

                    $array = array(
                            'user_id' => $id,
                            'category_id' => $temp['cat_access']
                    );

                $category_permitted->addCategoryAccess($array);
                }
            }

        }

        }

}

}

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-04-28
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多