Recognising dynamic form fields in PHP

Hi there, I have a form that contains an unknown number of dynamic fields in the format shown below, I would like to know how to group together the fields with the same id in PHP and loop through them so I can add each row to the database. An example of how to do this would be great thanks!


<div id='1'>
<label for='title1'>
<span class='label'>Name</span>
<input name='title1' type='text' id='title1' />
 
</label><label for='importance1'>
<span class='label'>Importance:</span>
<select id='importance1' name='importance1' size='1'>
<option value='primary'>Primary</option>
<option value='secondary'>Secondary</option>
<option value='optional'>Optional</option>
</select>
</label>
 
<label for='description1'>
<span class='label'>Description:</span><
textarea name='description1' id='description1'>
</textarea>
</label>
</div>
 
<div id='2'>
<label for='title2'>
<span class='label'>Name</span>
<input name='title2' type='text' id='title2' />
 
</label><label for='importance2'>
<span class='label'>Importance:</span>
<select id='importance2' name='importance2' size='1'>
<option value='primary'>Primary</option>
<option value='secondary'>Secondary</option>
<option value='optional'>Optional</option>
</select>
</label>
 
<label for='description2'>
<span class='label'>Description:</span><
textarea name='description2' id='description2'>
</textarea>
</label>
</div>
 
and so on...

Open in new window

cookiejestAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

flob9Commented:
<input name='title[1]' type='text' id='title1' />

[...]

<input name='title[2]' type='text' id='title2' />

etc

you will get:
$_POST =
Array
(
    [title] => Array
        (
            [1] => 123
            [2] => 456
        )

)
0
ajkhalifaCommented:

The best easy way is to make the id of the field as a combination of name and number, like this:
<input name='phone_1' type='text' />
<input name='phone_2' type='text' />
<input name='phone_3' type='text' />
<input name='phone_4' type='text' />

