Search code examples
phpmysqliprepared-statement

Trying to INSERT data into MySQL table in one query, yet changing one specific column


I am trying to INSERT some data into my table using an SQL statement. A user completes a survey that has 10 questions, then I want to INSERT those 10 answers into the db using one SQL statement. So essentially the only 2 fields that will change will be the questionID and the answer column? Please note I have just given 2 questions as an example within the <form> tags for info.

questionnaire:

<!-- Attempt 2 of questionnaire -->
<form action="scripts/submit-survey.php" method="post">
    <?php
        $questionnaire = "Welcome Questionnaire";
        $questionID = 1;
        $stmt = $conn->prepare ("SELECT `questionnaire`.`questionnaireName`, `questionnaireQuestions`.`questionID`,`question`.`question` FROM `questionnaire` INNER JOIN `questionnaireQuestions` ON `questionnaire`.`questionnaireID` = `questionnaireQuestions`.`questionnaireID` INNER JOIN `question` ON `questionnaireQuestions`.`questionID` = `question`.`questionID` WHERE `questionnaire`.`questionnaireName` = ? AND `question`.`questionID` = ?");
        $stmt->bind_param("si", $questionnaire, $questionID);
        $stmt->execute();
        $result = $stmt->get_result();
        while($row = $result -> fetch_assoc())  
            {
    ?>
    <p><?php echo $row['question']; ?></p>
    <?php
            }
    ?>
    <label><input type="radio" name="q1" value="1"> 1</label>
    <br>
    <label><input type="radio" name="q1" value="2"> 2</label>
    <br>
    <label><input type="radio" name="q1" value="3"> 3</label>
    <br>

    <?php
        $questionnaire = "Welcome Questionnaire";
        $questionID = 2;
        $stmt = $conn->prepare ("SELECT `questionnaire`.`questionnaireName`, `questionnaireQuestions`.`questionID`,`question`.`question` FROM `questionnaire` INNER JOIN `questionnaireQuestions` ON `questionnaire`.`questionnaireID` = `questionnaireQuestions`.`questionnaireID` INNER JOIN `question` ON `questionnaireQuestions`.`questionID` = `question`.`questionID` WHERE `questionnaire`.`questionnaireName` = ? AND `question`.`questionID` = ?");
        $stmt->bind_param("si", $questionnaire, $questionID);
        $stmt->execute();
        $result = $stmt->get_result();
        while($row = $result -> fetch_assoc())  
            {
    ?>
    <p><?php echo $row['question']; ?></p>
    <?php
            }
    ?>
    <label><input type="radio" name="q2" value="1"> 1</label><br>
    <label><input type="radio" name="q2" value="2"> 2</label><br>
    <label><input type="radio" name="q2" value="3"> 3</label><br>
    <input type="submit" value="Submit">
</form>

submit-survey.php

<?php
  require 'db.php';
  session_start();
  $seshID = $_SESSION['studentID'];

    $a1 = $_POST['q1'];
    $a2 = $_POST['q2'];
    $a3 = $_POST['q3'];
    $a4 = $_POST['q4'];
    $a5 = $_POST['q5'];
    $a6 = $_POST['q6'];
    $a7 = $_POST['q7'];
    $a8 = $_POST['q8'];
    $a9 = $_POST['q9'];
    $a10 = $_POST['q10'];
    $answer_bank = array(
      $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $10
    );
    $stmt = $conn->prepare ("INSERT INTO `studentAnswer` (`studentAnswerID`, `studentID`, `questionID`, `answer`) VALUES (NULL, ? , ? ,?)");
          //echo $i;
          //echo ${"a". $i};
            $stmt->bind_param("iii", $seshID , $questionID , $a);
            foreach ($answer_bank as $a_b) {
              list($a) = $a_b;
              $stmt->execute();
          }
            $result = $stmt->get_result();

?>

DB Table: DB


Solution

  • You're missing 1 value the $questionID.

    try

    $questionID = 1;
    foreach ($answer_bank as $a) {
         $stmt->execute();
         $questionID++;
    }
    

    Improve your query by using alias

    $stmt = $conn->prepare ("SELECT 
              `qn`.`questionnaireName`,
              `qQ`.`questionID`,
              `q`.`question`
          FROM `questionnaire` `qn`
          INNER JOIN `questionnaireQuestions` `qQ` ON `qn`.`questionnaireID` = `qQ`.`questionnaireID`
          INNER JOIN `question` `q` ON `qQ`.`questionID` = `q`.`questionID` 
          WHERE `qn`.`questionnaireName` = ? AND `q`.`questionID` = ?");