【问题标题】:Passing variable from select element to JSON update function - PHP将变量从选择元素传递到 JSON 更新函数 - PHP
【发布时间】:2018-06-08 13:08:16
【问题描述】:

我正在尝试根据<select> 中选择的任何选项更新单独加载的.json 文件。只要我将$myFile 定义为特定的.json 文件,例如$myFile = "data/data.json";,它就会加载.json 文件,然后更新单个文件。

但是当我尝试将选择选项作为文件名传递时,没有任何保存。我在哪里搞砸了?

这里是 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";
}
?>

编辑:我正在通过同一页面上的另一个表单以相同的操作提交它(使用提交按钮)。这种另一种形式允许我更改在选择第一种形式中的选项时加载的 json 的一些值。这是第二种形式的样子:

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

也许这就是问题的来源?我认为在第二个表单上提交会选择第一个表单中的选定选项并将该选项存储在一个变量中。

【问题讨论】:

  • 我认为无法修改数据的原因是保存文件的路径错误。我假设 php 脚本甚至无法通过 $myFile 的路径读取 json 内容,可以吗?此外,请检查文件权限以进行写访问。
  • 我将不得不测试它是否可以从$myFile读取数据。我知道我确实有写权限,因为如果我取消注释 $myFile = "data/data.json";,我可以覆盖 json 文件
  • 当我用$filename = $_POST['selectTemplate']; $myFile = "data/" . $filename;替换$myFile = "data/data.json";时问题就来了
  • 您应该检查使用浏览器的开发工具发布的内容。
  • 如果你通过 sumit 按钮提交,onchange="loadTemplate()" 有什么作用?它有可能与选择的选项值混淆吗?

标签: php json


【解决方案1】:

提交 HTML 表单时,浏览器仅发布 &lt;form&gt;&lt;/form&gt; 标记内的字段。

简单的解决方案是将所有字段放在一个表单下,或者您可以使用 Javascript 在您提交的实际表单上填充隐藏字段。

【讨论】:

  • 但问题清楚地表明选择在表单标签内。
  • 他说select在一个form标签里面,但是submit按钮在另一个form标签里
【解决方案2】:

尝试在您的选择元素的父表单中添加提交按钮(并删除 onchange 处理程序以进行调试)。

正如你所写: “编辑:我正在通过同一页面上的另一个表单提交它(带有提交按钮)”。

HTML 表单不能嵌套,提交按钮仅提交直接父表单(除非您使用一些 javascript 魔术)。

注意:如果您真的想提交 2 个表单的字段,请看这里:

Submit multiple forms with one submit button

【讨论】:

    【解决方案3】:

    调试它的最简单方法是:

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

    如果在您硬编码 $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 之类的东西,您可以了解浏览器如何处理完全相同的代码:

      如您所见,浏览器会删除内部&lt;form&gt;-tag 的开头和外部&lt;form&gt;-tag 的结尾。结果,您的提交按钮在表单之外,因此毫无用处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-16
        • 1970-01-01
        • 2011-09-15
        • 2014-01-25
        • 2014-03-14
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        相关资源
        最近更新 更多