我正在写一个测验网站 应该发生的是:
?q=[question number]&a=[answer].
<?PHP mysql_connect("------", "------", "------") or die(); mysql_select_db("------") or die(); $q=$_GET['q']; if(isset($_GET['a'])){ $a=$_GET['a']; } else { $a=$_POST['longanswer']; } if(isset($a)){ $u=$_COOKIE['id']; if($qust['atype']==1){ mysql_query("INSERT INTO answers (`userid` ,`answer` ,`qid`) VALUES ($u, $a, $q);"); } else { mysql_query("INSERT INTO answers (`userid` ,`answer` ,`qid`) VALUES ($u, '$a', $q);"); } } ?>
我认为这不重要,但稍后在代码上,它使用SELECT命令查询数据库 当我运行此代码时,它似乎输入2或3个数据库条目。趋势似乎是当我运行代码时它输入上一个答案,然后是新答案。 任何帮助将不胜感激。谢谢,
洛根
答案 0 :(得分:1)
您想要做的似乎是每个用户每个问题只允许一个答案。如果是这种情况,您需要在userid和qid上的表上使用UNIQUE约束:
ALTER TABLE answers ADD UNIQUE(userid,qid);
当您尝试插入具有相同userid和qid的行时,这将导致错误。如果要允许用户更改其错误,可以将INSERT查询更改为:
INSERT INTO answers (userid ,answer ,qid) VALUES ($uid, '$answer', $qid) ON DUPLICATE KEY UPDATE answer='$answer'
这将阻止多条记录显示在数据库中,但仍可能从PHP代码中调用多个INSERT。要解决这个问题,我们必须看到更多代码。
答案 1 :(得分:1)
另一种选择是首先尝试检索您要输入数据库的数据。如果你找到它,它已经存在,所以不要再添加它。使用约束的建议是合理的,但如果您试图阻止重复的数据不容易添加到约束或您不希望重复的数据不是完全相同的数据(比如说类似的数据)那么这是另一种选择。
答案 2 :(得分:0)
如果你只允许每个用户一个答案,那么cmptrgeekken提到的唯一约束肯定会被添加,但是如果它发生,你还必须处理主键违规:通知用户它已经回复或者替换以前的值,具体取决于您希望网站如何运作。
此外,由于某种原因,请求被触发不止一次?也许是通过javascript或你的其他逻辑?如果您只点击一次就会出现重复的答案,那么情况似乎就是这样。
/ B