Shawn
Shawn

Reputation: 37

Multiple forms and multiple submissions with one submit button

At the moment, I'm using a loop to read the 'questions' and 'answers' fields from my postgresql "PDPC".considerations table and reflecting them on the form. I'd like to update them all with one submit button.

I refered to PHP MySQL Multiple Forms and Multiple Submits on single page and tried using the <input type="hidden">, arrays and while loop but the form either does not execute or it does not correctly update all the forms.

I think the error is around the $_POST (at the top) and the HTML form (at the bottom). (Sorry if the codes are messy, it is my first time with PHP, HTML and Postgres). Thank you!

<?php

// Include config file
require_once "config.php";

// Define variables and initialize with empty values
$question = $answer = "";
$question_err = $answer_err = "";

    // Processing form data when form is submitted
 if(isset($_POST["consideration_no"]) && !empty($_POST["consideration_no"])){
    $counter = 0;
    // Get hidden input value
    //$consideration_no = $_POST['consideration_no'];
    $dg_no = $_POST['dg_no'];
    $consideration_no = $_POST['consideration_no'];
    $answer = $_POST['answer'];

    // Check input errors before inserting in database
    if(empty($answer_err)){

        while ($counter<5){ 
        // Validate address address
        $input_answer = trim($_POST["answer"]);
        if(empty($input_answer)){
            $answer_err = "Please enter an answer.";     
        } else{
            $answer1[$counter] = $input_answer;
        }   

        // Prepare an update statement
        $sql = 'UPDATE "PDPC".consideration SET answer=:answer WHERE consideration_no = :consideration_no';
        if($stmt = $pdo->prepare($sql)){

            $stmt->bindParam(":answer", $param_answer);
            $stmt->bindParam(":consideration_no", $param_consideration_no);

            //Set Parameter
            $param_answer = $answer1[$counter];
            $param_consideration_no = $consideration_no[$counter];

            // Attempt to execute the prepared statement
            $stmt->execute();
            $counter++;
            }
        }
                if($stmt->execute()){
                // Records updated successfully. Redirect to landing page
                header("location: home1.php?dm_no=".$_GET["dm_no"]);
                exit();
            } else{
                echo "Something went wrong. Please try again later.";
            }
        // Close statement
        unset($stmt);
    }

    // Close connection
    unset($pdo);
} else{
    // Check existence of dg_no parameter before processing further
    if(isset($_GET["dg_no"]) && !empty(trim($_GET["dg_no"]))){
        // Get URL parameter
        $dg_no =  trim($_GET["dg_no"]);

        // Prepare a select statement
        $sql = 'SELECT * FROM "PDPC".consideration WHERE (dg_fkey = :dg_no AND code_no = 1)';
        if($stmt = $pdo->prepare($sql)){
            // Bind variables to the prepared statement as parameters
            $stmt->bindParam(":dg_no", $param_no);

            // Set parameters
           //$param_no = $dg_no;
            $param_no = trim($_GET["dg_no"]);


            // Attempt to execute the prepared statement
            if($stmt->execute()){
                if($stmt->rowCount() > 0){

                SubSection($subsection1_1); //Collection Purpose Section

                    while($row = $stmt->fetch()){
                    // Retrieve individual field value
                    $consideration_no = $row["consideration_no"];
                    $question = $row["question"];
                    $answer = $row["answer"];
                    echo "<a href='considerationupdate.php?consideration_no=". $row['consideration_no'] ."' title='Update Data Map' data-toggle='tooltip'><span class='glyphicon glyphicon-pencil'></span></a>";

                    //...time to show the questions and answers with the while loop...
                    ?>
                          <form action="<?php echo htmlspecialchars(basename($_SERVER['REQUEST_URI'])); ?>" method="post">
                            <div class="form-group <?php echo (!empty($answer_err)) ? 'has-error' : ''; ?>">
                                <label><?php echo $question; ?></label>
                                <input type="text" name="answer" class="form-control" value="<?php echo $answer; ?>">
                                <span class="help-block"><?php echo $answer_err;?></span>
                                <input type="hidden" name="answer1[]" id = "$answer1" value="<?php echo $answer; ?>"/>
                                <input type="hidden" name="consideration_no[]" id = "consideration_no" value="<?php echo $consideration_no; ?>"/>
                                <input type="hidden" name="dg_no" value="<?php echo $dg_no; ?>"/>
                            </div>
                            <input type="submit" class="btn btn-primary" value="Submit">
                    <?php

                    }
                    ?>
                            <input type="submit" class="btn btn-primary" value="Submit">
                            <a href="javascript:history.go(-1)" class="btn btn-default">Cancel</a>
                           </form>
                        </div>
                    <?php

                } 
            } 
            else{
                echo "Oops! Something went wrong. Please try again later.";
            }
        }
        // Close statement
        unset($stmt);

        // Close connection
        unset($pdo);
    }  
    else{
        // URL doesn't contain dg_no parameter. Redirect to error page
        header("location: error.php");
        exit();
    }
}
?>

It should read the questions and answers from the DB table, show it on the forms as the label and text fields (working), and the user should be able to update the form after editing the text fields and clicking submit (Not working properly).

Wanted results after submit

Actual result (it takes the bottom field's answer for all)

Upvotes: 0

Views: 692

Answers (3)

Pinke Helga
Pinke Helga

Reputation: 6682

Your branch if(isset($_GET["dg_no"]) && !empty(trim($_GET["dg_no"]))){ depends on get parameters, however, your <form method="post"> of <input type="hidden" name="dg_no" value="<?php echo $dg_no; ?>"/> uses post parameters.

Therefore the branch will never be executed unless the page is requested by another GET-request like a link or another form.

If the parameters can occur in both methods, POST and GET as well, you might want to check the $_REQUEST array instead. Be aware that the parameters listed in $_REQUEST can vary depending on the .ini settings request_order and variables_order.

According to your comment 'Because each form is for one table row.' in another answer, this might be an XY problem.

Consider to take the common way not generating multiple forms but array parameters similar as you did in

<input type="hidden" name="answer1[]" id = "$answer1" value="<?php echo $answer; ?>"/>

Here you rely on keys getting generated automatically. As well you can specify an individual key:

<input type="text" name="some_parameter[<?php echo $answer; ?>]">

Further more

There is an HTML line in the loop having a static id on an element:

<input type="hidden" name="consideration_no[]" id="consideration_no" value="<?php echo $consideration_no; ?>"/>

This will not break PHP, however, it is against the HTML specs saying an id has to be unique per document.

Upvotes: 1

Shawn
Shawn

Reputation: 37

I have fixed the issue! It was the logical flow of the script. Specifically, the POST variable at the top should be changed to dg_no, add the dg_no parameters along with it, loop the parameters instead of the entire preparation script and include the execute script in the whie loop too.

Thanks for the help and guidance, they were much appreciated!

Upvotes: 0

user10914916
user10914916

Reputation:

Since is your form and you are using SQL to get and the objective is to update the data with one submit?

Why not just use one form?. I belive you can do all you need with just one and multiple input.

Upvotes: 1

Related Questions