我想通过以下方式用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
。
请帮助 谢谢
答案 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);
数据库将强制执行数据完整性检查,不允许新行或更新的行在这些列中重复值。
与使用应用程序逻辑相比,这通常是一种更好的方法。例如,当检查在应用程序中时,两个用户可以大约同时插入同一行。在数据库的约束下,数据库保证了唯一性。