0

データベース接続で Google マップ API を使用しています。xml ファイルを出力する関数があり、JavaScript が座標を読み取ります。問題ありません。

ここで、データベースに座標を保存したユーザーを出力する別の関数を追加したいと思います。

しかし、私のxmlファイルはこのように出力されます。

<blog title="Ipsum" text="IpsumLorem" lat="31.968599" lng="-99.901810"/>
<blog username="user1"/>

このように最初の行に user1 を出力する代わりに

<blog title="Ipsum" text="IpsumLorem" lat="31.968599" lng="-99.901810" username="user1" />

これは私の2つの機能です

function fetch_articles() {
    $query = $this->link->query("SELECT * FROM blog ");  
    $query->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $query->fetch()) {  
        $node = $dom->createElement("blog");  
    $newnode = $parnode->appendChild($node);   
    $newnode->setAttribute("title",$row['title']);
    $newnode->setAttribute("text", $row['text']);  
    $newnode->setAttribute("lat", $row['lat']);  
    $newnode->setAttribute("lng", $row['lng']);  
    } 
}

function fetch_users() {
    $query = $this->link->query("SELECT * FROM user ");  
    $query->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $query->fetch()) {  
        $node = $dom->createElement("blog");  
    $newnode = $parnode->appendChild($node);   
    $newnode->setAttribute("username",$row['username']);
    } 
}



 $area = new Areas();
$area_info = $area->fetch_articles(); 
$user_info = $area->fetch_users(); 
echo $dom->saveXML();

何か案は ?

4

2 に答える 2

2

同じ に属性の変更を適用する必要がありますDOMElement。どちらのメソッドにも実際にはまったく同じコードが含まれているため、それもカプセル化する価値があります。

$blog = $dom->createElement("blog");

$apply = new DomAttributeApplyIterator(
    new PdoQueryIterator($pdo, "SELECT * FROM blog"), $blog
);
$apply->apply();

$apply = new DomAttributeApplyIterator(
    new PdoQueryIterator($pdo, "SELECT * FROM user"), $blog
);
$apply->apply();

echo $dom->saveXML();

使用される 2 つの新しいタイプ:

class DomAttributeApplyIterator extends IteratorIterator
{
    /**
     * @var DOMElement
     */
    private $element;

    public function __construct(Traversable $iterator, DOMElement $element) {
        parent::__construct($iterator);
        $this->element = $element;
    }

    public function apply() {
        foreach($this as $key => $value) {
            $this->element->setAttribute($key, $value);
        }
    }
}

class PdoQueryIterator implements IteratorAggregate
{
    private $pdo, $query;

    public function __construct(PDO $pdo, $query) {
        $this->pdo = $pdo;
        $this->query = $query;
    }

    public function getIterator() {
        $stmt = $this->pdo->query($this->query);
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        return $stmt;
    }
}
于 2013-05-19T15:38:10.710 に答える
1

あなたが持っているコードには、ユーザーをブログ投稿に接続する方法がありません。したがって、単一の結果で両方を取得するクエリを作成し、それを DOM ノードに追加するのがおそらく最も簡単です。次のように機能します。

function fetch_articles_with_username() {
    $query = $this->link->query("SELECT * FROM blog LEFT JOIN user WHERE blog.userid = user.id ");  
    $query->setFetchMode(PDO::FETCH_ASSOC);
    while($row = $query->fetch()) {  
        $node = $dom->createElement("blog");  
        $newnode = $parnode->appendChild($node);   
        $newnode->setAttribute("title",$row['title']);
        $newnode->setAttribute("text", $row['text']);  
        $newnode->setAttribute("lat", $row['lat']);  
        $newnode->setAttribute("lng", $row['lng']);  
        $newnode->setAttribute("username",$row['username']);
    } 
}

を 1 回呼び出すだけで、上記のように使用できますfetch_articles_with_username()

于 2013-05-19T15:38:35.370 に答える