我应该编写什么代码来顺序显示问题和多项选择答案?

时间:2011-11-28 08:55:14

标签: php mysql

我在MySQL数据库中创建了一个问题库表。我想在浏览器中显示这些问题及其多项选择答案。用户选择当前问题的答案后,必须显示以下问题。我想将用户输入的值存储在$_POST['store']之类的POST变量中。它必须捕获用户每次输入的值并增加。最后必须显示结果,对于每个正确的答案,必须分配一个标记。

数据库表字段为SnoQuestionoption 1option 2option3 在另一个表格中,Q_nouserenteredcorect answer

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

1 个答案:

答案 0 :(得分:3)

没有错误处理,输入验证或清理的基本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,这样的问题:

<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="answer"></textarea>
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

多数民众赞成。从这里开始,我认为你可以获得基本的想法,开始使用它并在方便的时候进行调整......

[编辑] 我今天在这个编辑之前看到过这样的upvote。 5年之后看看它,我认为我没有强调我的答案这段代码对生产无效没有正确的数据验证和清理以及正确使用PDO或数据库驱动程序准备好的语句,以避免SQL注入和其他破坏。 请在输入VALIDATION AND SANITIZATION FILTERSSQL INJECTION AVOIDANCE 上阅读PHP手册。

我编辑了代码以使用PDO而不是mysql,因为此时mysql是way outdated,在编写新代码时不应该考虑。

还修改了架构,将Q_no设置为PRIMARY KEY,将Sno设置为引用它的FOREIGN KEY,以获得参照​​完整性;并在答案表中添加一个额外的列,一个主键,因为作为一般规则,您在数据记录中有一些索引唯一ID,以便能够快速正确地引用它们(如果您找到没有它的架构,请不要是愚蠢的并要求dbs添加它。不要编写不保持参照完整性的糟糕DDL代码或运行性能极差的DML查询,因为它们使用连接和where子句应该被索引并具有外部约束。如果您尝试使用物化视图修复它,请告诉您,您将了解开发人员的地狱情况。)

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

作为旁注,我想我可能花了两倍的时间编辑这个答案,以匹配最基本的编码标准,而不是我在第一次以同样功能的方式回答它时所做的。而且客户仍然想知道为什么一个经验丰富的开发人员需要花费大量时间甚至更多时间来完成一些事情...(尽管,公平地说,在现实世界中,有经验的开发人员可能会使用某种类型的ORM或由他/她熟悉的框架提供的更完整的数据抽象层,通过编码约定自动化大部分内容,包括注释,配置,隐含配置等。)

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

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