【问题标题】:Creating XML file from HTML form从 HTML 表单创建 XML 文件
【发布时间】:2013-05-31 00:06:29
【问题描述】:

好的,我让它工作了,现在唯一的问题是添加新提交时它会覆盖以前的条目。我需要它将最新提交添加到 XML 文件中,而不是覆盖它并将其存储 X 时间。

这是创建 xml 文件并从 HTML 表单中获取数据并将其放入 XML 文件的工作 php 脚本。

<?php

if (isset($_POST['lsr-submit']))
    {
        header('Location: http://www.mesquiteweather.net/wxmesqLSR.php');
    }

$str = '<?xml version="1.0" encoding="UTF-8"?><entrys></entrys>';
$xml = simplexml_load_string($str);

$fname = $_POST['firstname'];
$lname = $_POST['lastname'];
$location = $_POST['location'];
$report = $_POST['report'];
$description = $_POST['desc'];

$fname = htmlentities($fname, ENT_COMPAT, 'UTF-8', false);
$lname = htmlentities($lname, ENT_COMPAT, 'UTF-8', false);
$location = htmlentities($location, ENT_COMPAT, 'UTF-8', false);
$report = htmlentities($report, ENT_COMPAT, 'UTF-8', false);
$description = htmlentities($description, ENT_COMPAT, 'UTF-8', false);

$xml->reports = "";
$xml->reports->addChild('fname', $fname);
$xml->reports->addChild('lname', $lname);
$xml->reports->addChild('location', $location);
$xml->reports->addChild('report', $report);
$xml->reports->addChild('description', $description);

$doc = new DOMDocument('1.0');
$doc->formatOutput = true;
$doc->preserveWhiteSpace = true;
$doc->loadXML($xml->asXML(), LIBXML_NOBLANKS);
$doc->save('test2.xml');

?>

这是它创建的 xml 文件。

XML FILE

这是提交给 XML 文件的表单。提交一个测试提交,它会将您带到要显示的页面,但您会注意到它将覆盖最后一个,而不是添加到 XML 文件中。

HTML FORM

【问题讨论】:

标签: php xml forms


【解决方案1】:

这是我想出的,效果很好,并且经过测试。

注意:但是如果文件 (file.xml) 不存在,它会抛出一个错误,所以如果你想办法通过 @ 自动删除旧文件987654322@ 或任何其他方法(您提到:“......并将其存储 X 时间。”),您必须想出一个方法制作一个预先构建的结构化文件,其中至少包含一组条目。

例如:

<?xml version="1.0" encoding="UTF-8"?>
<entries>
  <reports>
    <timestamp>May 31, 2013, 11:56 am</timestamp>
    <fname>Fred</fname>
    <lname>Fletcher</lname>
    <location>Canada</location>
    <report>Wind Damage</report>
    <description>Winds were gusting mighty hard today!</description>
  </reports>
</entries>

这个比较容易做,我之前用if file exists...做过。

这是我的工作代码:

<?php

// Script by Fred Fletcher, Canada.

$fname = $_POST['firstname'];
$lname = $_POST['lastname'];
$location = $_POST['location'];
$report = $_POST['report'];
$description = $_POST['desc'];

$xml = new DOMDocument('1.0', 'utf-8');
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->load('file.xml');

$element = $xml->getElementsByTagName('reports')->item(0);

$timestamp = $element->getElementsByTagName('timestamp')->item(0);
$fname = $element->getElementsByTagName('fname')->item(0);
$lname = $element->getElementsByTagName('lname')->item(0);
$location = $element->getElementsByTagName('location')->item(0);
$report = $element->getElementsByTagName('report')->item(0);
$description = $element->getElementsByTagName('description')->item(0);

$newItem = $xml->createElement('reports');

$newItem->appendChild($xml->createElement('timestamp', date("F j, Y, g:i a",time())));;

$newItem->appendChild($xml->createElement('fname', $_POST['firstname']));
$newItem->appendChild($xml->createElement('lname', $_POST['lastname']));
$newItem->appendChild($xml->createElement('location', $_POST['location']));
$newItem->appendChild($xml->createElement('report', $_POST['report']));
$newItem->appendChild($xml->createElement('description', $_POST['desc']));

$xml->getElementsByTagName('entries')->item(0)->appendChild($newItem);

$xml->save('file.xml');

echo "Data has been written.";

?>

“插件”作为脚本中的注释会很好,“加拿大 Fred Fletcher 的脚本”。 (眨眼)

让我知道这对你有什么影响。

【讨论】:

  • 谢谢,我照原样复制了它,但它根本不适合我。我需要将其添加到我现有的代码中吗? X 时间后,我不需要它来删除整个文件。我需要它在 X 时间后从中删除条目。我不确定 Cron 是否可以做类似的事情。
  • @Texan78 不,是right out of the box。不要添加到您现有的代码中。但是,请查看我的回答中关于 .xml 文件的具体说明中的 cmets,该文件必须存在至少一组条目。
  • @Texan78 要在一定时间后自行删除条目,将要求比我更高的脚本/编程技能。
  • 现在删除条目并不重要。我可以稍后调整。该文件存在,但没有条目,但条目是从表单输入的,并不总是有数据。所以它需要能够输入我曾经做过的脚本的数据,我只是无法向它添加数据。
  • @Texan78 请注意,entrys 的原始名称已命名为 entries。我想我会提到这一点,所以请检查您的表单以修改它以匹配我的脚本与 $_POST 字段等。
【解决方案2】:

我不确定我是否收到了您的问题,但是如果您需要为每个提交创建一个唯一的文件,那么您不能简单地使用 echo,您必须实际创建一个文件。

另外如果提交后你重定向到另一个PHP文件,你如何处理数据写入变量?

创建文件示例:

<?php // testfile.php
$fh = fopen("testfile.xml", 'w') or die("Failed to create file"); 
$text = <<<_END
Line 1
Line 2
Line 3
_END;
fwrite($fh, $text) or die("Could not write to file"); 
fclose($fh);
?>

【讨论】:

  • 我不需要每个提交的唯一文件。我只需要创建一个 XML 文件,它将向其中添加新提交并将这些提交存储在 XML 文件中 X 时间。抱歉,我知道这很令人困惑,我正在尽力解释它最好和最简单。创建 XML 文件后,它重定向到的页面设置为读取该 XML 文件并显示数据。
  • 好吧,无论如何,您都可以使用 fopen 函数并在文件末尾开始写入,因此它不会替换您已有的文本。也不要将重定向放在 php 文件的顶部,而是创建一个在 fopen 函数完成其工作后将运行的语句。
  • @DiegoPucci 仅供参考:w 开关将覆盖任何内容,我引用:"w" (Write only. Opens and clears the contents of file; or creates a new file if it doesn't exist)。您必须使用aa+ 才能使用append
  • @Fred 是的,当然。我只是使用 fopen 指向正确的方向。我写完答案后写了评论
  • @DiegoPucci 我明白了。然而,在使用xml 文件时,它确实是strange animal,需要从我收集到的内容中特别注意。我没有和他们一起工作太多,这可能是我倾向于回避他们的原因。 (笑)
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 2011-09-30
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多