简体   繁体   中英

failing to generate and insert quiz_id and question_id

I have the following code for a simple quiz program, and for some reason it is failing to generate (and store to the database) a quiz id and question id, which means the answers don't have any reference.

The code in the admin panel is: (I assume the error is here, but am not sure)

//inserting the questions into the database
 //checking if the required data has been filled
    if(isset($_POST['desc'])){
        if(!isset($_POST['iscorrect']) || $_POST['iscorrect'] == ""){
            echo "Sorry, important data to submit your question is missing. Please press back in your browser and try again and make sure you select a correct answer for the question.";
            exit();
        }

        if(!isset($_POST['type']) || $_POST['type'] == ""){
            echo "Sorry, there was an error parsing the form. Please press back in your browser and try again";
            exit();
        }

     //connecting to the database
        require_once("scripts/connect_db.php");

     //initializing the variables
        $question = $_POST['desc'];
        $program = $_POST['code_desc'];
        $programType = $_POST['prog-lang'];
        $answer1 = $_POST['answer1'];
        $answer2 = $_POST['answer2'];
        $answer3 = $_POST['answer3'];
        $answer4 = $_POST['answer4'];
        $type = $_POST['type'];
        $quizID = $_POST['quizID'];

     //replacing everything except 0-9 with nothing as its values are - 1/2/3...
        $quizID = preg_replace('/[^0-9]/', "", $quizID);

     //replacing everything except a-z with nothing as its values are - mc/tf
        $type = preg_replace('/[^a-z]/', "", $type);

     //replacing everything except 0-9 & a-z with nothhing as value is - answer1/2/3/4
        $isCorrect = preg_replace('/[^0-9a-z]/', "", $_POST['iscorrect']);

     //getting and converting strings as they are
        $question = htmlspecialchars($question);
        $question = mysqli_real_escape_string($con,$question);

        $program = htmlspecialchars($program);
        $program = mysqli_real_escape_string($con,$program);

        $answer1 = htmlspecialchars($answer1);
        $answer1 = mysqli_real_escape_string($con,$answer1);

        $answer2 = htmlspecialchars($answer2);
        $answer2 = mysqli_real_escape_string($con,$answer2);

        $answer3 = htmlspecialchars($answer3);
        $answer3 = mysqli_real_escape_string($con,$answer3);

        $answer4 = htmlspecialchars($answer4);
        $answer4 = mysqli_real_escape_string($con,$answer4);



     //if its a true/false question, do this-
        if($type == 'tf'){
         //if any field is null or empty, say sorry
            if((!$question) || (!$answer1) || (!$answer2) || (!$isCorrect)){
                if($answer1=='0' || $answer2=='0')
                {
                    //do nothing
                }else{
                    echo "Sorry, All fields must be filled in to add a new question to the quiz. Please press back in your browser and try again.";
                    exit();
                }
            }
        }

     //if its a multiple choice question, do this-
        if($type == 'mc'){
         //if any field is null or empty, say sorry
            if((!$question) || (!$answer1) || (!$answer2) || (!$answer3) || (!$answer4) || (!$isCorrect)){
                if($question=='0' || $answer1=='0' || $answer2=='0' || $answer3=='0' || $answer4=='0')
                {
                    //do nothing
                }else{
                    echo "Sorry, All fields must be filled in to add a new question to the quiz. Please press back in your browser and try again.";
                    exit();
                }
            }
        }

     //inserting the question and type into table question
        $sql = mysqli_query($con,"INSERT INTO questions (quiz_id, question, code, code_type, type) VALUES ('$quizID', '$question', '$program', '$programType', '$type')")or die(mysqli_error());
        //lastId is there, so we can insert the id, question_id in our table
            $lastId = mysqli_insert_id();
            mysqli_query($con,"UPDATE questions SET question_id='$lastId' WHERE id='$lastId' LIMIT 1")or die(mysqli_error());

What it should do: (example) of quiz id generated

INSERT INTO `quizes` (`id`, `quiz_id`, `quiz_name`, `total_questions`, `display_questions`, `time_allotted`, `set_default`) VALUES
(1, 1, 'LEVEL1(EASY)', 22, 20, 30, 0),
(2, 2, 'LEVEL2(HARD)', 9, 10, 20, 1);

And questions: (what it should do)

INSERT INTO `questions` (`id`, `quiz_id`, `question_id`, `question`, `code`, `code_type`, `type`) VALUES
(1, 1, 1, 'If the output of the question is  hai , find the error in the program?', 'main()\r\n { \r\nprintf("\\nab");\r\nprintf("\\bsi");\r\nprintf("\\aha");\r\n\r\n}\r\n', 'cpp', 'mc'),
(2, 1, 2, 'find the output?', 'void main()\n{\nint i=1,y;\ny=i---i---i;\ncout<<y<<â€,â€<<i;\ngetch();\n}\n', 'cpp', 'mc'),
(3, 1, 3, 'find the output?', '#include<stdio.h>\r\n\r\nint main()\r\n{\r\ncharstr[20], *s;\r\nprintf("Enter a string\\n");\r\nscanf("%s", str);\r\n    s=str;\r\nwhile(*s != ''\\0'')\r\n    {\r\nif(*s >= 97&& *s <= 122)\r\n            *s = *s-32;\r\n        s++;\r\n    }\r\nprintf("%s",str);\r\nreturn0;\r\n}\r\n', 'cpp', 'mc'),
(4, 1, 4, 'find the error', '#include<stdio.h>\r\nint main()\r\n{\r\nint P = 10;\r\nswitch(P)\r\n    {\r\ncase10:\r\nprintf("Case 1");\r\n\r\ncase20:\r\nprintf("Case 2");\r\nbreak;\r\n\r\ncase P:\r\nprintf("Case 2");\r\nbreak;\r\n    }\r\nreturn0;\r\n}\r\n\r\n', 'cpp', 'mc'),
(5, 1, 5, 'find the correct valid function call...assuming the function exists', '', '', 'mc'),

Instead, for Quizid and questionID it is simply registering in the database as a 0.

Can anyone point me in the right direction to fix this, or suggest where else I might look.

Below is the code for inserting answers (again in the admin.php)

//if inserting a true/false question, insert answers by this-
        if($type == 'tf'){
         //if answer1 is marked correct, do this--
            if($isCorrect == "answer1"){
                $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer1', '1')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer2', '0')")or die(mysqli_error());
                $msg = 'Thanks, question no.'.$lastId.' has been added';
                header('location: admin.php?msg='.$msg.'');
                exit();
            }
         //if answer2 is marked correct, do this--
            if($isCorrect == "answer2"){
                $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer2', '1')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer1', '0')")or die(mysqli_error());
                $msg = 'Thanks, question no.'.$lastId.' has been added';
                header('location: admin.php?msg='.$msg.'');
                exit();
            }   
        }

     //if inserting a multiple choice question, insert answers by this-
        if($type == 'mc'){
         //if answer1 is marked correct, do this--
            if($isCorrect == "answer1"){
                $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer1', '1')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer2', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer3', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer4', '0')")or die(mysqli_error());
                $msg = 'Thanks, question no.'.$lastId.' has been added';
                header('location: admin.php?msg='.$msg.'');
                exit();
            }
         //if answer2 is marked correct, do this--
            if($isCorrect == "answer2"){
                $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer2', '1')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer1', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer3', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer4', '0')")or die(mysqli_error());
                $msg = 'Thanks, question no.'.$lastId.' has been added';
                header('location: admin.php?msg='.$msg.'');
                exit();
            }
         //if answer3 is marked correct, do this--
            if($isCorrect == "answer3"){
                $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer3', '1')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer1', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer2', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer4', '0')")or die(mysqli_error());
                $msg = 'Thanks, question no.'.$lastId.' has been added';
                header('location: admin.php?msg='.$msg.'');
                exit();
            }
         //if answer4 is marked correct, do this--
            if($isCorrect == "answer4"){
                $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer4', '1')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer1', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer2', '0')")or die(mysqli_error());
                mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES ('$quizID', '$lastId', '$answer3', '0')")or die(mysqli_error());
                $msg = 'Thanks, question no.'.$lastId.' has been added';
                header('location: admin.php?msg='.$msg.'');
                exit();
            }

