1

そのタイトルに正しく名前を付けたかどうかはわかりませんが、基本的には$ _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>

これは完全なコードです:

    $doc = new DOMDocument();
$doc->load("votingxml/addresses.xml");
$addresses = $doc->getElementsByTagName("address");
$band = strval($_POST['band']);
$pVoted = false;
$pFound = false;

//Loop through the addresses nodes and see if the person has voted before for each( $addresses as $address )
{

$ips = $address->getElementsByTagName("ip");
            $ip = $ips->item(0)->nodeValue;
                            if ($ip == $domain){

                $pFound = true;             
            if ($address->$band == 'NULL'){
                 $bandfound= false;
                 $newBandElement = $doc->createElement($_POST['band']);
                 $newLastVisitElement = $doc->createElement('lastvisit');
                 $dayvalue = $doc->createTextNode($today);
                 $dayvalue = $newLastVisitElement->appendChild($dayvalue);

                 $newBandElement->appendChild($newLastVisitElement);
                 $address->appendChild($newBandElement);
                 $doc->save("votingxml/addresses.xml");
                 $pVoted = false;
            }
            else{

                 $bandfound =true;
                                 $lastvisits = $address->$band->getElementsByTagName("lastvisit");
                 $lastvisit = $lastvisits->item(0)->nodeValue;

                 if ($lastvisit == $today){
                        echo "alreadyvoted";
                        $pVoted = true;
                     }else{
                    $lastvisits->item(0)->nodeValue = $today;
                    $doc->save("votingxml/addresses.xml");
                    $pVoted = false;
                     }

            }
        }
        else if ($ip != $domain)
        {
            $pFound = false;
        }

}

どんな助けでも大歓迎です。

4

1 に答える 1

1

編集#1:SimpleXMLではなく、追加した例でDOMを参照しているようです。それでも、XML構造を使用してSimpleXMLオブジェクトでそれを行う方法は次のとおりです...

$ band = $ _POST ['band'];

if(property_exists($ address、$ band)){
    $ lastvisits = $ address-> $ band-> lastvisit;
}
そうしないと {
    /*ユーザーが渡した要素の名前が無効であるという事実を処理します*/
}

注:lastvisit要素は1つだけです。さらに多くの要素がある場合は、それらのlastvisit要素をXMLファイル内の単一の「lastvisits」親要素にラップする必要があります。有効なXMLとそのすべて。

編集#2:xml構造にいくつかの問題があります。「ビートルズ」は、要素の名前にはあまりにもユニークです。次のように変更することをお勧めします。

<アドレス>
   <住所>
      <ip> 127.0.0.1 </ ip>
      <訪問>
         <訪問>
            <band>ビートルズ</band>
            <lastvisit>2006年12月8日</lastvisit>
         </ visit>
         <訪問>
            <band>ニューキッズオンザブロック</band>
            <lastvisit>2008年1月14日</lastvisit>
         </ visit>
      </ visits>
   </アドレス>
   <住所>
      <ip> 24.135.9.2 </ ip>
      <訪問>
..。
      </ visits>
   </アドレス>
</アドレス>

次に、検索ipするIPの値を持つノードを検索し、その下でband値「Beatles」のノードを検索します。

編集#3、4: DOMXPathクラスを使用してDOMのメソッドを追加し、上記のXML構造で検索を実行し、バンドが見つからない場合は新しいレコードを追加します...

$ 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){
    //クライアントのIPが見つかりました。クライアントのアドレスレコードを取得して操作します
    $ address = $ ip_query-> item(0)-> parentNode;
    //$address内の訪問レコードでbandelementvalue =$bandを検索します
    $ band_query = $ xpath-> query('visits / visit / band[。="'。$band。'"]'、$ address);
    if($ band_query-> length === 1){
        // $ bandが見つかりました、詳細については親レコードにアクセスしてください
        $ visit = $ band_query-> item(0)-> parentNode;
        //それで、レコードのlastvisit値で何かを実行します
        echo $ visit-> getElementsByTagName( "lastvisit")-> item(0)-> nodeValue;
        }
    そうしないと {
        //$bandが見つかりません。XMLファイルに新しい訪問レコードを追加します
        //'visits'グループ要素を指す
        $ visits = $ address-> getElementsByTagName( "visits")-> item(0);
        //「band」および「lastvisit」の子要素を備えた新しい「visit」要素を作成します
        $ visit = $ doc-> createElement( "visit");
        $ band = $ doc-> createElement( "band"、$ band);
        $ lastvisit = $ doc-> createElement( "lastvisit"、date( "n / d / Y"));
        $ visit-> appendChild($ band);
        $ visit-> appendChild($ lastvisit);
        //新しい'visit'要素を'visits'要素に追加して保存します
        $ visits-> appendChild($ visit);
        $ doc-> save( "votingxml / addresses.xml");
        }
    }
于 2010-11-21T23:48:02.477 に答える