在表单中发布数组时不获取数组值

I have gone through various posts but can't find a solution to this problem:

I have a form with several rows of fields to insert in a database table with one Click of the submit button. This is the code of the HTML:

    <form action="filename.php?cartID=<?php echo $_GET['cartID'];?>&amp;customer_id=<?php echo $_GET['customer_id'];?>&amp;total_count=<?php echo $_GET['total_count'];?>&amp;action=add" method="post" id="add_participants" >
    <table>
     <?php for ($i=0, $n=$_GET['total_count']; $i<$n; $i++) { ?>

       <input type="hidden" name="customer_id[]" id="customer_id[]" value="<?php echo $_GET['customer_id'];?>" />
      <input type="hidden" name="cartID[]" id="cartID[]" value="<?php echo $_GET['cartID'];?>" />
        <input type="hidden" name="products_id[]" id="products_id[]" value="<?php echo $_GET['products_id'];?>" />
        <tr><td><label for="title[]">Title</label></td><td><select id="title[]" name="title[]">
         <option value="Dr">Dr</option>
       <option value="Miss">Miss</option>
       <option value="Mr">Mr</option>
        <option value="Mrs">Mrs</option>
        <option value="Ms">Ms</option>
        <option value="Prof">Prof</option>
       </select>
       </td>
       <td><label for="firstname[]">First Name</label></td><td><input type="text" id="firstname[]" name="firstname[]"/></td>

       <td><label for="surname[]">Surname</label></td><td><input type="text" id="surnam[]e" name="surname[]"/></td>
    <td><label for="email[]">E-mail</label></td><td><input type="text" id="email[]" name="email[]"/></td></tr>
   </table>

    <?php } ?>

<input value="Add participant" type="submit" />

On the action page the code is the following:

    for ($i=0, $n=$_GET['total_count']; $i<$n; $i++) {

            $title[$i] = tep_db_prepare_input($HTTP_POST_VARS['title.$i]']);
            $firstname =tep_db_prepare_input($HTTP_POST_VARS['firstname.$i']);
            $surname =tep_db_prepare_input($HTTP_POST_VARS['surname.$i']);
            $email = tep_db_prepare_input($HTTP_POST_VARS['email.$i']);
            $customer_id = tep_db_prepare_input($HTTP_POST_VARS['customer_id.$i']);
            $cart_id = tep_db_prepare_input($HTTP_POST_VARS['cartID.$i']);
            $products_id = tep_db_prepare_input($HTTP_POST_VARS['products_id.$i']);

        $query = "INSERT INTO participants (title,Firstname,Surname,Email,customers_id,cart_id,products_id) VALUES ('$title[$i]', '$firstname[$i]', '$surname[$i]', '$email[$i]', $customers_id[$i], $cart_id[$i], $products[$i])";
            echo $query . "<br />";

    mysql_query($query) or die(mysql_error());
    }

However, I cannot get the values of the $_POST variables into the variable arrays to use in the insert statement.

Can anyone help me with this please? I have tried different permutations of the code, and I'm still not getting anywhere.

Many thanks.

I'm fairly certain that $HTTP_POST_VARS is deprecated.. you should be using $_POST instead.

Secondly, your processing doesn't really need to loop over a for loop. You could use foreach to loop over all posted values instead.

Example (untested):

foreach($_POST['customer_id'] as $key => $customerID) {
  $title     = !empty($_POST['title'][$key])     ? $_POST['title'][$key]     : "";
  $firstName = !empty($_POST['firstname'][$key]) ? $_POST['firstname'][$key] : "";
  // etc...
}

if your keeping the loop the same way, you need to make a change to how you refer to your array elements. change $title[$i] = tep_db_prepare_input($HTTP_POST_VARS['title.$i]']); to

$title[$i] = tep_db_prepare_input($_POST['title'][$i]);

and change the rest of your assignments to follow the same pattern.

The output of tep_db_prepare_input() is of course a mistery, but apart from that it's true what Marc B. says: "Learn basic PHP syntax rules"

$query = "INSERT INTO participants (title,Firstname,Surname,Email,customers_id,cart_id,products_id) VALUES ('$title[$i]', '$firstname[$i]', '$surname[$i]', '$email[$i]', $customers_id[$i], $cart_id[$i], $products[$i])"; echo $query . "
";
This will output exactly what's between the double quotes. Try using:

$query = "INSERT INTO participants (title,Firstname,Surname,Email,customers_id,cart_id,products_id) VALUES ('".$title[$i]."', '".$firstname[$i]."', '".$surname[$i]."', '".$email[$i]."', ".$customers_id[$i].", ".$cart_id[$i].", ".$products[$i].")"; echo $query . "
";

Using "{$array[$key]}" within double quotes also works, but using "$array[$key]" within double quotes does not work.

Further, $HTTP_POST_VARS is deprecated. Use $_POST

Your code has multiple errors that result in unintended values:

$title[$i] = tep_db_prepare_input($HTTP_POST_VARS['title.$i]'])

  1. foreach is definitely clearer than a for loop
  2. What others said: $HTTP_POST_VARS must be $_POST (or $_REQUEST)
  3. Assuming that your mysterious tep_db_prepare_input() functions correctly, $HTTP_POST_VARS['title.$i]'] is syntactically incorrect. Single quotes mean variables are not parsed: your function is passed the (invalid) contents of $_POST['title.$i]']. I believe you meant to write $POST["title$i"] (where the "." is part of the field name. (Personally an underscore would be less confusing as "." has meaning in PHP.)
    1. So... fix all that and you should be good to go. Well, #2 & 3, at least.