我使用带有数据库连接的google map api,我有一个输出xml文件的函数,JavaScript读取坐标。没问题。
现在我想添加另一个函数,用于打印出已在db中保存坐标的用户。
但我的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" />
这是我的两个功能
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();
有什么想法吗?
答案 0 :(得分: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();
使用了两种新类型:
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;
}
}
答案 1 :(得分: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']);
}
}
您可以像上面一样使用它,只需拨打fetch_articles_with_username()
一次。