如何使用php

时间:2016-03-21 14:54:50

标签: php html xml forms

在开始之前,请注意我对此很新。

我有一个日历,我最终希望用户能够使用PHP通过HTML表单添加,编辑和删除存储在XML文件中的事件。到目前为止,由于本网站上的提示,我已设法添加,但我很难删除。

我希望用户能够输入他们想要删除的事件的名称,以便可以在xml文件中找到并删除它。

问题在于,当我输入要删除的事件时,表单只会按照输入的相反顺序删除事件,似乎是从xml文件的底部开始的。

例如: 通过HTML表单,我输入4个事件。活动1,活动2,活动3,活动4。

假设我要删除事件2.我使用删除表单删除事件2,但事件4被删除。所以我再次尝试删除事件2,这次事件3被删除。

非常感谢任何帮助!

非常感谢。

这就是我所拥有的:

XML

        <calendar>

     <event>
     <name>Event 1</name>
     <startdate>21-3-2016</startdate>
     <enddate></enddate>
     <starttime>14.41</starttime>
     <endtime></endtime>
     </event>  

       </calendar>

HTML

<form action="remove.php" method="post" name="remove" id="calendarEdit">
<input class="calendarInput" type="text" name="name" id="name">
<input type="submit" name="button" id="button" value="Delete">
</form>

Remove.php

$name = $_POST['name'];

$xml = new DOMDocument('1.0', 'utf-8');
$xml-> load('events.xml' ) ;

$xpath = new DOMXPath($xml);

foreach ($xpath->query("/calendar/event['name']") as $node);

{
    $node->parentNode->removeChild ($node);
}

$xml->formatoutput - true;
$xml->save('events.xml');

header('Location: calendar.html');
exit();

1 个答案:

答案 0 :(得分:0)

您的代码:

foreach ($xpath->query("/monthly/event['name']") as $node);
{
    $node->parentNode->removeChild ($node);
}

你有一个拼写错误,即foreach声明末尾的分号。通过这种方式,您的代码意味着:

foreach ($xpath->query("/monthly/event['name']") as $node)
{

}
$node->parentNode->removeChild ($node);

因此,您的foreach()除了更新$node内容之外别无其他。然后,->removeChild()删除实际的$node(最后一个孩子)。

您的XPath查询也是错误的。要使用“事件1”值搜索<name>个节点,您必须创建如下模式:

/calendar/monthly/event/name[text() = "Event 1"]

请注意,模式开头的/用于从根元素开始搜索完整树,因此您必须使用完整的后代树(我从{{1开始)基于你的例子)。

如果要执行忽略元素位置的搜索,则必须使用calendar。因此,如果您想从//项目开始搜索“事件1”,那么您的模式是:

<monthly>

最后但并非最不重要:要删除“事件1”,您不需要foreach循环,只需尝试:

//monthly/event/name[text() = "Event 1"]

模式的$nodes = $xpath->query( '//monthly/event[name[text() = "Event 1"]]' ); $nodes->item(0)->parentNode->removeChild( $nodes->item(0) ); 部分表示:检索event[name[text() = "Event 1"]]元素,其中<event>子项的值为“事件1”。