and then in the action page:
$phones_arr=array();
for($i=1;1;$i++){
           if(!isset($_POST['phone_'.$i])
                      break;
           $phones[]=$_POST['phone_'.$i];
}
print_r($phones_arr);
0
flob9Commented:
ajkhalifa>

<input name='phone[1]' type='text' />
<input name='phone[2]' type='text' />
<input name='phone[3]' type='text' />
<input name='phone[4]' type='text' />

$phones_arr = $_POST['phone'];
0
Big Business Goals? Which KPIs Will Help You

The most successful MSPs rely on metrics – known as key performance indicators (KPIs) – for making informed decisions that help their businesses thrive, rather than just survive. This eBook provides an overview of the most important KPIs used by top MSPs.

SaWeyCommented:
You can use this:
$result = array();
foreach($_POST as $name => $value){
    if(substr($name, 0, 5) == 'title'){
        $result[substr($name, 5)]['title'] = $value;
    }elseif(substr($name, 0, 10) == 'importance'){
        $result[substr($name, 10)]['importance'] = $value;
    }elseif(substr($name, 0, 11) == 'description'){
        $result[substr($name, 11)]['description'] = $value;
    }
}
echo '<pre>';
print_r($result);
echo '</pre>';

Open in new window

0
cookiejestAuthor Commented:
hmm im not sure i understand, how would I group together all the fields for a given ID and loop through them though? I would like to use the array like so : title[]
0
flob9Commented:
Let's claify my proposition :


<?php
	if(isset($_POST['title']))
	{
		foreach($_POST['title'] as $id => $title)
		{
			echo "Title $id = $ti <br/>";
	        echo "Importance $id = ".$_POST['importance'][$id]." <br/>";
	        echo "Description $id = ".$_POST['description'][$id]." <br/>";
		}
	}
  
?>
<form method="post">
<div id='1'>
<label for='title1'>
<span class='label'>Name</span>
<input name='title[1]' type='text' id='title1' />
 
</label><label for='importance1'>
<span class='label'>Importance:</span>
<select id='importance1' name='importance[1]' size='1'>
<option value='primary'>Primary</option>
<option value='secondary'>Secondary</option>
<option value='optional'>Optional</option>
</select>
</label>
 
<label for='description1'>
<span class='label'>Description:</span><textarea name='description[1]' id='description1'>
</textarea>
</label>
</div>
 
<div id='2'>
<label for='title2'>
<span class='label'>Name</span>
<input name='title[2]' type='text' id='title2' />
 
</label><label for='importance2'>
<span class='label'>Importance:</span>
<select id='importance2' name='importance[2]' size='1'>
<option value='primary'>Primary</option>
<option value='secondary'>Secondary</option>
<option value='optional'>Optional</option>
</select>
</label>
 
<label for='description2'>
<span class='label'>Description:</span><textarea name='description[2]' id='description2'>
</textarea>
</label>
</div>
 
<input type="submit" />
</form>

Open in new window

0
rg20Commented:
HTML title alone without a subscript will give you a comma delimited string.  

On the next page a split function will give you an array.
0
flob9Commented:
sorry typo :

echo "Title $id = $ti <br/>"; => echo "Title $id = $title <br/>";
0
ajkhalifaCommented:
The very basic way is to make the id of the field as a combination of name and number, like this:
-------------------------------------------------------------------------
<input name='title_1' type='text' />
<input name='title_2' type='text' />
<input name='title_3' type='text' />
<input name='title_4' type='text' />
-------------------------------------------------------------------------
and then in the action page:
-------------------------------------------------------------------------
$titles_arr=array();
for($i=1;1;$i++){
           if(!isset($_POST['title_'.$i])
                      break;
           $titles[]=$_POST['title_'.$i];
}
print_r($titles_arr);
-------------------------------------------------------------------------
0
flob9Commented:
ajkhalifa> It makes no sense to do this since php already handle the name="identifier[id]" and give it in a post array.

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
cookiejestAuthor Commented:
flob I would like to use your method and I beleive that I have implemented it correctly but for some reason nothing is being passed through post... Is there any reason why dynamic fields would not be passed on submit through post? I have attached my full code below:
<script type="text/javascript">
function addFormField() {
	var id = document.getElementById("id").value;
		id = (id - 1) + 2;
		
	$("#requirementsrows").append("<div id='" + id + "'><label for='title" + id + "'><span class='label'>Name</span><input name='title[" + id + "]' type='text' id='title" + id + "' /></label><label for='importance" + id + "'><span class='label'>Importance:</span><select id='importance" + id + "' name='importance[" + id + "]' size='1'><option value='primary'>Primary</option><option value='secondary'>Secondary</option><option value='optional'>Optional</option></select></label><label for='description" + id + "'><span class='label'>Description:</span><textarea name='description[" + id + "]' id='description" + id + "'></textarea></label><br /><a href='#' onClick='removeFormField(\"#" + id + "\"); return false;'>Remove</a></div>");
 
	
	document.getElementById("id").value = id;
}
 
function removeFormField(id) {
	$(id).remove();
}
 
</script>
<?php include('header.php'); ?>
<p><a href="#" onClick="addFormField(); return false;">Add Requirement</a></p>
 
<form action="requirements.php" method="post" id="form1">
<fieldset>
<input type="hidden" id="project" value="<?php echo $_POST['q']; ?>">
<input type="hidden" id="id" value="0">
<div id ="requirementsrows"></div>
</fieldset>
<input name="submit" type="submit" />
</form>

Open in new window

0
cookiejestAuthor Commented:
Here is an easier to read layout of the form with the javascript:
<div id='" + id + "'>
<label for='title" + id + "'>
<span class='label'>Name</span>
<input name='title[" + id + "]' type='text' id='title" + id + "' />
 
</label><label for='importance" + id + "'>
<span class='label'>Importance:</span>
<select id='importance" + id + "' name='importance[" + id + "]' size='1'>
<option value='primary'>Primary</option>
<option value='secondary'>Secondary</option>
<option value='optional'>Optional</option>
</select>
</label>
 
<label for='description" + id + "'>
<span class='label'>Description:</span><
textarea name='description[" + id + "]' id='description" + id + "'>
</textarea>
</label>
<br />
<a href='#' onClick='removeFormField(\"#" + id + "\"); return false;'>Remove</a></div>

Open in new window

0
flob9Commented:
use this php debug line at the beginning of the file :

print_r($_POST);
0
rg20Commented:
Why not this

<input name='title' type='text' id='title" + id + "' />

In the next page, you will

array split ( title,"," )

This will give you a title array where you could use the index to associate the related fields;
0
cookiejestAuthor Commented:
The title array seems to pass correctly when I do print_r($_POST['title']); However the foreach does not seem to work?!
0
cookiejestAuthor Commented:
Ah ive managed to fix it, it was a silly error on my behalf, thank you for the help!
0
rg20Commented:
What was the fix?
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
PHP

From novice to tech pro — start learning today.