0

我在 PHP 中设置了一个考试,它采用用户名并回答四个问题。

HTML:

<html>
<head>
</head>

<body>
<form action="submit.php" method=post>
Your name: <input type=text name=yname value="" size=20 /><br><br>

Question 1:<input type=text name=q1 value="" size=20 /><br>
Question 2:<input type=text name=q2 value="" size=20 /><br>
Question 3:<input type=text name=q3 value="" size=20 /><br>
Question 4:<input type=text name=q4 value="" size=20 /><br>

<input type=submit name=btnsubmit value="submit" />
</form>
</body>
</html>

我的 PHP 示例“submit.php”:

<?php
$name = trim(strip_tags(stripslashes($_POST['yname'])));
$q1 = trim(strip_tags(stripslashes($_POST['q1'])));
$q2 = trim(strip_tags(stripslashes($_POST['q2'])));
$q3 = trim(strip_tags(stripslashes($_POST['q3'])));
$q4 = trim(strip_tags(stripslashes($_POST['q4'])));

if ($name <> "" && $q1 <> "" && $q2 <> "" && $q3 <> "" && $q4 <> "") {
    if ($passing > 85) { //value checked in the more comprehensive script
        if ($name == {match from file to see if exam was taken already}) {
            echo "Sorry, but you took the exam already";
        }
        else {
            //....
        }
    }
    else {
        //...
    }
}
?>

我要询问的是,保存“名称”的最佳方法是什么,以便以后如果用户要重新参加考试,可以在不使用数据库的情况下进行比较:

...
if ($name == {match from file to see if exam was taken already}) {
...

如果可能的话。

更新:[已解决]

<?php
global $names;
    $name = trim(strip_tags(stripslashes($_POST['yname'])));
    $q1 = trim(strip_tags(stripslashes($_POST['q1'])));
    $q2 = trim(strip_tags(stripslashes($_POST['q2'])));
    $q3 = trim(strip_tags(stripslashes($_POST['q3'])));
    $q4 = trim(strip_tags(stripslashes($_POST['q4'])));

    $passing = 85;

    $path_to_names_file = 'storename.txt';

    if ($name <> "" && $q1 <> "" && $q2 <> "" && $q3 <> "" && $q4 <> "") {
        if ($passing >= 85) { //value checked in the more comprehensive script
            $names = file($path_to_names_file);
            if(file_exists($path_to_names_file) && in_array($name, $names)) {
                echo "Sorry, but you took the exam already"; //$name has already taken exam
            }
            else { //if name doesn't match, the user is taking it first time. write the name to file for future check
                $fp = fopen($path_to_names_file, 'a');
                fputs($fp, "\n" . $name);
                fclose($fp);
                //file_put_contents($path_to_names_file, "$name\n", FILE_APPEND); //append the file
                echo "Your name is saved";
            }
        }
        else {
            echo "did not pass";
        }
    }
?>
4

3 回答 3

2

您可以将其存储在数据库或其他数据源中,例如服务器中的文件。

您可以查看如何使用文本文件替代数据库

您可能不想要那么复杂的东西,但您需要将用户 ID 和他已经参加的考试存储在某个地方。

您可以通过不同的方式完成此操作,为每个用户创建一个带有测试 ID 的文件,创建一个带有一些分隔符的唯一文件等。

于 2013-06-19T15:49:34.917 回答
1

如果您需要超过会话长度的数据,并且您确定名称足够唯一,并且彻底清理了用户的输入,您可以使用标志创建一个文件file_put_contents()FILE_APPEND不断向文件写入新行。file(0您可以使用该函数将文件的每一行读入一个数组,并使用in_array().

$dir_to_save_file = sys_get_temp_dir();
$file_prefix = '';
$tmp = tmpfile($dir_to_save_file, $file_prefix);
file_put_contents($tmp, "$name\n", FILE_APPEND);

然后当你想读回文件时

$names = file($tmp);
if(in_array($name, $names){
    //$name has already taken exam
}

您显然会创建一个实际文件而不是临时文件,并将其放在您喜欢的任何位置;在文档根目录上方。

编辑:

要制作永久文件,只需将绝对路径传递给file_put_contents

$path = '/path/to/file';
file_put_contents($path, $data, FILE_APPEND);

这是带有此代码的 pastebin:http: //pastebin.com/35m45Kt7

于 2013-06-19T15:59:27.730 回答
0

您应该将其存储在一个永久的 cookie 中。

Forever cookie 这里的意思是 cookie 可以保存很长时间,比如 3000 年。在该 cookie 中,您可以存储用户的姓名,然后始终检查用户之前未参加过考试的考试前参加情况。

阅读@ w3schools或查看其文档

您可以像这样设置永久 cookie 或永不过期的 cookie:

setcookie(
  "CookieName",
  "CookieValue",
  time() + (10 * 365 * 24 * 60 * 60)
);

但是您可以从另一台 PC 上进行考试,因此我建议您创建一个 txt 文件或未知格式的文件,您可以在其中存储用户名,然后始终检查该文件,然后允许或禁止它们。

在此处查看有关文件处理的更多信息。

您可以逐行存储名称,以便您检查。

要逐行检查代码,请参阅SO 上的这个问题

于 2013-06-19T15:51:48.340 回答