2015-04-01 53 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請求包含所有預期的變量
  • ...驗證變量包含你的罰款處理
  • 值...檢查,如果確實有在所有
  • 請求
  • ...。