2015-04-01 61 views
0

我是DOMDocument和密集型PHP的新手。请原谅我的无知。我似乎不能让Process.php写入XML。我见过关于同一主题的其他帖子,但他们没有帮我解决我的问题。只是找不到我做错了什么。任何帮助将非常感激!HTML表单到PHP XML DOMDocument - 不更新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."; 

?> 
+0

和究竟是什么问题?你没有描述它。请阅读我们的帮助部分,了解如何创建MCVE (http://stackoverflow.com/help/mcve)并将其添加到您的问题中。 您将以这种方式从社区获得更快,更好的帮助。 – ochi 2015-04-01 19:50:22

+0

我的服务器管理员更新了权限。现在它可以保存,但保存除第一条XML行之外的空文件。我难倒了。 – 2015-04-01 20:10:44

+0

@ochi,不知道我在创建一个MCVE时需要帮助,因为我的后续评论指出:“我的服务器管理员更新了权限,现在可以保存,但它保存了一个空文件,除了第一条XML线以外,我陷入了困境。不知道如何解释清楚,但我会尝试。上面的文件一旦被授权写入服务器,只会用第一行更新XML文件,而不是其他任何东西。 – 2015-04-08 19:27:15

回答

0

一些更基本的问题与您的代码被发现:

  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请求包含所有预期的变量
  • ...验证变量包含你的罚款处理
  • 值...检查,如果确实有在所有
  • 请求
  • ...。