Overall table structure

Image attached: 在此处输入图片说明

UPDATE: as per comment below, also including code to add into quiz table

<?php

    include('scripts/connect_db.php');

        if(isset($_POST['quizName']) && $_POST['quizName'] != ""
        && isset($_POST['quizTime']) && $_POST['quizTime'] != ""
        && isset($_POST['numQues']) && $_POST['numQues'] != ""){

            $qName=mysql_real_escape_string($_POST['quizName']);
            $qTime=mysql_real_escape_string($_POST['quizTime']);
            $nQues=mysql_real_escape_string($_POST['numQues']);

            $qTime = preg_replace('/[^0-9]/', "", $qTime);
            $nQues = preg_replace('/[^0-9]/', "", $nQues);

            $fetch=mysql_query("SELECT id FROM quizes 
                                WHERE quiz_name='$qName'")or die(mysql_error());
            $count=mysql_num_rows($fetch);
            if($count!="")
            {
                $user_msg = 'Sorry, but \ '.$qName.' \ already exists!';
                header('location: admin.php?msg='.$user_msg.'');
            }else{
                mysql_query("INSERT INTO quizes (quiz_name, display_questions, time_allotted) 
                    VALUES ('$qName','$nQues','$qTime')")or die(mysql_error());

                $lastId = mysql_insert_id();
                mysql_query("UPDATE quizes SET quiz_id='$lastId' 
                                WHERE id='$lastId' LIMIT 1")or die(mysql_error());

                $user_msg = 'Quiz, \ '.$qName.' \ has been created!';
                header('location: admin.php?msg='.$user_msg.'');
            }
        }else{
            $user_msg = 'Sorry, but Something went wrong';
            header('location: admin.php?msg='.$user_msg.'');
        }
?>

First, the row count will be numeric, so:

if($count!="")

Should really be:

if($count > 0)

Next, you should be using the mysqli extension or PDO. The mysql_ functions have been deprecated for a while and are completely removed in newer versions of PHP so your code will break if you don't change over.

Finally, you seem to have "id" as the auto-incrementing primary key but you're immediately copying that value over to the quiz_id field. This wastes a query and muddies the waters of which field to use. You should probably just get rid of quiz_id and use if (or rename id to be quiz_id)

For even better performance and reliability, just add a unique index to the quiz name field. Then you can just try to insert into the quizes table without the name check. If it fails because of a duplicate name, the error will tell you there's already a record with that name. You can then get rid of the extra SELECT.

EDIT: If you were asking about the unique index part, basically the SQL to add a unique index on the quiz_name field would be:

ALTER TABLE `quizes`
ADD UNIQUE INDEX `quiz_name` (`quiz_name`);

Then the code would look like:

...
$qTime = preg_replace('/[^0-9]/', "", $qTime);
$nQues = preg_replace('/[^0-9]/', "", $nQues);
// End of original code

$result = mysql_query("INSERT INTO quizes (quiz_name,...other fields...) VALUES ('Quiz A',...other values...)");
if(!$result)
{
  // Failed to insert new quiz
  $error_msg = mysql_error();

  // Check the content of the error message
  if(strpos($error_msg,"Duplicate entry") !== false)
  {
    // A quiz with that name already exists, redirect to the admin page with the desired message
  }
  else
  {
    // Some other error happened, redirect to the admin page with the desired message
  }
}
else
{
  // Successful quiz insert
  $newQuizID = mysql_insert_id();
  echo $newQuizID . "\n";
}

IMPORTANT: I used the "mysql_" functions just to stay in line with what you have right now, but I can't emphasize enough how important it is to convert over to mysqli or PDO. The simplest conversion is probably mysqli, since the syntax will be so similar.

EDIT #2: Also, one more last refinement for your code that inserts multiple-choice answers - you can increase INSERT performance and simplify your code like this:

if($type == 'mc'){
  $sql2 = mysqli_query($con,"INSERT INTO answers (quiz_id, question_id, answer, correct) VALUES 
      ('$quizID', '$lastId', '$answer1', '". ($isCorrect == "answer1" ? "1" : "0") ."'),
      ('$quizID', '$lastId', '$answer2', '". ($isCorrect == "answer2" ? "1" : "0") ."'),
      ('$quizID', '$lastId', '$answer3', '". ($isCorrect == "answer3" ? "1" : "0") ."'),
      ('$quizID', '$lastId', '$answer4', '". ($isCorrect == "answer4" ? "1" : "0") ."')") or die(mysqli_error());
  $msg = 'Thanks, question no.'.$lastId.' has been added';
  header('location: admin.php?msg='.$msg.'');
  exit();
}

That code will use the MySQL feature of inserting multiple rows at once so that you're only running one query instead of 4, and it uses some basic PHP to pick "1" or "0" for the "correct" column appropriately.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM