Php 在DOM搜索字符串中插入[$\u POST]var?

Php 在DOM搜索字符串中插入[$\u POST]var?,php,simplexml,nodes,Php,Simplexml,Nodes,我不确定我是否正确命名了该标题,但基本上我有一个来自$\u POST(一个乐队的名称)的变量,我想在这样一行中插入它来代替节点的名称- $lastvisits = $address->$band->getElementsByTagName("lastvisit"); 其中,$band为 $band = $_POST['band'] 因为$address中的节点实际上可以是任何名称,并且可能不存在。 我肯定有一个简单的方法,但我不确定格式 如果它存在或不存在,$lastvisits

我不确定我是否正确命名了该标题,但基本上我有一个来自$\u POST(一个乐队的名称)的变量,我想在这样一行中插入它来代替节点的名称-

$lastvisits = $address->$band->getElementsByTagName("lastvisit");
其中,
$band

$band = $_POST['band']
因为$address中的节点实际上可以是任何名称,并且可能不存在。 我肯定有一个简单的方法,但我不确定格式

如果它存在或不存在,$lastvisits=$address->$band>getElementsByTagName(“lastvisit”)会带来一个错误-致命错误:对中的非对象调用成员函数getElementsByTagName()

XML-

<?xml version="1.0"?>
<addresses>
<address>
    <ip>127.0.0.1</ip>
    <Beatles>
        <lastvisit>12/08/2006</lastvisit>
    </Beatles>
</address>
    <address>
    <ip>125.0.0.1</ip>
</address>
 </addresses>
}

任何帮助都将不胜感激。

编辑#1:看起来您在添加的示例中指的是DOM,而不是SimpleXML。不过,下面是如何使用XML结构处理SimpleXML对象

$band = $_POST['band']; if (property_exists($address, $band)) { $lastvisits = $address->$band->lastvisit; } else { /* handle the fact that the name of the element which the user passed is invalid */ } 编辑#1:看起来您在添加的示例中引用的是DOM,而不是SimpleXML。不过,下面是如何使用XML结构处理SimpleXML对象

$band = $_POST['band']; if (property_exists($address, $band)) { $lastvisits = $address->$band->lastvisit; } else { /* handle the fact that the name of the element which the user passed is invalid */ }
你说得对,在某个时候我从simplexml切换到了DOM。这对DOM也不起作用吗?因为在这一点上,它的行为就好像这个属性不是每次都存在一样,即使它确实存在。每个band元素中的LastVisite不会超过一次——更新时日期会被覆盖。我不在乎它是否有效,我只是喜欢街区里的新孩子们参与到讨论中。好吧,这将是一个痛苦的屁股改变,但你是对的,这更有意义。谢谢你的帮助。是的,
property\u exists
在DOM上不会这样工作。在SimpleXML中,子元素基本上是一个属性。在DOM中,您必须执行搜索或使用
getElementByTagName($band)
方法(假设您的示例)。它将返回一个
DOMNodeList
对象。如果乐队“披头士”不存在,则
DOMNodeList
的object
length
属性将为0。我仍然有一个问题-最初,脚本的目的是查找乐队,如果乐队存在,请检查乐队的“LastVisite”。有了这个新的设置,一旦我找到乐队,我就不能直接访问“LastVisite”。我需要查看每个vist,找到乐队,然后返回其家长访问,然后获得“最后访问”。我不知道怎么做$所有访问=$doc->getElementsByTagName(“访问”);foreach($eachvisit作为$eachvisit的所有访问){if($eachvisit->band==$band){…然后$lastvists=$eachvisit->getElementsByTagName(“lastvisit”)?@Brian Williams:您可以使用
DOMXPath
类来运行搜索。添加了DOM示例。您是对的,在某个时候,我从simplexml切换到了DOM。这对DOM也不起作用吗?因为在这一点上,它的行为就像每次属性都不存在一样,即使它存在。并且内部不会有多个LastVisite每个band元素-更新时日期都会被覆盖。我不在乎它是否有效,我只是喜欢新来的孩子们加入到讨论中。好吧,这会让人很痛苦,但你是对的,这更有意义。谢谢你的帮助。是的,
属性_exists
不会在DOM上工作。在SimpleXML中子元素基本上是一个属性。在DOM中,您必须执行搜索或使用
getElementByTagName($band)
方法(假设您的示例)。这将返回一个
DOMNodeList
对象。如果乐队“Beatles”不存在,
DOMNodeList
的object
length
属性将为0。我仍然有一个问题-最初,脚本的目的是查找乐队,如果它存在,请检查乐队的“lastvisit”。使用此新设置,一旦找到乐队,我就无法直接访问“lastvisit”。我需要通过gh每个vist,找到乐队,然后返回到它的家长访问,然后获取“lastvisited”。我不知道如何做。$allvisits=$doc->getElementsByTagName(“访问”);foreach($allvisits as$eachvisit){if($eachvisit->band=$band){…然后$lastvisits=$eachvisit->getElementsByTagName(“最后访问”)?@Brian Williams:您可以使用
DOMXPath
类来运行搜索。添加了DOM示例。这有点像一个xml文件被用作数据库。如果是这样做的话:最好给我们一个真正的数据库,如MySQL、PostgreSQL或SQLite。如果您需要xml输出,只需在运行中或更改后构建它。这有点像xml文件e被用作数据库。如果你是这样做的:最好给我们一个真正的数据库,如MySQL、PostgreSQL或SQLite。如果你需要XML输出,只需在运行中或更改后构建它。 <addresses> <address> <ip>127.0.0.1</ip> <visits> <visit> <band>Beatles</band> <lastvisit>12/08/2006</lastvisit> </visit> <visit> <band>New Kids On the Block</band> <lastvisit>1/14/2008</lastvisit> </visit> </visits> </address> <address> <ip>24.135.9.2</ip> <visits> ... </visits> </address> </addresses> $band = $_POST['band']; $client_IP = $_SERVER["REMOTE_ADDR"]; $doc = new DOMDocument(); $doc->load("votingxml/addresses.xml"); $xpath = new DOMXPath($doc); $ip_query = $xpath->query('//addresses/address/ip[. = "' . $client_IP . '"]'); if ($ip_query->length === 1) { // client's IP found, now grab and work with the client's address record $address = $ip_query->item(0)->parentNode; // search for the visit record within $address for band element value = $band $band_query = $xpath->query('visits/visit/band[. = "'.$band.'"]', $address); if ($band_query->length === 1) { // $band found, now get visit parent record for more details $visit = $band_query->item(0)->parentNode; // with that, now do something with the record's lastvisit value echo $visit->getElementsByTagName("lastvisit")->item(0)->nodeValue; } else { // $band not found. Add new visit record to the XML file // point to 'visits' group element $visits = $address->getElementsByTagName("visits")->item(0); // create a new 'visit' element, complete with 'band' and 'lastvisit' child elements $visit = $doc->createElement("visit"); $band = $doc->createElement("band", $band); $lastvisit = $doc->createElement("lastvisit", date("n/d/Y")); $visit->appendChild($band); $visit->appendChild($lastvisit); // now add new 'visit' element to 'visits' element and save $visits->appendChild($visit); $doc->save("votingxml/addresses.xml"); } }