Anna Fortuna
Anna Fortuna

Reputation: 1071

Using For loop to get values of multiple elements in PHP

The title is so general mainly because I don't know what should be the appropriate title for it. Let me just explain the situation:

Say that I have two textboxes named LastName0 and FirstName0 and a button called addMore. When I click addMore, another two textboxes will be created through JavaScript. These textboxes will be named LastName1 and FirstName1. When I click the addMore button again, another two textboxes button will be created and named LastName2 and FirstName2 respectively. This will go on as long as the addMore button is clicked. Also, a button named deleteThis will be created alongside the textboxes. This simply deletes the created textboxes when clicked.

I also initialized a variable called counter. Every time the addMore button is clicked, the counter goes up by 1, and whenever the deleteThis button is clicked, the counter decreases by 1. The value of the counter is stored in a hidden input type.

When the user submits the form, I get the value of the counter and create a For loop to get all the values of the textboxes in the form. Here is the sample code:

//Suppose that the user decides to add 2 more textboxes. Now we have the following:
     // LastName0   FirstName0
     // LastName1   FirstName1
// LastName2    FirstName2

$ctr = $_POST['counter']; //the counter == 3
for ($x = 0; $x < $ctr; $ctr++)
{
    $lastname = $_POST["LastName$x"];
    $firstname = $_POST["FirstName$x"];

    //This will get the values of LastName0,1,2 and FirstName0,1,2

    //code to save to database…
}

On the code above, if the value of counter is equal to 3, then the values of textboxes LastName0,1,2 and FirstName0,1,2 will be saved. Now here is the problem: If the user decided to delete LastName1 and FirstName1, the For loop will not be able to iterate properly:

$ctr = $_POST['counter']; //the counter == 2
for ($x = 0; $x < $ctr; $ctr++)
{
    //Only LastName0 and FirstName0 will be saved.

    $lastname = $_POST["LastName$x"];
    $firstname = $_POST["FirstName$x"];

    //code to save to database…
}

Someone told me to use the "push and pop" concept to solve this problem, but I am not really sure on how to apply it here. So if anyone can tell me how to apply it, it'll be grand.

Upvotes: 0

Views: 1831

Answers (6)

user2193789
user2193789

Reputation:

Do not use counter if not required
A much easier way is to add array name when admore clicked.
Give a name like first_name[] in textbox

if you create form like that you can use foreach through $_POST['first_name']
try var_dump($_POST) in you php code to see how things goes on.

Upvotes: 1

Styphon
Styphon

Reputation: 10447

A better way to solve this would be to use arrays for Firstname and Lastname. Instead of calling them Lastname0 and Firstname0, then Lastname1 and Firstname1, call them all Lastname[] and Firstname[]. Give them ID's of Lastname0 and Firstname0 and so on for the delete function, but keep the names as arrays.

When the form is submitted use the following:

foreach($_POST['Lastname'] as $i => $lastname) {
    $firstname = $_POST['Firstname'][$i]

    //... code to save into the database here
}

Be warned though that in IE if you have an empty field it will not be submitted, so if Lastname0 has a value, but Firstname0 does not, then $_POST['Firstname'][0] will in fact contain the value of Firstname1 (assuming it has a value in it). To get around this you can use javascript to check if a field is empty when submitting the form, and if so put the word EMPTY in it.

Upvotes: 1

Prasanth Bendra
Prasanth Bendra

Reputation: 32740

  1. Add your input text boxes with name as array ie, <input type="text" name="FirstName[]" />
  2. In php you can fetch them as a array. ie,

     foreach($_POST["FirstName"] as $k=>$val){
        echo $val; // give you first name
        echo $_POST["LastName"][$k]; // will give you last ame
     }
    

In this case even if one set of field is removed in HTML will not affect the php code.

Upvotes: 2

user2196037
user2196037

Reputation: 3

Inside your for loop, maybe you could try...

if ((isset($_POST["LastName$x"])) && (isset($_POST["FirstName$x"]))){
    $lastname = $_POST["LastName$x"];
    $firstname = $_POST["FirstName$x"];

     //code to save to database…

}

This will check if the variables exists before you try to do anything with them.

Upvotes: 0

cernunnos
cernunnos

Reputation: 2806

If it is possible, instead of using LastNameN and FirstNameN names try using LastName[N] and FirstName[N], this way the result is an array and you can iterate through it with a foreach, meaning you will not need the counter and the index of the value will not be important:

foreach ($_POST["LastName"] as $i=>$lastname) {
    if (!isset($_POST["FirstName"][$i])) {
        // This should only happen if someone messes with the client side before posting
        throw new Exception("Last name input does not have a related First name input");
    }   

    $firstname = $_POST["FirstName"][$i];
}

If not, then you may have to use your $counter in a different way

$current = 0;
while ($counter) { // Stop only when i found all
    if (isset($_POST["LastName$current"]) {
        $counter--;  // Found one
        $lastname =   $_POST["LastName$current"];
        $firstname = $_POST["FirstName$current"];
    }   
    $current++;
}

Upvotes: 1

Rachid O
Rachid O

Reputation: 14002

One solution would be to use the isset function like this:

$ctr = $_POST['counter']; 
for ($x = 0; $x < $ctr; $ctr++)
{

isset($_POST["LastName$x"])?$lastname = $_POST["LastName$x"]:;
isset($_POST["FirstName$x"])?$firstname = $_POST["FirstName$x"]:;

}

Upvotes: 1

Related Questions