如何解决PHP XML 保存对单个项目的更改
我正在尝试创建一个带有按钮更新的简单网页。按钮的状态显示给用户,但我不想将数据库用于这么小的事情。我正在尝试使用 XML 解析。我非常接近正确,但它似乎没有将我的更改保存到 xml 文件中。我一直在使用 var dump 并且得到了我期望的输出。我对 PHP 不是最好的,即使有朋友帮助我,我们也迷路了。
$( ".switch" ).click(function() {
var id =$(this).attr("id");
if( $(this).hasClass("on")){
$(this).removeClass("on");
$(this).addClass("off");
$.get("API.PHP?"+ id + "=off");
}else if( $(this).hasClass("off")){
$(this).removeClass("off");
$(this).addClass("on");
$.get("API.PHP?"+ id + "=on");
}
});
XML 数据.xml
<switches>
<switch>
<name>Phase Two Side Door</name>
<id>phasetwosidedoor</id>
<state>on</state>
</switch>
<switch>
<name>WIFI</name>
<id>wifi</id>
<state>on</state>
<timestamp> </timestamp>
</switch>
</switches>
<?PHP
/*
get from jq asks for this info
finds the item and returns value
*/
$switches = simplexml_load_file('data.xml');
//var_dump($switches);
echo $switches->count();
for( $i = 0; $i < $switches->count(); $i++){
$item = $switches->switch[$i];
//var_dump($item->id == "wifi" && isset($_GET["wifi"]));
//var_dump($item->id == "phasetwosidedoor" && isset($_GET["phasetwosidedoor"]));
//var_dump( $switches->switch[$i]);
echo $i;
if($item->id == "wifi" && isset($_GET["wifi"])){
$item->state = $_GET["wifi"];
//var_dump($_GET["wifi"]);
}
else if($item->id == "phasetwosidedoor" && isset($_GET["phasetwosidedoor"])){
$item->state = $_GET["phasetwosidedoor"];
}else{
echo "data error :(";
}
}
$switches->asXML("data.xml");
/*
loading xml
changing xml
saving xml
*/`enter code here`
?>
没有 500 错误,我所有的调试都是正确的。我需要用简单的 xml 保存。
解决方法
它可能不会让您感到惊讶。但是你不能用简单的xml写文件。简单 XML 是只读 API。以下解决方案可能更有效一些,因为您不必遍历已找到元素的节点列表。
<?php
// contains the state of the switch (on/off)
$state = $_GET['state'];
// contains the id of the switch
$id = $_GET['id'];
$doc = new DOMDocument();
$doc->load('switches.xml');
$xpath = new DOMXPath($doc);
$elements = $xpath->query('switch[id/text()="' . $name . '"]/state');
if ($elements->length > 0) {
$elements->item(0)->nodeValue = $state;
}
$string = $doc->save('switches.xml');
使用 DOMDocument
类加载 xml 文件。之后,我使用 DOMXpath
类通过其 ID 查询请求的开关。如果在 xml 中找到开关,我们设置新状态并将其再次保存为文件。更少的代码。更有效。
如您所见,我使用了两个 GET 参数。参数 id
定义请求的开关。参数 state
定义了请求开关的新状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。