问题描述
我目前正在网站上的编辑页面上工作,该页面从 HTML 或 PHP 文件中获取内容并将其插入到“填空”(不知道如何称呼)页面中,我可以在其中编辑内容并发布它,用新编辑的数据覆盖旧文件。我试图获取的数据包括一个表格(如下所示)以及一个无序列表和一些其他随机文本。我一直在寻找使用 file_get_contents 和 fopen(...) 执行此操作的方法,找到数据并将其插入到正确的 html 输入编辑空间中。该站点仅将数据存储在不在数据库中的文件中。有没有人对我在这种情况下可以做什么有什么建议?
表格示例
<table>
<tr><th>Ingredient</th><th>Amount</th></tr>
<tr><td>Example</td><td>Example</td></tr>
</table>
file_get_contents 的一个例子和我发现的 here 的例子,它只是从 html 文件中获取一些文本。我尝试使用表数据,但只是将其显示为一个大字符串。
<?PHP
$filetoEditPath = $_POST['editPath']; //editPath is the full path to the file
$fileEdits = file_get_contents($filetoEditPath);
$doc = new DOMDocument();
$doc->loadHTML($fileEdits);
$divs = $doc->getElementsByTagName('div');
foreach($divs as $div) {
if ($div->getAttribute('id') === 'recipe-information') {
echo $div->nodeValue;
//Alternatively if this ends up working,echo into something more like this to POST
echo "<input type='text' name='specificinstructions[]' value='" . $div->nodeValue . "'/>";
}
}
?>
我不知道我应该在几天内寻找解决方案的几个小时后尝试什么。如果这很简单,我很抱歉,我对使用 PHP 很陌生。对于更多的上下文,here 是指向另一个问题的链接,该问题概述了我正在创建的内容以及我从中获取数据的文件是如何创建的。
就像我发布这个看到建议的标签一样,用 javascript/jquery 做这件事会更容易吗?我现在将对此进行调查,但任何建议将不胜感激。
解决方法
我的建议是将数据与 HTML 标记分开存储。我认为您每次都试图解析标记以获取数据,从而使您的代码变得比它需要的要困难得多。将数据存储在文件中是可以的,只需注意竞争条件(即 2 个人同时更新文件)。出于这个原因,使用数据库会更好,但这不是必需的。或者,您可以寻找一个仅处理并发更新的 PHP 文件数据库库(我没有任何经验,因此无法推荐)。有很多方法可以将数据存储在文件中,例如CSV 或序列化或 JSON。如果数据文件只能由 PHP 打开,那么我认为序列化将是最简单的。注意:文件名不会有 php 扩展名,您可以使用 .txt、.dat 等任何内容。
阅读:$data = unserialize(file_get_contents($fileToEditPath))
存储:file_put_contents($fileToEditPath,serialize($data))
这种方法使您的数据与标记分开,在我看来这是一种很好的做法。然后您通常会使用 PHP 来生成和输出 HTML。这将允许您轻松更改输出 HTML,而不必担心您的编辑脚本是否仍然可以读取它。
,如果将来有人遇到这个问题,这就是我的结果。
//Map all $_POST arrays (from tables etc.)
$output = array_map(null,$a,$b,$c,$d);
//Write to csv
$file = fopen("path/to/file/" . $fileName. ".csv","w+");
foreach ($output as $fields) {
fputcsv($file,$fields);
}
fclose($file);
//Grab csv data and put it into editable table inputs
if (($csvfile = fopen($contentFile,'r')) !== FALSE){
while (($csvdata = fgetcsv($csvfile,1000,',')) !== FALSE){
echo '<tr>';
echo '<td><input type="text" value="' . $csvdata[0] . '"></td>';
echo '<td><input type="text" value="' . $csvdata[1] . '"></td>';
echo '</tr>';
}
}