我的数据库中有下表:
CREATE TABLE subjects (
subject_id int(11) NOT NULL AUTO_INCREMENT,
subject text,
PRIMARY KEY (subject_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;
我还从此PHP中插入了表数据,并且工作正常:
<?php
include('Conexion.php');
$subject = "";
if (isset($_POST['reg_subject'])) {
$text = $_POST['text'];
$query = "INSERT INTO subjects (subject) VALUES('$text')";
mysqli_query($conn, $query);
header("Location: index.PHP");
}
?>
问题在于用户可以输入重复的主题,而我想避免这种情况。
如果主题已经存在,我试图显示一条警报消息,但是它继续接受重复的主题。如何避免相同名称的重复主题?
这就是我的做法:
<?php
include('Conexion.php');
$subject = "";
if (isset($_POST['reg_subject'])) {
$text = $_POST['text'];
$subject_check_query = "SELECT * FROM subjects WHERE subject='$subject'";
$result = mysqli_query($conn, $subject_check_query);
$text = mysqli_fetch_assoc($result);
$message = "Already Exists";
if ($text) { // if subject exists
if ($text['text'] === $subject) {
echo "<script type='text/javascript'>alert('$message');</script>";
}
}else{
$query = "INSERT INTO subjects (subject) VALUES('$text')";
mysqli_query($conn, $query);
header("Location: index.php");}
}
?>
答案 0 :(得分:0)
如果插入查询返回选择查询返回的结果,则在插入查询周围添加if语句。使用xdebug也是一个好主意,它可以告诉您在运行代码时会发生什么。
答案 1 :(得分:0)
将插入查询部分保持在else条件下
答案 2 :(得分:0)
您可以为subject_text
列创建唯一索引:
ALTER IGNORE TABLE subjects ADD UNIQUE (subject_text)
然后将查询更改为以下任意一项:
"INSERT IGNORE INTO subjects (subject_text) VALUES('$text')"
或者:
"INSERT INTO subjects (subject_text) VALUES('$text')
ON DUPLICATE KEY UPDATE subject_text = subject_text"
注意,如果您的数据库已经有重复的值,则此方法将无效。
要了解这两个答案之间的区别,请查看this问题。