RSSの格納、表示がうまくいかない

このQ&Aのポイント
  • データベースへの接続は完了したんですが、RSSの格納がうまくいきません。
  • エラー文も表示されず原因がわからないのですが、おかしな文はありますでしょうか?
  • <?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; //itemを取り出して$rssに渡す $date = $rss->channel->date; // RSSアイテム取得 値の代入 自作関数 //SQL文を実行、結果を求める $stmt = $dbh->prepare('insert into hlxclitx_feed_rss (data) values (?)'); //$url1配列から先頭のデータをとりだして$urlに渡す なくなるまでループする foreach ($url1 as $url) { //rssがほしいから、もらった$urlを渡す if (($rss = @simplexml_load_file($url)) === false) continue; // RSSタイトルがほしいから、もらったrssを渡す $site_title = $rss->channel->title; //初期のカウント $count = 0; //itemを取り出して$rssに渡す ループ foreach ($rss->item as $item) { //8件を超えたとき取得を終了する if (++$count > 8) break; //タイトル、リンクを取得 $title = $item->title; $link = $item->link; //RSSの情報を取得 $dc = $item->children('http://purl.org/dc/elements/1.1/'); //RSS日付け取得 $date = date('Y-m-d H:i:s', strtotime($dc->date)); // $title, $link, $date を表示 $stmt->execute[json_encode($item)]; } } ?>
回答を見る
  • ベストアンサー

RSSの格納、表示がうまくいかない

データベースへの接続は完了したんですが、RSSの格納がうまくいきません。 エラー文も表示されず原因がわからないのですが、おかしな文はありますでしょうか? <?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; //itemを取り出して$rssに渡す $date = $rss->channel->date; // RSSアイテム取得 値の代入 自作関数 //SQL文を実行、結果を求める $stmt = $dbh->prepare('insert into hlxclitx_feed_rss (data) values (?)'); //$url1配列から先頭のデータをとりだして$urlに渡す なくなるまでループする foreach ($url1 as $url) { //rssがほしいから、もらった$urlを渡す if (($rss = @simplexml_load_file($url)) === false) continue; // RSSタイトルがほしいから、もらったrssを渡す $site_title = $rss->channel->title; //初期のカウント $count = 0; //itemを取り出して$rssに渡す ループ foreach ($rss->item as $item) { //8件を超えたとき取得を終了する if (++$count > 8) break; //タイトル、リンクを取得 $title = $item->title; $link = $item->link; //RSSの情報を取得 $dc = $item->children('http://purl.org/dc/elements/1.1/'); //RSS日付け取得 $date = date('Y-m-d H:i:s', strtotime($dc->date)); // $title, $link, $date を表示 $stmt->execute[json_encode($item)]; } } ?> 補足情報(FW/ツールのバージョンなど) db name hlxclitx_wp1 table name hlxclitx_feed_rss テーブル名 (data) 名前 item

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ファイルの先頭で、wordpressを呼び出しているのは何らかの意図がりますか? RSSをテーブルにINSERTすることだけに焦点を絞って切り分けるなら、一旦外した方がいいかもしれません。 そのうえで再度実行したときに、何のエラーも発生しないでしょうか? ----------------- // $title, $link, $date を表示 $stmt->execute[json_encode($item)]; ----------------- この行は明らかに間違っていて、executeはメソッドなので、 ----------------- $stmt->execute([json_encode($item)]); ----------------- としないと、おそらく何らかのエラーが出るはずです。 また、上の書きっぷりから考えるに、取得した、$title, $link, $dateの3項目をJSONにしたものをテーブルに保存したい、ということと思いますので、 ----------------- $stmt->execute(json_encode(['title' => $title, 'link' => $link, 'date' => $date])); ----------------- と入力するのが意図通りの動作になるのではないでしょうか。 それを修正したうえで、INSERTされないようであれば、 ----------------- // デバッグ用の出力関数を実行して画面上に収集結果を表示してみる var_dump(['title' => $title, 'link' => $link, 'date' => $date]); $stmt->execute(json_encode(['title' => $title, 'link' => $link, 'date' => $date])); ----------------- などとして、実際にどうなっているのか画面上で確認されたほうがよろしいかと思います。

