Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing variable from select element to JSON update function - PHP

Tags:

json

php

I'm trying to update individually loaded .json files according to whichever option in the <select> is chosen. It loads the .json file and then updates an individual file fine as long as I define $myFile as a specific .json file such as $myFile = "data/data.json";

But when I attempt to pass the select option as the filename, nothing saves. Where am I messing this up?

Here is the HTML select:

<form action="/server/php/data/process.php" method="post">
    <select class="ui mini fluid search dropdown" id="templateSelection" type="text" name="selectTemplate" onchange="loadTemplate()">
        <option value="" selected="selected">Select Template</option>
        <?php
            foreach(glob(dirname(__FILE__) . '/server/php/data/*') as $filename){
                $filename = basename($filename);
                echo "<option value='" . $filename . "'>".$filename."</option>";
            }
        ?>
   </select>
</form>

Here are the options that get populated:

<option value="data.json">data.json</option>
<option value="data2.json">data2.json</option>
<option value="data3.json">data3.json</option>

And here is process.php:

<?php

//$myFile = "data/data.json";
$filename = $_POST['selectTemplate'];
$myFile = "data/" . $filename;
$arr_data = array(); // create empty array
try
{
    //Get form data
    $formdata = array(
        'ID'=> $_POST['ID'],
        'attributeName'=> $_POST['attributeName'],
        'valueX'=> $_POST['valueX']
    );
    //Get data from existing json file
    $jsondata = file_get_contents($myFile);
    // converts json data into array
    $arr_data = json_decode($jsondata, true);
    $updateKey = null;
    foreach ($arr_data as $k => $v) {
        if ($v['ID'] == $formdata['ID']) {
            $updateKey = $k;
        }
    }
    if ($updateKey === null) {
        array_push($arr_data,$formdata);
    } else {
        $arr_data[$updateKey] = $formdata;
    }

    $jsondata = json_encode($arr_data);

    //write json data into data.json file
    if(file_put_contents($myFile, $jsondata)) {
        echo 'Data successfully saved';
    }
    else
        echo "error";
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
?>

EDIT: I'm submitting it (with a submit button) via another form on the same page with the same action. This other form allows me to change some of the values of the json that is loaded when an option in the first form is selected. Here is what this second form looks like:

<form class="ui form" action="server/php/process.php" method="POST" target="frame"> .... <input type="submit" value="Save"> </form>

Perhaps that is where the issue is coming from? I figured a submit on this 2nd form would pick up the selected option in the first form and store the option in a variable.

like image 348
Todd Williams Avatar asked Dec 27 '17 23:12

Todd Williams


3 Answers

When submitting HTML forms, browsers only post fields within the <form></form> tags.

Easy solution is to make all the fields under one form, or you can use Javascript to populate a hidden field on the actual form you are submitting.

like image 200
Heinrich Lee Yu Avatar answered Dec 14 '22 23:12

Heinrich Lee Yu


The easiest way to debug it would be this:

var_dump($_POST);
$filename = $_POST['selectTemplate'];
var_dump($filename);
$myFile = "data/" . $filename;
var_dump($myFile);
$arr_data = array(); // create empty array

If it's the case that everything works when you hardcode $myFile = 'data/data.json - most probably one of those vars are not holding what you would expect them to hold.

like image 37
Grzegorz Avatar answered Dec 15 '22 00:12

Grzegorz


Try adding the submit button within the parent form of your select element (and remove the onchange handler for debugging).

As you wrote: "EDIT: I'm submitting it (with a submit button) via another form on the same page".

HTML-forms can not be nested and a submit button submits only the direct parent form (unless you use some javascript magic).

Note: In case you really want to submit the fields of 2 forms, have a look here:

Submit multiple forms with one submit button

like image 25
michael - mlc Avatar answered Dec 15 '22 00:12

michael - mlc