- ベストアンサー
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)]; } } ?>
- みんなの回答 (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])); ----------------- などとして、実際にどうなっているのか画面上で確認されたほうがよろしいかと思います。
お礼
この部分がどうしてもわからないのですが、 RSSアイテムを取得するコードが間違っている気がするのでしょうが、どうでしょうか? //itemを取り出して$rssに渡す $date = $rss->channel->date; // RSSアイテム取得 値の代入 自作関数 ※channelが2つあり奇妙なんですが… それぞれの役割がだぶついていないのか心配です。 // RSSタイトルがほしいから、もらったrssを渡す $site_title = $rss->channel->title;
補足
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を出力できると聞いたのですが。通常は不可能なのでしょうか?