使用PHP更新XML元素文本

lmyy7pcs  于 2023-01-04  发布在  PHP
关注(0)|答案(2)|浏览(224)

我试图更新XML元素文本的基础上提交的形式。这是一个用户数据库和IM使用用户的密码作为一个参考,以更新他们的用户ID。密码都是唯一的,所以我认为这将是一个很容易的元素参考。然而,每当我试图编辑一个UID失败,并把我送到我的错误页面,我创建如果功能失败。我不知道我哪里出错了,任何帮助都是很好的。

    • 更新UID函数**
function updateUID($pass, $file, $new)
{
    $xml = new DOMDocument();
    $xml->load($file);
    $record = $xml->getElementsByTagName('UniqueLogin');
    foreach ($record as $person) {
        $password_id = $person->getElementsByTagName('Password')->item(0)->nodeValue;
        //$person_name=$person->getElementsByTagName('name')->item(0)->nodeValue;
        if ($password_id == $password) {
            $id_matched = true;
            $updated  = $xml->createTextNode($new);
            $person->parentNode->replaceChild($person, $updated);
            
            break;
        }
    }
    if ($id_matched == true) {
        if ($xml->save($file)) {
            return true;
        }
    }
    
}
    • 调用函数的代码**

x一个一个一个一个x一个一个二个x

odopli94

odopli941#

我认为这个问题是由逻辑测试中未声明的变量$password以及如果出错函数永远不会返回替代值这一事实引起的。
根据关于XPath的评论-也许以下内容可能会感兴趣。

<?php

    $pass='xiMs0Az2Zqh';
    $file='logins.xml';
    $new='banana';


    function updateUID( $pass=false, $file=false, $new=false ){
        if( $pass & $file & $new ){
            $dom = new DOMDocument();
            $dom->load( $file );
            
            # attempt to match the password with this XPath expression
            $expr=sprintf( '//Unique_Logins/UniqueLogin/Password[ contains(.,"%s") ]', $pass );

            $xp=new DOMXPath( $dom );
            $col=$xp->query( $expr );
            
            # We have a match, change the UID ( & return a Truthy value )
            if( $col && $col->length===1 ){
                $xp->query('UID', $col->item(0)->parentNode )->item(0)->nodeValue=$new;
                return $dom->save( $file );
            }
        }
        # otherwise return false
        return false;
    }
    
    
    $res=updateUID( $pass, $file, $new );
    
    if( $res ){
        echo 'excellent';
    }else{
        echo 'bogus';
    }

?>
rsaldnfx

rsaldnfx2#

我仍然不清楚到底哪里出了问题,但是如果我理解正确的话,请尝试在代码中进行以下更改,看看是否有效:

#just some dummy values
$oldPass = "Ab7wz77kM";
$newUid  = "whatever";

$record = $xml->getElementsByTagName('UniqueLogin');
foreach ($record as $person) {
    $password_id = $person->getElementsByTagName('Password');
    $user_id     = $person->getElementsByTagName('UID');
    if ($password_id[0]->nodeValue == $oldPass) {
        $user_id[0]->nodeValue = $newUid;
    }
}

相关问题