php_learn
質問者

お礼

この部分がどうしてもわからないのですが、 RSSアイテムを取得するコードが間違っている気がするのでしょうが、どうでしょうか? //itemを取り出して$rssに渡す $date = $rss->channel->date; // RSSアイテム取得 値の代入 自作関数 ※channelが2つあり奇妙なんですが… それぞれの役割がだぶついていないのか心配です。 // RSSタイトルがほしいから、もらったrssを渡す $site_title = $rss->channel->title;

php_learn
質問者

補足

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13255017273 もともとはこちらのコードを修正することで、RSSの取得を目指したのですが。 おそらくデータベースの設定と、phpコードがかみ合ってないことが原因だと思われます。 原因を考えたのですが、 1.RSS1.0と2.0の違いから取得がうまくいかない 2.複数サイト(3サイト)のURLをまとめてURl1関数に代入したデータが格納されておらずデータベースが空となっているのではないかと考えております。 ヤフー知恵袋で教えていただいた際はRSSをitemとして格納して取り出して表示する際にtitleとlinkと画像を取り出せば問題ないといわれました。 ファイルの先頭で、wordpressを呼び出しているのは何らかの意図がりますか? A.意図はないです。コードを確認できていませんでした。 wp-load.phpは外部にモジュールを置く必要があるため、レンタルサーバーの仕様上禁止にしていたのを、見落としておりました。教えていただきありがとうございます。 // $title, $link, $date を表示 $stmt->execute[json_encode($item)]; ----------------- この行は明らかに間違っていて、executeはメソッドなので、 ----------------- $stmt->execute([json_encode($item)]); ----------------- としないと、おそらく何らかのエラーが出るはずです。 A.修正前はエラーが出ず、修正後にエラーが出ました。 初期に考えていたものではきちんとテーブルを分けていたのですが、itemから派生してlinkとtitleを出力できると聞いたのですが。通常は不可能なのでしょうか?

