我应该写什么代码来依次显示问题和多项选择答案


What code should I write to display questions and multiple choice answers sequentially?

我在MySQL数据库中创建了一个题库表。我想在浏览器上显示这些问题和它们的选择题答案。在用户选择当前问题的答案后,必须显示以下问题。我想将用户输入的值存储在一个POST变量中,比如$_POST['store']。它必须捕获用户每次输入的值并进行递增。最后必须显示结果,每答对一个问题得一分。

数据库表字段为Sno, Question, option 1, option 2, option3在另一个表中,Q_no, userentered, corect answer .

我写什么PHP代码和MySQL查询?如何创建另一个动态表,以便将用户输入的答案与正确答案进行比较?

没有错误处理、输入验证或清理的基本PHP步骤(请参阅PHP手册):

<?php
/* connect to server */
try{
  $dbh=new PDO("mysql:host={$myserver}", $myuser, $mypassword);
} catch (PDOException $ex){
    die("cannot connect to database service"); 
    error_log($ex->getMessage());
}
/* create database */
$dbh->exec("CREATE DATABASE IF NOT EXISTS {$mydb}"); 
/* select database */
$dbh->exec("USE {$mydb}"); 
/* create tables */
$sql="CREATE TABLE IF NOT EXISTS questions (
  Sno INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
  Question TEXT, 
  option1 VARCHAR(64), 
  option2 VARCHAR(64), 
  option3 VARCHAR(64)
)";
$dbh->exec($sql);
$sql="CREATE TABLE IF NOT EXISTS answers (
  A_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
  Q_no INT, 
  user VARCHAR(64), 
  answer TEXT,
  INDEX Q_ind (Q_no), 
  FOREIGN KEY (Q_no) 
    REFERENCES questions (Sno)
    ON DELETE CASCADE
)";
$dbh->exec($sql);
/* add new question from HTML form (method POST) */
$stmt=$dbh->prepare("INSERT INTO questions (
  Question, option1, option2, option3
) 
VALUES (
  ':question', 
  ':option1', 
  ':option2', 
  ':option3'
)");
$question = process_question_input($_POST['question']);
$option1 = process_option_input($_POST['option1']);
$option2 = process_option_input($_POST['option2']);
$option3 = process_option_input($_POST['option3']);
$stmt->bindParam(':question',$question);
$stmt->bindParam(':option1',$option1);
$stmt->bindParam(':option2',$option2);
$stmt->bindParam(':option3',$option3);
$stmt->execute();
/* add new answer from HTML form (method POST) */
$stmt=$dbh->prepare("INSERT INTO answers (Q_no,user,answer) 
VALUES (
  ':question_number', 
  ':user', 
  ':answer'
)");
$question_number = process_question_number($_POST['question_number']);
$user = process_user($_POST['user']);
$answer = process_answer($_POST['answer']);
$stmt->bindParam(':question_number',$question_number);
$stmt->bindParam(':user',$user);
$stmt->bindParam(':answer',$answer);
$stmt->execute();
/* return a table with every question and associated answers */
$sql="SELECT * FROM  questions LEFT JOIN answers ON Sno=Q_no"; 
$stmt = $dbh->query($sql);
/* return records for a particular question and its answers, if any */
$stmt=$dbh->prepare("SELECT * FROM  questions LEFT JOIN answers ON Sno=Q_no WHERE question=:question");
$question=process_question_input($_POST['question']); 
$stmt->bindParam(':question',$question);
$stmt->execute();
$dbh = null;
?>

对于你的html,像这样对于question:

<html><head><title>My question</title></head>
  <body>
    <form method="post">
      Option 1: <input type="text" name="option1" /><br /> 
      Option 2: <input type="text" name="option2" /><br /> 
      Option 3: <input type="text" name="option3" /><br /> 
      Input your question:<br />
      <textarea name="question"></textarea>
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

然后像这样回答:

<html><head><title>My answer</title></head>
  <body>
    <?php echo $question; ?>
    <form method="post">
      <input type "hidden" value="<?php echo $question_number; ?>" />
      User:<input type="text" name="user" /><br /> 
      Input your question:<br />
      <textarea name="answerswer"></textarea>
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

这一切。从这里我认为你可以得到基本的想法,开始使用它,并在你方便的时候调整它…

[EDIT]我今天看到了一个关于这个的投票,就像在这个编辑之前一样。5年后再看它,我认为我没有足够强调我的答案:如果没有适当的数据验证和清理,以及正确使用PDO或带准备语句的DB驱动程序来避免SQL注入和其他崩溃,这段代码对生产是无效的。请阅读PHP关于输入验证和清理过滤器的手册,以及SQL注入避免

我已经编辑了代码,使使用PDO而不是mysql,因为在这个时刻mysql是过时的方式,不应该在编写新的代码时考虑。

还编辑了模式,将Q_no设置为PRIMARY KEY,将Sno设置为引用它的FOREIGN KEY,以保证引用完整性;并在answers表中添加一个额外的列,一个主键,因为作为一般规则,您在数据记录中有一些索引的唯一id,以便能够快速正确地引用它们(如果您发现一个模式没有它,请不要愚蠢地要求dbs添加它)。不要编写没有保持引用完整性的劣质DDL代码,也不要编写性能差得离谱的DML查询,因为它们对应该建立索引的列使用了连接和where子句,并且这些列有外部约束。如果你试图用物化视图来解决这个问题,我告诉你,你会发现开发者的地狱是什么样子的。

值得一提的是,将每个选项存储在一个列中通常不是一个好主意。不够灵活的;它可能应该通过额外的表options来规范化,其中每个选项将有一个唯一的对optionnumber, Q_no引用。

作为旁注,我认为我可能花了两倍的时间来编辑这个答案,以符合最基本的编码标准,而不是第一次以同样的功能回答它。客户仍然想知道为什么一个有经验的开发人员要比一个初级开发人员花费几乎一样多的时间甚至更多的时间来完成一些事情……(虽然,公平地说,在现实世界中,有经验的开发人员可能会使用某种ORM或由他/她熟悉的框架提供的更完整的数据抽象层,通过注释、配置、通过编码约定隐含的配置等自动化大部分这些东西)

作为奖励,一些感兴趣的资源:

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheethttps://www.owasp.org/index.php/XSS_ (Cross_Site_Scripting) _Prevention_Cheat_Sheet