我正在后端使用 php-MySQL 进行项目。它有各种文章可供浏览,分类为各种类别和用户登录系统。
我最近添加了一个观看列表功能,使用户能够将文章添加到他们的观察列表/仪表板。
我有以下表格。
文章表
article-id(int)Primary-Unique
cat(varchar)
名称(varchar)
subCat(varchar)
描述(varchar)
添加日期
用户表
用户名(varchar)主要唯一
lname
fname
加入日期
。关注列表表
文章ID(INT)
用户名(为varchar)
date_watch
我们可以看到手表列表没有唯一的密钥
我想让(用户名+文章ID)成为唯一一对
因为对于每个用户名,存在超过1个文章ID并且反之亦然
我只想插入和删除行,不需要更新他们如何阻止重复的条目?
到现在为止我一直用php检查行数
"SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}"
如果
mysql_num_rows() >1(not allowed to insert)
这样可以正常但如果错误地执行了INSERT命令,那将是一个重复的条目
如何防止它?
我正在使用 phpmyadmin
答案 0 :(得分:5)
您只需在表格中添加一个唯一键:
ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique` (`article-id`, `username`);
此外,通过查看您所拥有的功能,您可以选择将其设置为主键,而不是使用以上内容:
ALTER TABLE `watchlist`
ADD PRIMARY KEY (`article-id`, `username`);
两者都会阻止任何重复条目的插入。
此外,如果您想在这种情况下插入,您可能需要检查INSERT IGNORE和ON DUPLICATE KEY。有关两者的详细信息,请参阅"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"。
答案 1 :(得分:1)
尝试
$sql = "SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}";
if(mysql_num_rows($sql) >=1) {
//Prevent Insert
} else {
//Put your Insert query
}
或者只使用IGNORE
之类的
INSERT IGNORE INTO watchlist
(article-id, username)
VALUES
({article-id}, {username}),
确保您将列用作UNIQUE
约束。如果不将它们更改为
ALTER TABLE `watchlist`
ADD UNIQUE INDEX `watchlist_unique`
(`username`,`article-id`);
您需要检查atleast
个1
记录的1
不大于mysql_*
。
并且由于整个ext/mysql PHP
扩展程序(提供带有前缀mysql_*
命名的所有函数)从PHP v5.5.0
开始正式弃用,并尝试避免MySQL
语句将来删除。
您可以更好地使用其他两个MySQLi
扩展程序:PDO_MySQL
和ext/mysql
,其中任何一个都可以用来代替{{1}}。
答案 2 :(得分:0)
您可以在用户名和文章ID上创建唯一索引:
ALTER TABLE watchlist ADD UNIQUE INDEX my_idx ( username, article-id);
然后不允许重复插入。
您还可以使用INSERT INTO ... ON DUPLICATE KEY
语法正常处理重复插入,以使用给定的用户名,文章ID对更新条目中的某些字段。