【发布时间】: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()" 有什么作用?它有可能与选择的选项值混淆吗?