1

I have a PHP form that pulls data from the database, prints it out in rows, and then allows the user to check which items they need. On save, only the very last option is being sent through to $_POST. Here's my code:

global $dbc; 

$afQuery = "SELECT fid, facility_name, city, state, country, phone from facilities 
            WHERE uid = '123'
            AND fid != '456'
            GROUP BY fid;";
        $afResult = $dbc->query($afQuery,__FILE__,__LINE__);
        $i = 0;
        while ($affiliated = $dbc->fetch($afResult)) {      
            ++$i;
            echo '<div class="action" style="float:left;">';
                echo '<input type="checkbox" name="affiliated[afid]" id="afid" value="'.$affiliated->fid.'">';
            echo '</div>';
            echo '<div class="facility-name">';
                echo '<input type="hidden" id="facility-name '.$i.'" name="affiliated[facility_name]" value="'.$affiliated->facility_name.'" />';
                echo $affiliated->facility_name;
            echo '</div>';
            echo '<div class="facility-location">';
                echo '<input type="hidden" id="facility-location '.$i.'" name="affiliated[facility_location]" value="'.$affiliates->city. ', ' . $affiliated->state . ' ' . $affiliated->country.'" />';
                echo $affiliated->city. ', ' . $affiliated->state . ' ' . $affiliated->country;
            echo '</div>';
            echo '<div class="facility-phone">';
                echo '<input type="hidden" id="facility-phone '.$i.'" name="affiliated[facility_phone]" value="'.$affiliated->phone.'" />';
                echo $affiliated->phone;
            echo '</div>';
            echo '<div class="clear"></div>';
            echo '<input type="hidden" id="update" name="update" value="' . $affiliated->fid . '" />';
        }

$dbc->fetch is equivalent to mysql_fetch_assoc.

I am trying to save these values to the $affiliated array, but it should have sub-arrays for each selected item, so I can store each value in the database on a separate row. Where am I missing it? I tried a foreach within the while loop, but I got nowhere with that.

Thanks for your help!

* UPDATE *

I have followed @Pinetree's suggestion and added $i like so:

<input type="checkbox" name="affiliated[afid]['.$i.']" id="afid" value="'.$affiliated->fid.'">

However, now I receive the following output:

Array
(
    [afid] => Array
        (
            [1] => 5289
            [2] => 5290
            [3] => 5291
            [4] => 5292
        )

    [facility_name] => Array
        (
            [1] => Test Company
            [2] => Test Company 2
            [3] => Test Company 3
            [4] => Test Company 4
        )

    [facility_location] => Array
        (
            [1] => Address, State US
            [2] => Address, State US
            [3] => Address, State US
            [4] => Address, State US
        )

    [facility_phone] => Array
        (
            [1] => 555-555-5555
            [2] => 555-555-5555
            [3] => 555-555-5555
            [4] => 555-555-555
        )

)

I need this to instead look like this so I can insert each complete row into a table in the database:

Array
    (
        [0] => Array
            (
                [afid] => 5289
                [facility_name] => Test Company
                [facility_location] => Address, ST USA
                [facility_phone] => 555-555-5555
            )

    [1] => Array
        (
            [afid] => 5290
            [facility_name] => Test Company 1
            [facility_location] => Address, ST USA
            [facility_phone] => 555-555-5555
        )
)

Suggestions?

3
  • Oi, I'd suggest you consider heredoc syntax when echoing out big chunks of HTML like that: php.net/manual/en/… Commented Aug 14, 2012 at 21:25
  • Interesting - thanks for the link! Commented Aug 15, 2012 at 19:00
  • I think you should accept Pinetree's answer and ask a separate question about how to create an array - he clearly solved your initial issue. Commented Aug 15, 2012 at 22:32

2 Answers 2

3

If I understood correctly, you are echoing multiple rows of inputs. If that is the case, you are using the same name for the inputs of each row. When the post happens, it will only take the last value. You could add another "[]" to each input name:

'<input name="affiliated[afid][]"/>'

or even put the $i in it:

'<input name="affiliated[afid]['.$i.']"/>'

In the post you'd then have:

affiliated
    afid
        1: val
        2: val
        3: val
        ...
    facility_name
        1: val
        2: val
        3: val
        ...
    ...

the integers correspond to the row in the original form. So afid[1] and facility_name[1] are from the same row in the form (and table)

EDIT: To get the arrays back to the format they had in the form:

$affiliated = array();
foreach($_POST['affiliated']['afid'] as $k => $v) {
    $affiliated[] = array(
        'afid' => $v,
        'facility_name' => $_POST['affiliated']['facility_name'][$k] // same key here
         // other fields
    );
}

IMPORTANT EDIT:

Since you have checkboxes, be sure to explicitly set an index int the input name:

'<input name="affiliated[afid]['.$i.']"/>'

As checkboxes are not posted if not checked, and text fields and similar are, you could end up with a situation, for instance, the second POSTED checkbox (index 1 if starting from 0) will map to the second row in the $_POST, but the checkbox was actually on the third or fourth row in the form itself and the checkboxes before that one were not posted

Sign up to request clarification or add additional context in comments.

5 Comments

I think this could work. Will $_POST still only get the last value?
$_POST did get all of the values. However, now I have to figure out how to get that data into the right array.
what I usually do is choose one value (like the afid) and foreach through that using both the key and the value, then you can get to other values using the same key. I've added an edit to show the code.
Ok, I'm not sure how to get this to work. Whether I put the code inside the while or outside of it, I get an invalid foreach error. I originally started out with a foreach loop to get those values and had to switch to while to get the rows to print out. I have been unsuccessful in combining the two.
Okay, finally got this working. I had to move the foreach to my save function and set $this->affiliated = $affiliated. Works! Thanks so much!
1

$affiliated is not an array, it's a an object and you're (re)setting it each time through your loop:

while ($affiliated = $dbc->fetch($afResult)){...}

Also, input and in general DOM element IDs cannot contain spaces, which you're generating:

echo '<input type="hidden" id="facility-name '.$i.'"

1 Comment

Thanks for this information, but unfortunately it doesn't help solve the problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.