- ベストアンサー
RSSをMYSQLに入れる最適なコードがわからない
- RSSをMYSQLに入れる最適なコードがわからず困っています。insertを使用してRSSをテーブルに入れたいのですが、INSERT INTOはphpにいきなり書いてもエラーにならないのでしょうか?$を使用するほうの記載のほうが正しいのでしょうか?
- RSSのURLを配列に入れてsimplexml_load_file()でRSSをパース解析し、オブジェクトを取得します。その後、RSSの各要素を取得してテーブルにINSERTする方法が知りたいです。
- RSSをテーブルに入れるための最適なコードがわかりません。テーブル接続やRSSの取得方法までは理解していますが、INSERT文の記述方法がわからず困っています。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
「掲示したコード」と言うのは、私が掲示したコードと言う意味です。 「データベースへの接続が出来ました」が表示されていると言う事は、質問者さまのコードですね。 そちらの方は今しばらくお待ちください。 私としては、私のコードが質問者さまのローカルマシンで正常に動作するのかを試していただきたいので、以下のようにしてみてください。 ①テーブル「rssfeed」はWordPressのデータベースへ追加する ②私が掲示したコードにURLを設定して実行する ---- <?php $url1 = [ '', '', '', ]; 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>'; } ----
その他の回答 (9)
- dell_OK
- ベストアンサー率13% (766/5720)
PHPにSQL文を直接書いても実行されないのは、その方の言われる通りですが、それは本質問当初のコードに対してのことで、現在は文字列として書いているので問題ありません。 $stmt = $dbh->prepare('insert into hlxclitx_feed_rss (post_thumbnail, site_title, link,description) values (?, ?, ?, ?)'); このSQLを見て思うのは、テーブル名が本当に「hlxclitx_feed_rss 」なのかと言うことです。 データベース名とテーブル名を混同されているような気もしています。 phpMyAdminのSQLタブで、以下のSQLを実行して成功するか試してみてください。 insert into hlxclitx_feed_rss (post_thumbnail, site_title, link,description) values ('a', 'b', 'c', 'd');
お礼
wp-config.phpを確認したところ /** The name of the database for WordPress */ define( 'DB_NAME', 'hlxclitx_wp1' ); /** MySQL database username */ define( 'DB_USER', 'hlxclitx_wp1' ); となっておりますので、間違いはないと思うんですが…
補足
エラー SQL クエリ: insert into hlxclitx_feed_rss(post_thumbnail,site_title,link,description)values('a','b','c','d') MySQL のメッセージ: ドキュメント #1146 - 表 'hlxclitx_feed_rss.hlxclitx_feed_rss' は存在しません。と出てきました。 インデックスが定義されていません! パーティションが定義されていない! この辺りは関係ないのでしょうか?
- dell_OK
- ベストアンサー率13% (766/5720)
回答No.7にいただいたお礼は「現在サポートで確認中」とのことで私には読めていませんが、何か重要なことを書かれてましたでしょうか。 補足 2022/01/15 19:19 INSERTに失敗しているようですね。 なのでRSS1.0の問題ではないと思います。 補足 2022/01/15 19:59 私の方ではデータベースに保存されていました。 質問者さまの方では危惧されていたようにINSERTに失敗してるようですね。 お礼 2022/01/15 23:28 「hlxclitx_wp1」はデータベース名だと思います。 どのデータベースにどのテーブルが存在していないのかを示しているエラーのようです。 私が言っていた「WordPressのデータベース」とはこの「hlxclitx_wp1」のことです。 このデータベースに「rssfeed」を作成する必要があります。 お礼 2022/01/15 23:34 エラーの状況から察すると、「rssfeed」を作成されたのは別のデータベースではないでしょうか。
お礼
別の方が言われたとおりもしかするとINSERT INTOはphpでは扱えないのではないでしょうか? 「INSERT INTO」はSQLの命令で、PHPの命令では無いので直接書いても実行されません。 PDOを使われているようなので、文字列変数にSQL文を入れて、それをPDOに渡して下さい。
補足
回答No.7にいただいたお礼は「現在サポートで確認中」とのことで私には読めていませんが、何か重要なことを書かれてましたでしょうか。 A.RSSの中身を記述したので確認中となっているのだと思われます。 「hlxclitx_wp1」はデータベース名だと思います。 どのデータベースにどのテーブルが存在していないのかを示しているエラーのようです。 私が言っていた「WordPressのデータベース」とはこの「hlxclitx_wp1」のことです。 このデータベースに「rssfeed」を作成する必要があります。 A.wordpressのデータベースに作成していますがエラーが出ております。 調べてみたのですが、Larabelの解決法しかありませんで視野。 ※以下Larabel解決コード プロジェクトのappディレクトリ配下にある「モデル名.php」のファイルを編集し、 使いたいテーブル名を指定してあげます。 <?php namespace App; use Illuminate\Database\Eloquent\Model; class YourModel extends Model { // 参照させたいSQLのテーブル名を指定してあげる protected $table = 'your_table'; } と書いてあるのですが、これをphpに置き換えた際のコード修正がわかりかねます…
- dell_OK
- ベストアンサー率13% (766/5720)
補足のコードを試してみました。 2箇所を修正するとそれなりに実行できました。 ①「$desW」のでどころがわからないので以下の3行はコメントにしました。 ※私の環境はPHP7.4.3で、未定義変数はエラーになる設定のため。 if (0 != $desW) { $site_description = mb_strimwidth($site_description, 0, $desW, '…', 'utf-8'); } ②「$count = 0」→「$count = 0;」 セミコロンがないので、次の「foreach」でエラーになりました。
お礼
エラー内容を調べたところ以下の内容が出ました。 WordPressデータベースエラー: [テーブル 'hlxclitx_wp1.rssfeed'は存在しません] SHOW FULL COLUMNS FROM `rssfeed` テーブル名の初めにhlxclitx_wp1.がついているのですがこれはなぜでしょうか? コードは組んでいただいたものを使用しています。
補足
試していただきありがとうございます。 確認なのですがデータベースに値は保存されていましたでしょうか? 自分のほうでは空データが帰ってきており同様に失敗でした。 セミコロンはすみません抜けておりました。
- dell_OK
- ベストアンサー率13% (766/5720)
何も表示されないのは以下のどれかが原因ですね。 ①RSSが取得できていない ②データベースに保存できていない ③データベースから取得できていない ①かどうかは、取得したものを直接表示してみましょう。 ②かどうかは、INSERTした件数を表示してみましょう。 phpMyAdminでテーブルの内容を確認してもわかりますね。 ③かどうかは、INSERTに成功していたとして、中身が空白にかも知れないので、固定文字を表示してみましょう。 以下のコードで試してみてください。 URLの定義は省略していますので、それ以降を変更してみてください。 ②は成功したら「DB挿入:1」、失敗したら「DB挿入:」になります。 ーーーー 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; echo 'RSS取得:'.$item->title.'<br>'; $insert_row_count = $wpdb->insert('rssfeed', ['title' => $title, 'link' => $link, 'thumb' => $thumb, 'content' => $content], ['%s', '%s', '%s', '%s']); echo 'DB挿入:'.$insert_row_count.'<br>'; } } $results = $wpdb->get_results('SELECT * FROM rssfeed'); foreach ($results as $item) { echo 'DB取得:'.$item->title.'<br>'; } ーーーー
お礼
確認コードまで作成いただきありがとうございます。 以下のコードが表示されました。 RSS取得:【悲報】「色盲」という言葉、廃止される。「色覚多様性」に DB挿入: RSS取得:【東大刺傷】逮捕された名古屋の17歳少年「勉強がうまくいかず死のうと思った」 DB挿入: RSS取得:コロナ感染で男性器の「サイズが縮小」との報告相次ぐ ある男性は「約3.8センチ短くなった」と告白 DB挿入: RSS取得:【悲報】「JKを痴漢しまくっても通報されない」「痴漢祭り」…大学入学共通テスト前、ネット上で受験生標的の『痴漢予告』相次ぐ DB挿入: RSS取得:【悲報】大阪ビル放火の谷本盛雄容疑者 スマホの電話帳0件だった DB挿入: RSS取得:大阪ビル放火犯、口座残高0円だった 生活保護の申請却下、税金滞納で土地建物差し押さえ 困窮か DB挿入: RSS取得:宮迫博之が牛宮城訪れた支援者ラファエルに試食ドッキリ スーパーの肉を提供 DB挿入: RSS取得:【江戸川区】19歳少女に殺された元カレ、アメリカ人に寝取られ、家賃光熱費を払っている自分の家を追い出されていた DB挿入: RSS取得:【悲報】宮迫牛宮城の正体、ヤバすぎるwwwwwwwww DB挿入: RSS取得:大井町のヤクザ事務所の中がヤバすぎるwwwwwwwwwwww DB挿入: RSS取得:【閲覧注意】脱輪タイヤが歩行者にぶつかった事故、心臓の大動脈が切れて骨が折れまくりだった DB挿入: RSS取得:【画像】NARUTOの我愛羅の砂漠送葬とかいうエグい技 DB挿入: RSS取得:【悲報】山瀬まみさん、長いことやってたレギュラー番組が次々と終わる DB挿入: RSS取得:松本潤さん、火の玉ストレートwwwwwww DB挿入: RSS取得:【悲報】漫画村壊滅→被害額4・8倍に急拡大 DB挿入: RSS取得:【悲報】大学生、軽自動車で反対車線にはみ出しトラックと衝突し意識不明の重体 DB挿入: RSS取得:【悲報】AVのレビュー欄にブチギレ大阪人現るwwwwwwwwww DB挿入: RSS取得:マリトッツォブームが終わるも、早速次の刺客が放たれるwwwwwwwwww DB挿入: RSS取得:雪降ろしの為に屋根に出ようとした男性、スコップの柄にパーカーが引っかかり死亡 DB挿入: RSS取得:【悲報】アニポケさん、新年1発目から頭にアルミホイルをネタにしてしまう (画像あり) DB挿入: RSS取得:【画像】日本の階級社会ピラミッド、マジで怖い… DB挿入: RSS取得:ゲーム会社 「一方的にアイデアを送りつけてきて、類似点があると権利を主張する人がいる」 DB挿入: RSS取得:【悲報】タイヤが歩行者にぶつかった事故、心臓の大動脈が切れて骨が折れまくりだった DB挿入: RSS取得:【速報】東大前で受験生3人を刺した高校生 「勉強がうまくいかず死のうと思った」 DB挿入: WORDOPRESSを扱わないほうで取得表示はできましたので原因はおそらく格納だと思われます。RSS1.0を使用しているのが問題なんですかね… dbは返り値が空でしたと表示されています。
補足
WORDPRESSを扱わないほうと似ていますね、こちらも修正しつくしたのですが取得できません。 INSERTが悪さしてるとしか思えないんですよね。こちらも同様に格納の段階ではじかれてますので。 <?php $url1 = [ '', '', '',]; // insertの準備 $stmt = $dbh->prepare('insert into hlxclitx_feed_rss (post_thumbnail, site_title, link,description) values (?, ?, ?, ?)'); // URLのループ開始 foreach ($url1 as $url) { if (($rss = @simplexml_load_file($url)) === false) continue; // URL固有のデータを取得(これ、全部必要なの?そもそも全部存在するの?) // サイトの内容を個別記事の内容は変数名を変えないとダメ(上書きされてしまう) $site_thumbnail= $rss->channel->thumb; $site_title = $rss->channel->title; $site_link = $rss->channel->link; $site_description = $rss->channel->description; $site_description = strip_tags($site_description); if ($desW != 0) $site_description = mb_strimwidth($site_description, 0, $desW, "…",'utf-8'); $site_thumb = '/images/dummy_thumbnail.jpg'; // サイトごとに表示するなら、サイトタイトル表示はこの位置 printf('<h2>%s</h2>', $site_title); $count = 0 // 個別記事のループ開始 foreach ($rss->item as $item) { if (++$count > 8) break; $thumb = $item->thumb; $title = $item->title; $link = $item->link; $description = $item->description; $dc = $item->children('http://purl.org/dc/elements/1.1/'); $date = date('Y-m-d H:i:s', strtotime($dc->date)); // データを取得し終えたら、その内容を executeメソッドで書き込む $stmt->execute([$site_thumbnail, $site_title, $link, $description]); // 取得した記事データの表示 if ($count === 1) print('<ul>'); printf('<li>%s:%s:%s</li>', $title, $link, $date); } // 個別記事のループ終了 if ($count) print('</ul>'); } // URLのループ終了 ?>
- dell_OK
- ベストアンサー率13% (766/5720)
そうです。 データベースへの接続はWordPressに任せる方法です。
お礼
分けて投稿してしまいすみません。エラー確認はこちらで行ってます。 $wpdb->insert('rssfeed', ['title' => $title, 'link' => $link, 'thumb' => $thumb, 'content' => $content], ['%s', '%s', '%s', '%s']); $wpdb->print_error(); $wpdb->show_errors(); この部分がエラーの原因になっているようです。 hlxclitx_wp1.
補足
確認コードまで作成いただきありがとうございます。 以下のコードが表示されました。 投稿内容は伏せますが表示されております。 RSS取得:投稿内容(伏せているが表示されている) DB挿入: RSS取得:投稿内容(伏せているが表示されている) DB挿入: …etc WORDOPRESSを扱わないほうで取得表示はできましたので原因はおそらく格納だと思われます。RSS1.0を使用しているのが問題なんですかね… dbは返り値が空でしたと表示されています。
- dell_OK
- ベストアンサー率13% (766/5720)
お礼になかなか気づかなくて、 あえなく新たな質問をさせてしまったようで、 すみませんでした。 OKWAVEでは、 質問者の追記投稿はお礼と補足の2回しかないため、 回答者に見てもらうために新たに質問するしかないのが難点ですね。 あちらの質問がもし私宛でしたら、いったん取り消してください。 phpMyAdminは使えるようですので、 SQLタブでこのまま実行していただければよかったです。 CREATE TABLE `rssfeed` ( `title` text NOT NULL, `link` text NOT NULL, `thumb` text NOT NULL, `content` text NOT NULL ) 説明しておくと、 テーブル名は「rssfeed」でテーブルネームも同じ意味です。 カラム名は「title」「link」「thumb」「content」です。 「text」と言うのはデータ型です。 あちらの質問の画像を見ると「int」になっているので、 構造タブから変更してください。 「NOT NULL」は制約と呼ばれるもので、 このカラムには「NULLを許容しない」と言う意味です。 構造タブで見るとNULLが「いいえ」となっているのがそのことです。 phpMyAdminで手動で作成すると既定でこうなります。 あと、あちらの質問の$wpdbがnullになっている件ですが、 WordPress内でやられていないからだと思います。 提示したコードはテーマ内の「index.php」をあれだけにして試してください。 既存の「index.php」があると思いますので、 それはどこかへバックアップをとっておいて試してください。 テーブルもWordPressのデータベースに追加してください。 まずは、それで試してみていただけますか。 WordPressから他のデータベースへアクセスする方法はわからないのでそのことは今は置いておきます。 PHPのソースのことだけで言うと、 $wpdbを使いたいけど、 WordPressではないところでやりたいのでしたら、 こんな感じででもできるかと思います。 WordPressのディレクトリ C:\xampp\htdocs\wordpress 任意のディレクトリ(私はいつもここで試しています) C:\xampp\htdocs\test 例えば「rss.php」と言うファイルを任意のディレクトリに作って、 前回提示したコードをまるまる入れます。 で、先頭の<?phpの次の行に以下を追加します。 require_once("../wordpress/wp-load.php"); 「wp-load.php」を参照する必要があることは、 質問者さまも調べられて理解されているとは思います。 "../wordpress/wp-load.php"の最初の「../」は、 自分の場所から見てひとつ上のフォルダと言う意味です。 つまり「C:\xampp\htdocs\」です。 続けて「wordpress/wp-load.php」があることで、 「C:\xampp\htdocs\wordpress/wp-load.php」を参照することになります。 「\」と「/」を混在して記述しましたが、無視してください。
お礼
すみません。RSSのURLが空の状態で実行していました。 改めてファイルの編集を終わらせたところ画面が白紙になっており、データベースへの接続が出来ましたという文言のみ表示されております…
補足
こちらこそ何度も方法を変えてしまい申し訳ないです。 質問は取り消しさせていただきました。 テーブル名、テーブルネーム両方rssfeedで統一したしました。 カラム名は「title」「link」「thumb」「content」で確認いたしました。 データ型を「int」から「text」に変更いたしました。 「NOT NULL」で確認しました。 「index.php」をコピーした後にコードをすべて消し該当のコードのみにいたしました。 Wordpressで今回は作成いたしますので、そちらを優先いたします。 php.iniで確認いたしましたところ、複数のエラーが出ております。 Q1.Warning: simplexml_load_file(): I/O warning : failed to load external entity "" in /home/hlxclitx/public_html/wp-content/themes/sample_theme/index.php on line 29 Q2.Warning: simplexml_load_file(): I/O warning : failed to load external entity "" in /home/hlxclitx/public_html/wp-content/themes/sample_theme/index.php on line 29 Q3.Warning: simplexml_load_file(): I/O warning : failed to load external entity "" in /home/hlxclitx/public_html/wp-content/themes/sample_theme/index.php on line 29 ※該当箇所 $rss = simplexml_load_file($url); Q4.Warning: Invalid argument supplied for foreach() in /home/hlxclitx/public_html/wp-content/themes/sample_theme/index.php on line 30 Q5.Warning: Invalid argument supplied for foreach() in /home/hlxclitx/public_html/wp-content/themes/sample_theme/index.php on line 30 ※該当箇所 foreach ($rss->item as $item) { エラー文の意味を調べております。
- dell_OK
- ベストアンサー率13% (766/5720)
では、もうWordPress内ではやられてないと言うことでしょうか。 私は私で興味があったので、WordPress内でのRSS取得とデータベースへの保存を試みてみました。 まずはテーブル「rssfeed」の追加です。 phpMyAdminから以下の構造になるよう手動で作成しました。 ---- CREATE TABLE `rssfeed` ( `title` text NOT NULL, `link` text NOT NULL, `thumb` text NOT NULL, `content` text NOT NULL ) ---- データベースへのアクセス方法ですが、「wpdb クラスのメソッドに直接アクセスしてはいけない」の情報元はさておき、WordPressの関数リファレンスに似たような文言がありました。 「wpdb クラスのメソッドを直接呼び出すことはできません。代わりにグローバルの$wpdb オブジェクトを使用してください!」 https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class つまり、wpdbクラスを直接使うのではなく、オブジェクトを使用すればよいとのことです。 オブジェクトとは、インスタンスとも呼ばれるもので、「new wpdb()」したもののこと、つまり「$wpdb」です。 これはWordPressがどこかで先にやってくれているので、どこでも使えます。 本題のRSSの取得とデータベースへの保存、ついでにちょっと表示してみます。 テーマ内の「index.php」です。 関数にしていないので「global $wpdb;」なしでも大丈夫でした。 ---- <?php $url1 = [ '', '', '', ]; 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>'; } ---- こんな感じで思ったより簡単にできました。
お礼
wordpressのパターンも試してみます。 <?php $hoge = 1; ?> <div class="img-wrap2"> <?php $args = array( 'post_type' => "post", ); $wp_query->query($args);?> <?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?> <?php if ( $hoge % 3 == 2) $title = get_the_title(); ?> <?php if ( $hoge % 3 == 1 && $hoge != 1 ): ?> </div> <h2><?php echo $title; ?></h2> <?php if ( $hoge % 15 == 1) get_rss_feed(); ?> <div class="img-wrap2"> <?php endif; ?> <div> <?php get_one_post();?> </div> <?php $hoge++; ?> <?php endwhile; ?> </div> <h2><?php echo $title; ?></h2> <?php function get_one_post() { ?> <!--サムネイルを追加--> <a href="<?php echo get_permalink(); ?>"> <span class="img-wrap"> <!--画像を追加--> <?php // アイキャッチ画像の確認 if (has_post_thumbnail()) { // 存在する the_post_thumbnail(); } else { // 存在しない echo '<img src="noimage.jpg">'; } ?> </span> <!--日付けを追加--> <div class="post-meta2"><div class="img-wrap3"> <?php the_time('Y/m/d'); ?></div> <!--リンククラス付きのカテゴリーを追加--> <?php $categories = get_the_category(); if ($categories) { echo '<ul>'; foreach ($categories as $category) { echo '<li class="cat1"' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>'; } echo '</ul>'; } ?> <!--リンククラス付きのコメント数を追加--> <?php $num_comments = get_comments_number(); if ($num_comments == 0) { $comments = __('No Comments'); // } elseif ($num_comments > 1) { $comments = $num_comments . __(' Comments'); // } else { $comments = __('1 Comment'); // } $write_comments = '<span class="singlecomments"><a href="' . get_comments_link() . '">' . $comments . '</a></span>'; echo $write_comments; ?></div> <!--リンククラス付きのコメントの抜粋を追加--> <div class="img-wrap4"> <?php the_excerpt(); ?></div> <!--リンククラス付きの記事を読むを追加--> <div class="img-wrap5"> <a href="<?php the_permalink(); ?>">記事を読む</a> </div> <?php } ?> <?php function get_rss_feed(){ ?> <!--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,$pass); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage(); exit; } $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; //itemを取り出して$rssに渡す $item = $rss->channel->item; // RSSアイテム取得 値の代入 自作関数 //SQL文を実行、結果を求める $stmt = $pdo->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)]; } } ?> <?php } ?> <!--//ループ2--> <?php $hoge = 1; ?> <div class="img-wrap2"> <?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?> <?php if ( $hoge % 3 == 2) $title = $wp_query->get_the_title(); ?> <?php if ( $hoge % 3 == 1 && $hoge != 1 ): ?> </div> <h2><?php echo $title; ?></h2> <div class="img-wrap2"> <?php endif; ?> <div class="post"> <?php get_one_post();?> </div> <?php $hoge++; ?> <?php endwhile; ?> </div> <?php echo $title; ?>
補足
あれからコードを知恵袋で教わりながら何とか形にはなりました。 <!--正常に3件ごとに画像タイトルが表示されていたコード--> <?php $hoge = 1; ?> <div class="img-wrap2"> <?php $args = array( 'post_type' => "post", //投稿タイプ設定 ); $wp_query->query($args);?> <?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?> <?php if ( $hoge % 3 == 2) $title = get_the_title(); ?> <?php if ( $hoge % 3 == 1 && $hoge != 1 ): ?> </div> <h2><?php echo $title; ?></h2> <?php if ( $hoge % 15 == 1) get_rss_feed(); ?> <div class="img-wrap2"> <?php endif; ?> <div> <?php get_one_post();?> </div> <?php $hoge++; ?> <?php endwhile; ?> </div> <h2><?php echo $title; ?></h2> <?php function get_one_post() { ?> <!--サムネイルを追加--> <a href="<?php echo get_permalink(); ?>"> <span class="img-wrap"> <!--画像を追加--> <?php // アイキャッチ画像の確認 if (has_post_thumbnail()) { // 存在する the_post_thumbnail(); } else { // 存在しない echo '<img src="noimage.jpg">'; } ?> </span> <!--日付けを追加--> <div class="post-meta2"><div class="img-wrap3"> <?php the_time('Y/m/d'); ?></div> <!--リンククラス付きのカテゴリーを追加--> <?php $categories = get_the_category(); if ($categories) { echo '<ul>'; foreach ($categories as $category) { echo '<li class="cat1"' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>'; } echo '</ul>'; } ?> <!--リンククラス付きのコメント数を追加--> <?php $num_comments = get_comments_number(); if ($num_comments == 0) { $comments = __('No Comments'); // } elseif ($num_comments > 1) { $comments = $num_comments . __(' Comments'); // } else { $comments = __('1 Comment'); // } $write_comments = '<span class="singlecomments"><a href="' . get_comments_link() . '">' . $comments . '</a></span>'; echo $write_comments; ?></div> <!--リンククラス付きのコメントの抜粋を追加--> <div class="img-wrap4"> <?php the_excerpt(); ?></div> <!--リンククラス付きの記事を読むを追加--> <div class="img-wrap5"> <a href="<?php the_permalink(); ?>">記事を読む</a> </div> <?php } ?> <?php function get_rss_feed(){ ?> ※ここから自作したコード <?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,$pass); $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に渡す $item = $rss->channel->item; // RSSアイテム取得 値の代入 自作関数 //SQL文を実行、結果を求める $stmt = $pdo->prepare('insert into teblename (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)]; ?> <?php } ?>
- t_ohta
- ベストアンサー率38% (5238/13705)
「INSERT INTO」はSQLの命令で、PHPの命令では無いので直接書いても実行されません。 PDOを使われているようなので、文字列変数にSQL文を入れて、それをPDOに渡して下さい。 あと、DBのパスワードは隠した方がいいですよ。
補足
パスワードは大変失礼しました。 INSERT INTOはDBで使用するものなんですね。ご指摘ありがとうございます。 以下のコードの下に追記してみたのですが、間違いがありましたらご指摘いただけると助かります。 $title = $item->title; // タイトル $link = $item->link; // リンク $thumb = $item->thumb->url; // アイキャッチサムネイル $content = $item ->description;// 詳細、必要なのか不明 ※追記したコード //文字列変数(テーブル名)をSQL文を入れる $sql = 'title, link,thumb,content'; //PDOに渡すから$sqlという認識 $sql= $pdo->prepare('INSERT INTO '.$DB_table_name.' (title,link,thumb,content) VALUES (:title,:link,:thumb,content)'); //エラーを出さずに実行するためにはテーブル名のバインドをやめて、直接埋め込むしかありません。ここで各テーブルに値を入れる? $sql->bindParam(':title', $title, PDO::PARAM_STR);//STR は「文字列だよ」って事。 $sql->bindParam(':link', $link, PDO::PARAM_STR);//URLがSTRだったのでおそらくPARAM_INTではない $sql->bindParam(':thumb', $thumb, PDO::PARAM_STR);//画像はわからない $sql->bindParam(':content', $content, PDO::PARAM_STR); $sql->execute();
- dell_OK
- ベストアンサー率13% (766/5720)
WordPressでのお話しでしたら、まずそれ用のテーブルを作成する必要があります。 「WordPress 独自テーブル」などで検索するとその方法が見つかります。 いくつか見てみたのですが、人によってやり方が違うようなので、3つぐらいは一通り読んでみて、どれができそうかよさそうかを検討してから、とりかかってみてください。 SQL文を直接書くよりは、WordPressの記述にのっとった方法がいいとは思います。 データベース接続などはWordPressに任せておけば省略できるので、いろいろと楽、と言うか、自分のコードミスを最小限にできます。 とは言っても、WordPressのデータベースアクセスについては、それなりに理解しておく必要があると思いますが、それらについては、先の検索した情報からある程度学べるかと思います。
お礼
少し遅れました。すみません。 CREATE TABLE `rssfeed` ( `title` text NOT NULL, `link` text NOT NULL, `thumb` text NOT NULL, `content` text NOT NULL ) についてお聞きしたいのですが、 テーブルネーム rssfeed テーブルの名前が text NOT NULL カラム名がtitle、link、thumb、contentでよろしいでしょうか? 自分でも組んでみたのですが、うまくいかずこちらの方法で実装させていただければ助かります。
補足
以前の質問の際も教えていただきありがとうございました。 サーバー費用の問題でライブラリを使用できずデータベースを自作することにしたのですが、wordpressの機能を使いDB操作ができることは知りませんでした。早速調べてみたのですが、無知なためセキュリティの不安があります。 調べた情報によると、 WordPress には、データベースを操作するための wpdb クラスが用意されている。 $wpdb は、 wpdb クラスのインスタンスである。 wpdb クラスのメソッドに直接アクセスしてはいけない。 とありwp-load.phpを経由する必要があるようです。 // wp-load.php を読み込んでいない場合、 require_once ( dirname(__FILE__) . "/wp-load.php"); global $wpdb; load.phpはドキュメントルート内に設置ができない(ファイルが丸見えになるため)、使用する予定のレンタルサーバーでは使うことができません。 しかし、テーマ配下のindex.phpやfunctions.phpで使用する場合はwp-load.phpを読み込んでいない方もおられるようで、どちらが正しいのか正確にはわかりかねますが…
お礼
提示されたコードを使用したのですが画面に何も表示されていない状態です。
補足
1つお聞きしたいのですが、下記のコードを使用せずにデータベースにつなげるということでしょうか? 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; }