-2

PHP を利用した Web アプリから XML ベースのニュース フィードを編集する機能を実装しようとしています。ただし、保存されることはないようです。

私が扱っているXMLファイルは次のとおりです。

<?xml version="1.0" standalone="yes"?>
<issues>                                                                    
        <issue>
            <issue_id>1</issue_id>
            <issue_name>Don't double my rates!</issue_name>
            <issue_body>Congress is on the verge of letting student rates double a week from today. Swing by the UC Lawn at 5:00 this Thursday to reach out to our Representatives and tell them: #DontDoubleMyRates!</issue_body></issue>
         <issue>
            <issue_id>2</issue_id>
            <issue_name>Proposed Senate Budget</issue_name>
            <issue_body>College Democrats are baffled by the proposed senate budget. This is our state, we must make our opinions heard! #NCGOPBudget #StopCuts</issue_body></issue>
         <issue>
            <issue_id>3</issue_id>
            <issue_name>Voter Suppression Law Invalidated!</issue_name>
            <issue_body>Join us in applauding the US Supreme Court for invalidating Arizona's voter-suppression law requiring that voters present proof of citizenship before voting!</issue_body></issue>
         <issue>
            <issue_id>4</issue_id>
            <issue_name>Here's an actual article I found interesting</issue_name>                    
            <issue_body>Actually, not really beacause I really didn't want to google for some arbitrary article to help test this out so here's a bunch of filler text to hopefully emulate at least the by-line of an article pertaining to the democratic party organization here on campus.</issue_body>
            </issue>
</issues>

以下は、既存のノードを編集しようとする関連する php スクリプトです。

<?php                                                                           
$newName = $_POST['name'];                                                  
$newBody = $_POST['body'];                                                  
$issue_id = $_POST['edit'];                                                 

$dom = new DOMDocument;                                                     
$dom->preserveWhiteSpace = FALSE;                                           
$dom->load('issues.xml');                                                   

$xpath = new DOMXPath($dom);                                                
$query = '/issues/issue';                                          

foreach($xpath->query($query) as $issue) {                                  
    $id = $issue->parentNode->getElementsByTagName("issue_id");         
    if($id->item($issue_id)->nodeValue = $issue_id) {                   
    $name = $issue->parentNode->getElementsByTagName("issue_name");       
    $body = $issue->parentNode->getElementsByTagName("issue_body");       
    $name->item($issue_id-1)->nodeValue = '$newName';                           
    $body->item($issue_id-1)->nodeValue = '$newBody';                        
    break;                                                                  
    }                                                                       
}                                                                           

    $dom->save("issues.xml");                                                   
?>

これは、以前に選択されたノードの ID が見つかるまで子ノードを反復処理し、その情報をテーブルに表示する参照ページです。

<?php                                                                           
$issue_id = $_POST['edit'];                                                 
$issueArray = array(                                                        
'id' =>$_POST['id'],                                                        
'issue_name' => $_POST['issue_name'],                                       
'issue_body' => $_POST['issue_body'],                                       
);                                                                          

$dom = new DOMDocument;                                                     
$dom->preserveWhiteSpace = FALSE;                                           
$dom->load('issues.xml');                                                   

$xpath = new DOMXPath($dom);                                                
$query = '/issues/issue';                                          

$i = 0;                                                                     
echo "<body><form action='saveChanges.php' method='post'><table border='1'><tr><th>ID</th><th>Name</th><th>Body</th></tr>";

foreach($xpath->query($query) as $issue) {                                  
    $eventI = $issue->parentNode->getElementsByTagName("issue_id");         
    if($eventI->item($issue_id)->nodeValue = $issue_id) {                   
    $eventN = $issue->parentNode->getElementsByTagName("issue_name");       
    $eventP = $issue->parentNode->getElementsByTagName("issue_body");       
    print "<tr><td>'".$eventI->item($issue_id-1)->nodeValue."'></td><td>'".$eventN->item($issue_id-1)->nodeValue."'></td><td>'".$eventP->item($issue_id-1)->nodeValue."'</td></tr>";
    print "<tr><td></td><th>New Name</td><th>New Body</td></tr>";           
    print "<tr><td></td><td><input type='text' name='name'size='50'</input></td><td><input type='text' name='body' size='200'</input></td></tr>";
    print "<tr><td><input type='hidden' name='id' value='$issue_id'/></td><th><input type='submit' action='saveChanges.php' name='edit' method='post' value='Confirm Edit'/></th><th></th>";
    break;                                                                  
    }                                                                       
}                                                                           
print "</table></body>";                                                    
?>

私は PHP が得意ではなく、XML の構文解析がさらに苦手です。これを正しい方向に進めるための助けがあれば幸いです。

4

1 に答える 1

1

DOM を操作するコードにはさまざまな問題があります。for ループの内容を見るだけで、次のようになります。

$id = $issue->parentNode->getElementsByTagName("issue_id");      

上記の行$issueでは、 for ループで列挙した を取得し、その親を参照しています。これはすべての問題で同じであるため、列挙は無関係です。

issue_id次に、そのツリー内のすべての要素を取得します。これを使用して、次のようにします。

if($id->item($issue_id)->nodeValue = $issue_id) {                   

ここでは$issue_id、 をインデックスとして使用しています。これは、 issue_id(たとえば) の が常に 3 番目の問題であると想定していますが、これはおそらく正しくありません。

また、シングル=は割り当てであり、比較ではありません。それはあなたの意図ではなかったと思います。

$name$body検索は同じです。

$name = $issue->parentNode->getElementsByTagName("issue_name");       
$body = $issue->parentNode->getElementsByTagName("issue_body");       

ここでも、$issue列挙された を無視して親ノードから作業し、一致するすべての子要素を取得するだけですissue_nameおよびissue_body

$issue_idまた、 をインデックスとして使用しています。

$name->item($issue_id-1)->nodeValue = '$newName';                           
$body->item($issue_id-1)->nodeValue = '$newBody';                        

今回、あなたが使っている$issue_id-1のは、何か理由があったのですか?

また、php で文字列に単一引用符を使用すると、変数が展開されないため、名前は常に$newNameその変数の値ではなくリテラル文字列に設定されます。二重引用符を使用するか、値を直接代入することをお勧めします。

これは、コードが次のようになると私が期待するものに似ています。

foreach($xpath->query($query) as $issue) {        
    $id = $issue->getElementsByTagName("issue_id")->item(0);  
    if($id->nodeValue == $issue_id) {  
        $name = $issue->getElementsByTagName("issue_name")->item(0);       
        $body = $issue->getElementsByTagName("issue_body")->item(0);       
        $name->nodeValue = $newName;
        $body->nodeValue = $newBody;
        break;                                                                  
    }                                                                       
}

コードの残りの部分には同じ問題がありますが、正しい方向に向かうことを願っています。

于 2013-06-25T22:20:31.953 に答える