仅在表格的任何行中尚未包含特定值时才更新表格

时间:2018-07-13 20:56:11

标签: php mysqli

我想通过以下方式用PHP和MYSQLi更新表:
在应用程序中,用户可以创建新类别,并且每个类别都应该是唯一的,以便在创建类别时,$category_title OR $category_price 的值OR $category_limit在数据库的相应字段中尚不存在。 (我已经做到了)

现在,假设用户创建了这些类别,其中每个类别都有一个价格以及每个类别可以包含的项目数:

Category Title      |     Price     |  Limit
-------------------------------------------- 
English             |     $5.00     |   100 
French              |     $3.00     |   200 
Latin               |     $10.00    |   300

用户现在需要编辑French Category。但是,他不能将类别的标题(在这种情况下为 法语 )更改为 English ,因为英语已经在列表。
或者,他应该不能将Price设置为 $ 10.00 ,因为这是拉丁的价格。

这是我的UPDATE语句代码:

$check = $db->query("SELECT * FROM categories WHERE cat_title = '$category_title' OR cat_price = '$category_price' OR cat_limit = '$category_limit' AND cat_id != '$id'");
    if($check->num_rows !== 0){
        exit('Make sure Category Title, Limit or Price does not already exist');
} else {
    $update = $db->query("UPDATE categories SET cat_title = '$category_title', cat_price = '$category_price', cat_limit = '$category_limit' WHERE cat_id = '$id'");
}

上面的代码检查 $category_title $category_price $category_limit 的值是否可以可以在表格中除要编辑的类别之外的任何地方找到。

但是,即使表中没有可能重复的值,似乎也不允许用户更新类别。

例如,如果用户根据上述类别表将法语的价格更新为 $ 150.56 ,则返回Make sure Category Title, Limit or Price does not already exist

请帮助 谢谢

2 个答案:

答案 0 :(得分:2)

您忘记了括号

SELECT * 
  FROM categories
 WHERE (cat_title = '$category_title' OR cat_price = '$category_price' OR cat_limit = '$category_limit')
   AND cat_id != '$id'

现在,将以OR条件为准,一起评估所有AND条件。

答案 1 :(得分:1)

我认为您只需要唯一的约束/索引。您可以将它们创建为:

create unique index unq_categories_title on categories(title);
create unique index unq_categories_price on categories(price);

数据库将强制执行数据完整性检查,不允许新行或更新的行在这些列中重复值。

与使用应用程序逻辑相比,这通常是一种更好的方法。例如,当检查在应用程序中时,两个用户可以大约同时插入同一行。在数据库的约束下,数据库保证了唯一性。