0

RSS フィードから投稿を取得してデータベースに配置するスクリプトを作成しています。これを 3 ~ 5 の異なるフィードで行い、どのフィードからのものかに関係なく、日付順に印刷します。simplepie を使用してファイルから rss データを取得できますが、それを配列に追加できないようです (些細な部分)。

get_title() からのデータは、「SimplePie_Item 型のオブジェクトを配列として使用できません」という単なる文字列ではなく、「SimplePie_Item」として返されます。データをエコーし​​ようとすると、文字列が正常に出力されます。ですから、ここでオブジェクトからのデータについて得られないことがあると思います。たとえば、文字列を配列にコピーできない理由などです。キャストしてみましたが、これは何もしていないようです。

--update_database メソッドコード--

function update_database($options=array())
{    
    //Check required fields.
    if(!$this->_required(array('feeds','life'),$options))
      return false;

    //Add default values
    $options = $this->_default(array() ,$options);

    if(is_array($options['feeds'])) //Multiple blogs
    {       

echo '配列です';

        //Parse each url and add to db.
        foreach($options['feeds'] as $a => $u)
        {

echo '印刷 r =

';print_r($u);エコー'
';

echo 'feeds loop = '.$a;

echo 'url = '.$u['url'].'<br />';

$posts = $this->fetch_feed( array('url'=>$u['url']) );

            //Add to db.
            foreach($posts as $f)
            {   

  $add['post_title'] =    (string)$f->get_title();
  $add['link'] =          (string)$f->get_link();
  $add['p_description'] = (string)$f->get_description();
  $add['content'] =       (string)$f->get_content();
  $add['post_date'] =     (string)$f->get_date();
  $add['guid'] =          (string)$f->get_id();
  $add['status'] =        'active';
  $add['blog_id'] =       $u['blog_id'];

                $this->add_post($f);//Add posts to db.
            }
        }
    }
    else //Single blog.
    {
echo 'feeds - single feed';

$posts = $this->fetch_feed( array('url'=>$options['url']) );

            //Add to db.
            foreach($posts as $k=>$f)
            {                   
  $add['post_title'] =    (string)$f->get_title();
  $add['link'] =          (string)$f->get_link();
  $add['p_description'] = (string)$f->get_description();
  $add['content'] =       (string)$f->get_content();
  $add['post_date'] =     (string)$f->get_date();
  $add['guid'] =          (string)$f->get_id();
  $add['status'] =        'active';
  $add['blog_id'] =       $options['blog_id'];

                $this->add_post($f);//Add posts to db.
            }
    }
} 

--fetch_feed メソッド--

  function fetch_feed($options=array())
  {
    $this->simplepie->set_feed_url($options['url']);
    $this->simplepie->set_cache_location(APPPATH.'cache/rss');
    $this->simplepie->init();
    $this->simplepie->handle_content_type();
    return $this->simplepie->get_items();
  }

--add_post メソッド--

    function add_post($options)
    {
        //Check required options.
        if(!$this->_required(array('post_title','link','p_description','content','post_date','guid','status','blog_id'), $options))
          return false;

        //Add default values
        $options = $this->_default(array() ,$options);  

        $this->db->set('post_title',$options['title']);
        $this->db->set('link',$options['link']);
        $this->db->set('p_description',$options['description']);
$this->db->set('content',$options['content']);
$this->db->set('post_date',$options['post_date']);
$this->db->set('guid',$options['guid']);
$this->db->set('status',$options['status']);    
        $this->db->set('blog_id',$options['blog_id']);

        $this->db->insert('posts');
        return $this->db->affected_rows();
    }

- コントローラ -

  function simple_pie()
  {
    $this->load->model('post_model');
    //$this->options->feeds = $this->post_model->fetch_feed(array('url'=>'http://testigniter.blogspot.com/feeds/posts/default?alt=rss'));

    $urls = array('feeds'=>array( array('url'=>'http://testigniter.blogspot.com/feeds/posts/default?alt=rss','blog_id'=>1) ),'life'=>60);

    $this->options->result = $this->post_model->update_database($urls);

    if($this->options->result)
    {
      echo 'Passed';
    }
    else
    {
      echo 'Failed';
    }

    $this->load->view('pages/simplepie_test', $this->options);  
  }

ここでは実際にビューは必要ありません。

4

2 に答える 2

1

Echoは、値を(string)表示する前に値を変換します。

フェッチした値の前にprependを試してみてください(string)。そうすれば、エコーと同じ結果が得られます。

あなたの問題は、array(0 => 'string')これがXML構造を読み取って保存する方法の1つであるため、値が実際にあることだと思います。エコーすると、次の理由で見栄えが良くなります。
(string)array(0 => 'string') == 'string'

于 2012-04-13T12:29:55.940 に答える
0

PHP と私は親友ではありませんが、SimplePie に問題がある場合は、最初にオブジェクトを宣言するときに設定できるフラグ、特に enable_xml_dump() を確認する必要があります。これにより、フィードから未加工の XML を取得し、それを使用して必要なことを行うことができます。

私は過去に何かを達成するためにそれを使用しました。何らかの方法でサンプルコード/例を短縮できれば、役立つかもしれません。通常、フィードをフェッチできる場合は、get_title() が機能するはずです... 悪いフィードが原因であることがよくあります。フィード自体に問題はなく、検証されますか? RSSフィードバリデーターがあります...

于 2012-04-25T21:42:25.197 に答える