php - 如何使用 PHP 和 MySQL 防止一个用户名多次完成调查?

标签 php mysql

我做了一个简单的调查。成功填充并将其放入数据库表中。现在的问题是如何防止用户名多次完成调查?用户名是从 session 中获取的。我在这里尝试了我自己的代码,但它不起作用:

<?php 
session_start();
include_once('config.php');

$username       = $_SESSION['username'];
$ask1           = $_POST['ask1'];
$ask2           = $_POST['ask2'];
$ask3           = $_POST['ask3'];
$ask4           = $_POST['ask4'];

$query = mysql_query("insert into survey values('', '$username', '$ask1', '$ask2', '$ask3', '$ask4')"); 


if ($query) {
        // success
        echo" <script language='JavaScript'> alert ('Thankyou for your participation');</script>";
        echo '<script language="JavaScript"> window.location.href ="home.php";</script>';
} else {
    echo "SELECT username FROM survey WHERE username='".$_SESSION['username']."'";
    $dup = mysql_query("SELECT username FROM survey WHERE username='".$_SESSION['username']."'");
        if(mysql_num_rows($dup) >0){
            echo"<script language='JavaScript'> alert ('You've filled out the survey!');</script>";
        echo '<script language="JavaScript"> window.location.href ="home.php" </script>';
        } else {
    // fail
     echo" <script language= 'JavaScript'> alert ('Failed to complete the survey'); </script>";
     echo '<script language="JavaScript"> window.location.href ="survey.php";</script>';
}}
?>

那么对于这样的问题,最好的解决方案是什么?预先感谢那些想要帮助我的人。再次感谢您。

最佳答案

在您的代码中,问题在于逻辑:您插入新行,然后检查是否有包含当前用户名的行。显然你必须先检查一下。

您在保存调查结果时会显示代码。但事实上,你应该检查两次。

  1. 在向用户显示表单之前,您必须检查他之前是否已经填写过。

  2. 保存时:不仅在 PHP 中测试是否不存在 double 。在表中的用户名列上定义唯一索引,即使检查失败,也保证永远不会有重复项。

这是创建唯一索引的方法:

alter table survey add unique index (username);

关于php - 如何使用 PHP 和 MySQL 防止一个用户名多次完成调查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009604/

相关文章:

php - 我如何知道我是否位于数据集中的最后一行?

php - T_PAAMAYIM_NEKUDOTAYIM 错误调用静态方法

php - 国家/地区下拉列表将 ID 而不是名称(字符串)插入数据库(mysql)

php - $_POST 真的安全吗?

javascript - 在同一页面上通过 AJAX 重新运行 PHP 代码

php - URL 中带有特殊字符的 HTTP 状态代码

php - 根据 PHP 列值登录用户重定向

php - 为什么在 android 中计算与在 php 中不同?

php - 连接到不允许远程连接的主机上的 mysql 数据库

MySQL STR_TO_DATE 插入空值