関連するQ&A

  • RSSをMYSQLに入れる最適なコードがわからない

    テーブル接続→テーブル作成(必要か不明)→RSSをまとめる→RSSを取得→RSSをテーブルに入れる→RSSを表示をPHPで作成しているのですが、 RSSをテーブルに入れる最適なコードがわからず困っております。 insertを使用してRSSをテーブルに入れたいのですが、INSERT INTOはphpにいきなり書いてもエラーにならないのでしょうか?$を使用するほうの記載のほうが正しいのでしょうか? <?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=ozvutmpq_wp1;host=localhost'; $user = 'ozvutmpq_wp1'; $password = 'Rn_&Zi$gWKae'; $dbh = new PDO($dsn,$user,$pass); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } //RSSをまとめる $url1 = [ 'http://', 'http://', 'http://',];//フィード登録1次元配列に foreach ($url1 as $url) { //複数のRSSを読み込むには?A.RSSのURLを配列に入れ、その配列をsimplexmlの引数にします。 $count = 0;//初期のカウント //RSSを取得 $rss = simplexml_load_file("$url"); // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 $site_title = $rss->channel->title; // RSSタイトル取得 値の代入 自作関数 $post_thumbnail= $rss->channel->thumb; // RSSサムネイル画像取得 値の代入 自作関数 foreach ($rss->item as $item) { // この内側で $item を参照する if ($count >= 8) { break;//8件を超えたとき取得を終了する } $count++; $title = $item->title; // タイトル $link = $item->link; // リンク $thumb = $item->thumb->url; // アイキャッチサムネイル $content = $item ->description;// 詳細、必要なのか不明 date_default_timezone_set("Asia/Tokyo");//日時、タイトルとサムネイル画像だけほしいので要らない気がする $dc = $item ->children('http://purl.org/dc/elements/1.1/');//RSSの情報をPHPで取得するとき、[simplexml_load_file()]関数を使いますが、読み込むファイルの形式が[RSS 1.0]の場合、特殊な処理を施してあげないと正確に取得・表示することができません。 $day = date('Y/m/d H:i',strtotime($dc -> date));// RSS日付け取得 値の代入 自作関数 RSS1.0を取得したい場合「dc」の名前空間は「xmlns:dc="http://purl.org/dc/elements/1.1/"」 と定義されているので、これを引数として指定します。 $key = date('YmdGHis', strtotime($dc -> date));//DB等に入れやすい書式に変換 } } //RSSをテーブルに入れる INSERT INTO rssfeed (title, link, thumb,content)//テーブル名 VALUES ($title, $link,$thumb,$content now()) ON DUPLICATE KEY UPDATE up_date = now(); //名前を独自につける $item_insert_sql = "INSERT INTO $db_database.`rssfeed`(title, link, thumb, content) VALUES ('" . $title . "', '" . $link . "', '" . $thumb . "', '" . $content . "')";//mysql_queryとしてまとめてコードとして使うため?

    • ベストアンサー
    • MySQL
  • テーブル格納して表示した記事を重複で表示させない

    以下のコードに①select countを用いる方法と②select existsを用いる方法を使いコンテンツの重複を避けるようにしたいと思っています。 調べたところ、以下の場合はselect countを避けるべきだとありました。RSSをテーブルに1ページ36×10ページの360コンテンツ格納するつもりです。この場合かなり重くなることが想定されるのですが、select existsを使いすでに表示された記事を除外することはできるのでしょうか?idなどで除外している例はあるのですが、すでに表示した記事にはないため方法がわかりません。 ・カウント対象件数が多い ・インデックスが効かない ・繰り返し実行することが多い <?php try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } //RSSをまとめる $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; // insertの準備 $stmt = $dbh->prepare('insert into teblename (title, link, date) values (?, ?, ?)'); // URLのループ開始 テーブルに格納 foreach ($url1 as $url) { // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 if (($rss = @simplexml_load_file($url)) === false) continue; $site_title = $rss->channel->title;// RSSタイトル取得 値の代入 自作関数 // サイトごとに表示するなら、サイトタイトル表示はこの位置 printf('<h2>%s</h2>', $site_title); $count = 0; // 個別記事のループ開始 RSSの取得が始まる foreach ($rss->item as $item) { if (++$count > 8) break; $title = $item->title;//タイトル取得 $link = $item->link;//リンクを取得 $dc = $item->children('http://purl.org/dc/elements/1.1/');//RSSの情報を取得 $thumb = $item->thumb->url;//画像を取得 //重複データを避けるため ・カウント対象件数が多い・インデックスが効かない・繰り返し実行することが多い $sql = "select exists ('select * from rss_feed')"; // 取得した記事データの表示 if ($count === 1) print('<ul>'); $date = date('Y-m-d H:i:s', strtotime($dc->date));//RSS日付け取得 printf('<li class="sitelink"><a href="%s">%s</a></li>', $link, $title); printf('<li class="sitelink"><a href="%s">site</a></li>', $link); printf('<li class="sitedate">%s</li>', $date); printf('<li class="sitethumb"><a href="%s"><img src="%s"></a></li>', $link, $thumbnail); print '</ul>';// $title, $link, $date,$thumb を表示 } if ($count) print('</ul>'); } ?>

    • ベストアンサー
    • PHP
  • データベースからの画像とタイトルにURLがつかない

    RSSを取得して格納までは成功したのですが、画像の取得ができずURL付き画像とタイトルを出力できていません。原因がわからないのですがどのようなことが考えられるでしょうか? <?php try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } //RSSをまとめる $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; // insertの準備 $stmt = $pdo->prepare('insert into teblename (title, link, date) values (?, ?, ?)'); // URLのループ開始 テーブルに格納 foreach ($url1 as $url) { // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 if (($rss = @simplexml_load_file($url)) === false) continue; $site_title = $rss->channel->title;// RSSタイトル取得 値の代入 自作関数 // サイトごとに表示するなら、サイトタイトル表示はこの位置 printf('<h2>%s</h2>', $site_title); $count = 0; // 個別記事のループ開始 RSSの取得が始まる foreach ($rss->item as $item) { if (++$count > 8) break; $title = $item->title;//タイトル取得 $link = $item->link;//リンクを取得 $dc = $item->children('http://purl.org/dc/elements/1.1/');//RSSの情報を取得 $thumb = $item->thumb->url;画像を取得 $thumbnail = '/images/dummy_thumbnail.jpg'; // 画像がない場合の代替画像 if ( $thumb ){ $thumbnail = $thumb; } // 取得した記事データの表示 if ($count === 1) print('<ul>'); $date = date('Y-m-d H:i:s', strtotime($dc->date));//RSS日付け取得 printf('<li>%s:%s:%s</li>', $title, $link, $date,$thumb);// $title, $link, $date,$thumb を表示 } if ($count) print('</ul>'); } ?>

    • ベストアンサー
    • PHP
  • RSSと投稿記事を交互に表示させたい

    内容の修正が必要ですが原因がわかりません 1.投稿に画像やカテゴリーなどが表示されず、タイトルと日付けのみ表示されている 2.RSS画像にURLがついておらず画像のみ表示されている 3.RSSの画像がない場合ダミー画像を表示させたいが書き方が調べてもわからない <?php $dbh = connect_db(); $categories = []; foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); } delete_old_rss($dbh);//接続オブジェクトを渡す //RSS保存 $dbh = connect_db();//① $stmt = $dbh->prepare('insert into rss_feed (title, link, date, img) values (?, ?, ?, ?) on duplicate key update title=?, link=?, date=?, img=?');//② $url1 = get_rss_site_url(); foreach ($url1 as $url) { if (($rss = @simplexml_load_file($url)) === false) { continue; } foreach ($rss->item as $item) { $dc = $item->children('dc', true); $date = date('Y-m-d H:i:s', strtotime($dc->date)); if ($date < $delete_date) { continue; } $title = $item->title; $link = $item->link; $content = $item->children('content', true); $result = preg_match('/<img[^>]*src=\"([^"]+)\"[^>]*>/i', $content->encoded, $matches); if (1 == $result) { $img = $matches[1]; } else { $img = ''; } $stmt->execute([$title, $link, $date, $img, $title, $link, $date, $img]); } } if (ctype_digit($_REQUEST['page'])) { $current_page = (int) $_REQUEST['page']; } else { $current_page = 1; } if ($current_page > $wp_query->max_num_pages) { $current_page = $wp_query->max_num_pages; } $block_per_page = 2; $rss_per_block = 18; $posts_per_block = $wp_query->post_count / $block_per_page; //RSS読み込み $rss_per_page = $block_per_page * $rss_per_block; $rss_offset = ($current_page - 1) * $rss_per_page; $sql = 'SELECT * FROM rss_feed ORDER BY date DESC LIMIT ?,?'; $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT); $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT); $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ); $posts_per_page = $block_per_page * $posts_per_block; $posts_offset = ($current_page - 1) * $posts_per_page; $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, ]; $post_items = get_posts($args); //表示 for ($i = 0; $i < $block_per_page; ++$i) { echo '<h2>ブロック</h2>'; echo '<h3>RSS</h3>'; for ($j = 0; $j < $rss_per_block; ++$j) { $item_index = $i * $rss_per_block + $j; if ($item_index >= count($rss_items)) { break; } $item = $rss_items[$item_index]; echo '<ul>'; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">{$item->title}</a></li>"; echo "<li class=\"sitelink\"><a href=\"{$item->link}\">site</a></li>"; echo "<li class=\"sitedate\">{$item->date}</li>"; if (!empty($item->img)) { echo "<li><img src=\"{$item->img}\" width=\"100\"></li>"; } echo '</ul>'; } echo '<h3>投稿</h3>'; for ($j = 0; $j < $posts_per_block; ++$j) { $item_index = $i * $posts_per_block + $j; if ($item_index >= count($post_items)) { break; } $item = $post_items[$item_index]; echo '<ul>';   echo "<li><a href=\"{$item->guid}\">{$item->post_title}</a></li>"; echo "<li>{$item->post_date}</li>"; echo '</ul>'; } }

    • ベストアンサー
    • PHP
  • タイトルと画像にリンクを付けたい

    クラスを付けることはできたんですが、リンクを付けることができません。 調べてもわからなかったのですが、どのようにコード修正すればよいでしょうか? ※該当コード printf('<li class="sitetitle">%s</li>', $title); printf('<li class="sitelink">%s</li>', $link); printf('<li class="sitedate">%s</li>', $date); printf('<li class="sitethumb">%s</li>', $thumbnail); print '</ul>';// $title, $link, $date,$thumb を表示 <?php try { $dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost'; $user = 'hlxclitx_wp1'; $password = 'E.HrypHWxNmltXgC5eS26'; $dbh = new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } //RSSをまとめる $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; // insertの準備 $stmt = $dbh->prepare('insert into teblename (title, link, date) values (?, ?, ?)'); // URLのループ開始 テーブルに格納 foreach ($url1 as $url) { // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 if (($rss = @simplexml_load_file($url)) === false) continue; $site_title = $rss->channel->title;// RSSタイトル取得 値の代入 自作関数 // サイトごとに表示するなら、サイトタイトル表示はこの位置 printf('<h2>%s</h2>', $site_title); $count = 0; // 個別記事のループ開始 RSSの取得が始まる foreach ($rss->item as $item) { if (++$count > 8) break; $title = $item->title;//タイトル取得 $link = $item->link;//リンクを取得 $dc = $item->children('http://purl.org/dc/elements/1.1/');//RSSの情報を取得 $thumb = $item->thumb->url;//画像を取得 // 取得した記事データの表示 if ($count === 1) print('<ul>'); $date = date('Y-m-d H:i:s', strtotime($dc->date));//RSS日付け取得 printf('<li class="sitetitle">%s</li>', $title); printf('<li class="sitelink">%s</li>', $link); printf('<li class="sitedate">%s</li>', $date); printf('<li class="sitethumb">%s</li>', $thumbnail); print '</ul>';// $title, $link, $date,$thumb を表示 } if ($count) print('</ul>'); } ?>

    • ベストアンサー
    • PHP
  • functionsでどこまで括るのが正解なのか

    RSSを取得→格納→表示→定期的にキャッシュをphpで行っております。 index.phpにすべて記載したところfunctions.phpを利用したほうが良い、require_onceでpage.phpなどからindex.phpに読み込むようご指摘をいただいたので、コードを考えてみたのですがどの範囲までfunctionで括るのが正解なのかわかりません。 意見がわかれておりまして、役割によって分けるべきという方と、page.phpのみfunctions.phpを使いそのほかはrequire_onceで読み込めばいいという方と、すべてrequire_onceで読み込めばいいという方の3パターンありました。 どの方法が1番適切でしょうか?コードは以下になります。 <?php //別ファイルにして読み込む場合 function db($hlxclitx_wp1){//DB名を引数として受け取る $dbname //DB接続 try { $pdo = new PDO(“mysql:dbname=”$hlxclitx_wp1”_name;host=”localhost”;charset=utf8″,”hlxclitx_wp1”,”E.HrypHWxNmltXgC5eS26”)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; }catch (PDOException $e) { echo $e->getMessage(); return $db = null; } } // カテゴリーIDをキーにしたカテゴリー配列を生成 function get_category_name_by_id($categories) { foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } // 投稿の情報を追加 function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); } //古いデータを削除 //※先に実行する //ものがないものはfunctons.phpに書いても使えないので、require_onceでまとめて読み込む認識 function delete_date_pdo($delete_date) { $sql = 'DELETE FROM rss_feed WHERE date < ?'; $stmt = $dbh->prepare($sql); $delete_date = date('Y-m-d H:i:s', strtotime('-1 week')); //※削除対象日付 $stmt->execute([$delete_date]); } //RSS保存 function save_url_rss($stmt){//本来は値がほしいところでfunction{}するのだろう長さの加減がわからず $url1 = [ 'http://nns2ch.net/index.rdf', 'http://aqua2ch.net/index.rdf', 'https://worldfn.net/index.rdf', ]; $stmt = $dbh->prepare('insert into rss_feed (title, link, date, img) values (?, ?, ?, ?) on duplicate key update title=?, link=?, date=?, img=?'); foreach ($url1 as $url) { if (($rss = @simplexml_load_file($url)) === false) { continue; } foreach ($rss->item as $item) { $dc = $item->children('dc', true); $date = date('Y-m-d H:i:s', strtotime($dc->date)); //※削除対象日付より古いRSSは保存しない if ($date < $delete_date) { continue; } $title = $item->title; $link = $item->link; $content = $item->children('content', true); $result = preg_match('/<img[^>]*src=\"([^"]+)\"[^>]*>/i', $content->encoded, $matches); if (1 == $result) { $img = $matches[1]; } else { $img = ''; } $stmt->execute([$title, $link, $date, $img, $title, $link, $date, $img]); } } } function one_page_count($post_items){ //表示設定 $current_page = $_REQUEST['page'] ?? 1; //現在ページ $block_per_page = 2; //ページあたりブロック件数 $rss_per_block = 18; //ブロックあたりRSS件数 $posts_per_block = 5; //ブロックあたり投稿件数 //RSS読み込み $rss_per_page = $block_per_page * $rss_per_block; //ページあたりRSS件数 $rss_offset = ($current_page - 1) * $rss_per_page; //RSSオフセット $sql = 'SELECT * FROM rss_feed ORDER BY date DESC LIMIT ?,?'; $stmt = $dbh->prepare($sql); $stmt->bindParam(1, $rss_offset, PDO::PARAM_INT); $stmt->bindParam(2, $rss_per_page, PDO::PARAM_INT); $stmt->execute(); $rss_items = $stmt->fetchAll(PDO::FETCH_OBJ); //投稿読み込み $posts_per_page = $block_per_page * $posts_per_block; //ページあたり投稿件数 $posts_offset = ($current_page - 1) * $posts_per_page; //投稿オフセット $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, ]; $post_items = get_posts($args); } ?>

    • ベストアンサー
    • PHP
  • 複数のRSSのタイトル等をPDOでMySQLに登録

    複数のRSSを読み込み、RSS記事のタイトル・RSS記事のURLをMySQLに登録する方法について教えて頂ければと思います。 具体的にプログラムも作ってみましたが、もう一歩のところでうまくいきません。 うまくいっていないのは、「ループの中でPDOを使ったデータ登録」部分です。 ご回答宜しくお願い致します。 環境 PHP:5.1.6 MySQL:5.0.77 (目的) 複数のRSSを読み込み、RSS記事のタイトル・RSS記事のURLをMySQLに登録する。 (現状) 複数のRSSの記事を表示することには成功しています。 RSS1個目(記事数20)、RSS2個目(記事数15)の場合、35個の記事リストが表示される状態まではうまくいっています。しかし、PDOを使ってDBに登録の処理を入れると、RSS1個目の記事数20個が画面に表示され、MySQLにもRSS1個目の記事数20個分が登録される状態 になってしまいます。 ※RSS取得の形式はRSS2.0とします。(実際にはAtom、rdfにも対応させますが今回はDBの登録部分の質問なので) 【テーブル構成】 [RSSのタイトル・URL登録] テーブル名:rss_list (3列構成) フィールド名:id(auto_increment),title,url [RSSの記事タイトル・RSSの記事URL・RSSの発行日時] テーブル名:rss_data (4列構成) フィールド名:id(auto_increment),rss_title,rss_url,rss_date --------------表示まで成功したソース(始)---------------------------------- try { $dbh=newPDO($DSN,$DBUSER,$DBPASS); $query='SELECT*FROM rss_list' $stmt=$dbh->query($query); //rss_listテーブルよりtitle,urlを取得 while($result=$stmt->fetch(PDO::FETCH_ASSOC)) { $url=($result['url']); $title=($result['title']); echo$title.'<br>'; //RSS情報を取得 $xml=simplexml_load_file($url); foreach($xml->channel->itemas$entry) {   $entrydate=date("Y.m.d.H:i",strtotime($entry->pubDate)) $entry_title=strval($entry->title); $entry_url=strval($entry->link); $entry_cate=strval($entry->category); echo'<li><span>'.$entrydate.'</span>'; echo'<ahref="'.$entry->link.'">&nbsp&nbsp'.$entry->title.'</a>; }//foreach終了 }//while終了 } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }//catch_end --------------表示まで成功したソース(終)---------------------------------- 上記プログラムのRSS情報を取得する部分 foreachの中にDBへの登録の処理を加えます。 --------------DBへの登録追加(始)---------------------------------- try { $dbh=newPDO($DSN,$DBUSER,$DBPASS); $query='SELECT*FROMrss_list' $stmt=$dbh->query($query); //rss_listテーブルよりtitle,urlを取得 while($result=$stmt->fetch(PDO::FETCH_ASSOC)) { $url=($result['url']); $title=($result['title']); echo$title.'<br>'; //RSS情報を取得 $xml=simplexml_load_file($url); foreach($xml->channel->itemas$entry) {   $rss_date=date("Y.m.d.H:i",strtotime($entry->pubDate)) $rss_title=strval($entry->title); $rss_url=strval($entry->link); echo'<li><span>'.$entrydate.'</span>'; echo'<ahref="'.$entry->link.'">&nbsp&nbsp'.$entry->title.'</a>; //追加部分(開始) try { $dbh2=newPDO($DSN,$DBUSER,$DBPASS); $query2='INSERT INTO rss_data SET(rss_title,rss_url,rss_date)VALUES(:rss_title,:rss_url,:rss_date)'; $stmt=$dbh2->prepare($query2); $stmt->bindParam(':rss_date',$rss_date); $stmt->bindParam(':rss_title',$rss_title); $stmt->bindParam(':rss_url',$rss_url); } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }         //追加部分(終了)   }//foreach終了 }//while終了 } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }//catch_end --------------DBへの登録追加(終)---------------------------------- DBへの追加処理を加えると、1個目のRSS記事20個は表示・DBへの登録がされますが、そこで処理が止まってしまっています。 原因を下記のように考えてみました。 1.PDO(セレクト文 while)→ foreach→ PDOのような入れ子になっておりデータベースの切断などに工夫が必要?(いろいろやってみましたが上手くいかないので上記ソースでは$dbh=null;は記載してません) 2.RSSの記事取得のforeachに問題がある。  1個目のRSSは20個の記事があり、20個分はDBに登録できている。21個目を殻で登録しようとしてDBでエラーが出て止まっている可能性があるかもしれない。 (その他疑問点) 上記のようなプログラムの場合、データベース切断はどこに記載すれば良いのか? 1回だけの接続の場合は下記のような形だと思いますが、ループの中に入れ子になったような場合どうすれば良いのでしょうか。 try { } catch(PDOException$e) { print"Error!:".$e->getMessage()."<br>"; die(); }//catch_end $dbh=null;

    • ベストアンサー
    • PHP
  • MagpieRSSを使ってrss取得の際の表示件数

    MagpieRSSを使ってrssを取得したく下記のphpを作成しました。 <?php define('MAGPIE_OUTPUT_ENCODING','UTF-8'); require_once('rss_fetch.inc'); $url="xxxx.rdf"; $rss = fetch_rss($url); foreach($rss->items as $item){ foreach($item[dc] as $key => $daytime){ if($key == "date"){ $rssdate = strtotime("$daytime"); $today = strtotime(date("Y/m/d H:i")); } if($rssdate > $today){ print("$item[title]"); } } } ?> 過去から未来の予定が書いてあるRSS(rdf)があり、 現在の時間のデータを取得して、未来の予定のを表示したいです。 現在、print("$item[title]");で未来の予定がズラっと取得できる状態です。 そして、ここからが問題なのですが、 ここ(print("$item[title]");)の表示を最新の1件にしたいのですが、どうしてもうまくいきません。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPで一部サイトからRSS情報を取得できない

    PHPを使用して、他のサイトからRSS情報を取得し、 DBにデータを格納する、というような処理をするバッチを作成しています。 SimplePieという無料のライブラリを使用し、 下記のようなファンクションを作成しました。 /* ================= * * RSS情報を最大5件取得 * =================*/ function get_rss_info($feed_url) { // 戻り値 $rss_list = array(); // RSSデータを取得 $feed = new SimplePie(); $feed -> enable_cache(false); $feed -> set_feed_url($feed_url); $feed -> init(); $feed->handle_content_type(); // 過去記事を最大5記事まで取得 $feedItems = $feed -> get_items(0, 5); foreach($feedItems as $item) { // ※自作クラスです $rss = new RSS(); $rss->rss_id = $item -> get_id(); $rss->rss_title = $item -> get_title(); $rss->published_date = $item -> get_date('Y/m/d H:i:s'); $rss->rss_url = $item -> get_permalink(); $rss->rss_text = $item -> get_description(); array_push($rss_list, $rss); } return $rss_list; } 上記のファンクションで、アメブロなどのRSS情報は取得できますし、 一部WordPressサイトのRSS情報も問題なく取得することが出来ました。 しかし、一部のWordPressサイトでは、上記のファンクションを通しても 1つもRSS情報を取得することが出来ず、 配列も空のままで返却されてしまっております。 Feedlyなどの外部サービスで情報が取得できているので、 私のプログラムが悪いのだとは思っているのですが・・・ 自分なりに調査をしてみたのですが、 全く糸口を掴むことができませんでした。 お知恵を貸していただければと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • RSSをデータベースに格納できない

    昨日教えていただいたコードで格納して表示するところまで成功しました。 自分の不注意でデータベースネームと違う、新規作成したテーブルに格納していたため起こったエラーでした。申し訳ありません。 再度全体のコードと組み合わせてみたのですがエラーが起こり困っております。 Uncaught Error: Call to a member function insert() on null <?php $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf', ]; foreach ($url1 as $url) { $count = 0; $rss = simplexml_load_file($url); foreach ($rss->item as $item) { if ($count >= 8) { break; } ++$count; $title = (string) $item->title; //「$item->title」だけではうまくいかないのでstringにキャスト $link = (string) $item->link; //以下同じ $thumb = (string) $item->thumb->url; $content = (string) $item->description; $wpdb->insert('rssfeed', ['title' => $title, 'link' => $link, 'thumb' => $thumb, 'content' => $content], ['%s', '%s', '%s', '%s']); } } $results = $wpdb->get_results('SELECT * FROM rssfeed'); foreach ($results as $item) { echo $item->title.'<br>'; } ?> <?php $wpdb->show_errors(); ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう