Передача переменной из элемента select в функцию обновления JSON - PHP

Я пытаюсь обновить индивидуально загруженные файлы .json в зависимости от того, какой вариант в <select> выбран. Он загружает файл .json, а затем обновляет индивидуальный файл до тех пор, пока я определяю $myFile как конкретный файл .json, например $myFile = "data/data.json";

Но когда я пытаюсь передать опцию select в качестве имени файла, ничего не сохраняется. Где я это испортил?

Вот выбор HTML:

<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>

Вот параметры, которые заполняются:

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

И вот 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: я отправляю его (с кнопкой отправки) через другую форму на той же странице с тем же действием. Эта другая форма позволяет мне изменить некоторые значения json, которые загружаются при выборе опции в первой форме. Вот как выглядит эта вторая форма:

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

Возможно, именно здесь и возникает проблема? Я решил, что подача на эту вторую форму подберет выбранную опцию в первой форме и сохранит опцию в переменной.

Ответ 1

При отправке HTML-форм браузеры публикуют только теги в тегах <form></form>.

Простое решение состоит в том, чтобы сделать все поля в одной форме или вы можете использовать Javascript для заполнения скрытого поля в фактической форме, которую вы отправляете.

Ответ 2

Попробуйте добавить кнопку отправки в родительскую форму вашего элемента select (и удалить обработчик onchange для отладки).

Как вы писали: "EDIT: я отправляю его (с кнопкой отправки) через другую форму на той же странице".

HTML-формы не могут быть вложенными, а кнопка submit представляет только прямую родительскую форму (если вы не используете некоторую магию javascript).

Примечание. Если вы действительно хотите представить поля из двух форм, посмотрите здесь:

Отправить несколько форм с помощью одной кнопки отправки

Ответ 3

Самый простой способ его отладки - это:

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

Если это так, что все работает, когда вы делаете hardcode $myFile = 'data/data.json - скорее всего, один из этих варов не держит то, что вы ожидаете от них.

Ответ 4

Я понимаю, ваш фактический HTML-код выглядит примерно так:

<form class="ui form" action="server/php/process.php" method="POST" target="frame">

    <form action="server/php/process.php" method="get">
        <select class="ui mini fluid search dropdown" id="templateSelection" type="text" name="selectTemplate" onchange="loadTemplate()">
            <option value="" selected="selected">Select Template</option>
            <option value="data.json">data.json</option>
            <option value="data2.json">data2.json</option>
            <option value="data3.json">data3.json</option>
       </select>
    </form>

<input type="submit" value="Save">
</form>

Когда вы установите method='get', вы, вероятно, увидите, что ваша кнопка отправки ничего не делает. И вот почему: Вложенные формы не допускаются в HTML. Если вы посмотрите на что-то вроде Firefox-Inspector, вы можете как браузер обрабатывает тот же самый код:

Тот же код в Firefox-Inspector

Как вы можете видеть, браузер удаляет начало вашего внутреннего <form> -tag и конца внешнего <form> -tag. В результате ваша кнопка отправки находится вне формы и поэтому бесполезна.