【问题标题】:Html form to PHP XML DOMDocument - Not Updating XMLHtml 表单到 PHP XML DOMDocument - 不更新 XML
【发布时间】:2015-04-01 19:32:54
【问题描述】:

我是 DOMDocument 和密集 PHP 的新手。请原谅我的无知。我似乎无法让 Process.php 写入 XML。我看过其他关于同一主题的帖子,但它们并没有帮助我解决我的问题。只是找不到我做错了什么。任何帮助将不胜感激!

这是 HTML 表单 form.html。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>
<body>
<form name="digitalsignage" action="process.php" onsubmit="return defaultagree(this)" method="post">
<table align="center" cellpadding="2" cellspacing="0" width="50%">
  <tbody><tr>
    <td> Event1:</td><td>
<input name="event1" value="Unknown" type="text">    </td>
    <td> Event2:</td><td>
<input name="event2" value="Unknown" type="text">    </td>
    <td> Event3:</td><td>
<input name="event3" value="Unknown" type="text">    </td>
    <td> Event4:</td><td>
<input name="event4" value="Unknown" type="text">    </td>
    <td> Event5:</td><td>
<input name="event5" value="Unknown" type="text">    </td>
  </tr>
  <tr>
     <td colspan="4" style="text-align:center;">
<input name="lsr-submit" value="Submit" type="submit"></td>
  </tr>
</tbody></table>
</form>
</body>
</html>

XML 文件,file.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="http://www.SERVER-URL-OF-FEED" rel="self" type="application/rss+xml" />
<title>Todays Events</title>
<item>
  <description>
        <event1>Event 1</event1>
        <event2>Event 2</event2>
        <event3>Event 3</event3>        
        <event4>Event 4</event4>
        <event5>Event 5</event5>
  </reports>
</item>
</channel>
</rss>

PHP,process.php

<?php

$event1 = $_POST['event1'];
$event2 = $_POST['event2'];
$event3 = $_POST['event3'];
$event4 = $_POST['event4'];
$event5 = $_POST['event5'];

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

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

if ($element->length > 0) {

    $event1 = $element->getElementsByTagName('event1')->item(0);
    $event2 = $element->getElementsByTagName('event2')->item(0);
    $event3 = $element->getElementsByTagName('event3')->item(0);
    $event4 = $element->getElementsByTagName('event4')->item(0);
    $event5 = $element->getElementsByTagName('event5')->item(0);

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

    $newItem->appendChild($xml->createElement('event1', $_POST['event1']));
    $newItem->appendChild($xml->createElement('event2', $_POST['event2']));
    $newItem->appendChild($xml->createElement('event3', $_POST['event3']));
    $newItem->appendChild($xml->createElement('event4', $_POST['event4']));
    $newItem->appendChild($xml->createElement('event5', $_POST['event5']));

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

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

echo "Data has been written.";

?>

【问题讨论】:

  • 究竟是什么问题?你不描述它。请阅读我们的帮助部分,了解如何创建 MCVE (stackoverflow.com/help/mcve) 并将其添加到您的问题中。这样,您将从社区获得更快、更好的帮助。
  • 我的服务器管理员更新了权限。现在它保存了,但它保存了一个空文件,除了第一个 XML 行。我很难过。
  • @ochi,我不确定我是否需要帮助创建 MCVE,因为我在下面指出的后续评论指出“我的服务器管理员更新了权限。现在它保存但它保存了一个空文件,除了第一个XML 行。我很难过。”不知道如何解释得更清楚,但我会尝试。上面的文件,一旦被授权写入服务器,只更新第一行的 XML 文件,没有其他内容。
  • 既然您在 PHP 文件的开头有这个 $event1 = $_POST['event1'];,那么在构建 xml 时再次使用这个 $newItem-&gt;appendChild($xml-&gt;createElement('event1', $_POST['event1'])); 是否有意义?还是应该改成$newItem-&gt;appendChild($xml-&gt;createElement('event1', $event1));

标签: php html xml domdocument


【解决方案1】:

在您的代码中发现一些更基本的问题:

  1. 没有错误处理。这是真正要照顾的事情。您的代码是带着“最良好的祝愿”编写的,并希望一切正常。实际上,那是什么时候?所以是的,生产代码需要错误处理。当您发现代码示例时请注意,这些示例通常是示例,并且不关注错误处理,因此您需要自己添加。尽早添加错误处理 (fail early, fail often, fail fast)
  2. 代码重复。如果你看一下你的例子,很明显有很多冗余。对于纯粹的示例,如果您拥有一个字段或五个字段,则没有区别。在 Stackoverflow 上发帖要求您将示例最小化到尽可能少地询问问题。你违反了那份合同。但这并不是让您更难在 Stackoverflow 上提出问题,这是从您自己的代码中删除冗余的一个好点。花点时间在这里提出问题,作为从不同角度审查代码的机会,因为您需要制定一个更独立的问题。您甚至可以通过这样做自己解决问题。这是一个好兆头。

$result = $xml->save('file.xml');
if (!$result) {
    throw new UnexepectedValueException(
       'Failed to write file "file.xml"'
    );
}

echo "\n<hr>\nthe following file has been written:\n<hr>\n";
echo nl2br(htmlspecialchars($xml->saveXML())), "\n<hr>\n";

想像尽可能多的可能性,以使您的代码可见并“证明”您的代码正常工作,并尽早显示错误。

你可以...

  • ...在写入之前测试一个文件是否可写为可访问
  • ...验证写入磁盘的 XML 格式正确
  • ...验证 HTTP POST 请求是否包含所有预期变量
  • ...验证变量是否包含您可以处理的值
  • ...检查是否真的有请求
  • ... .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2012-05-06
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多