PHP:从数据库中加载DOM中的XML

时间:2012-10-04 03:36:20

标签: php mysql xml parsing dom

出于某种原因,这在我开箱即用的WAMP上发挥作用,但当上传到Web服务器时,它会丢失以下错误:

  

严重性:警告

     

消息:DOMDocument :: load():I / O警告:无法加载外部   实体   “/ mounted-storage / home155 / sub004 / sc81961-YHHB / * * * * * * .com / dev /   2012-10-04 03:15:03   4 2012-10-04 03:25:16   2012-09-17 19:25:11    3   0   1   1                   2012-10-04 04:08:18“

     

文件名:models / fuel_model.php

     

行号:74

它指向应用程序根文件夹。

代码:

   function get_pos($id)
    {
        $get = $this->db->query(
                "SELECT * FROM holding WHERE id=1"
            );
        $stream = $get->row_array();

        $addr = 'http://api.eveonline.com/corp/StarbaseDetail.xml.aspx?keyID='.$stream['apiid'].
                '&vCode='.$stream['apikey'] . '&itemID=' . $id;
        $link = new DOMDocument();

      $get_cache = $this->db->query(
          "SELECT * FROM cache_poses WHERE posid=".$id
        );
      $cache = $get_cache->row_array();

      $posted = strtotime(date("Y-m-d H:i:s"));
      if(!empty($cache))
      {
        $posted = strtotime($cache['cachedon']);
      }

      $current = strtotime(date("Y-m-d H:i:s"));

      $mins = $posted - $current;
      $expiry = $mins % 60;

      if(empty($cache))
      {
        $link->load($addr);
        $this->db->query("INSERT INTO cache_poses (data, posid) VALUES (" . $this->db->escape($link->saveXML()) . "," . $id .")");

      } elseif(!empty($cache) && ($expiry >= 360)) {
        $this->db->query("DELETE FROM cache_poses WHERE posid=".$id);
        $link->load($addr);
        $this->db->query("INSERT INTO cache_poses (data, posid) VALUES (" . $this->db->escape($link->saveXML()) . "," . $id . ")");

      } elseif(!empty($cache) && ($expiry < 360)) {

        $link->load($cache['data']);

      }

        $supply = $link->getElementsByTagName('row');
        $supplies = array();

        foreach ($supply as $fuel) {
            $block = $fuel->attributes;

            $put = $this->db->query('SELECT name FROM items WHERE typeid='.$block->item(0)->nodeValue);
            $lck = $put->row_array();

            $supplies[$lck['name']] = $block->item(1)->nodeValue;
        }

        $info = $this->implode_with_keys($supplies);
        return $info;
    }

1 个答案:

答案 0 :(得分:0)

你可以发布XML吗?它引用的DTD必须可以在本地开发计算机上访问,但不能在您的实时服务器上访问。如果DTD及其定义的实体对您的XML不重要,则可以通过在调用DOMDocument :: load()之前禁用内部实体的加载来抑制警告,并且可能会因未加载额外资源而获得性能提升。

$link->resolveExternals = FALSE;
$link->load($cache['data']);

http://www.php.net/manual/en/class.domdocument.php#domdocument.props.resolveexternals

顺便说一下,DOMDocument :: load()接受文件路径。如果您的$cache['data']实际上是数据库中的XML字符串,则需要使用DOMDocument :: loadXML()。