質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Atom(フォーマット)

Webサイトの見出しや要約などのメタデータを構造化して記述するXMLベースのフォーマット。

Q&A

解決済

1回答

665閲覧

【PHP】【RSS作成】最新記事のRSSフィードを自動で作りたい。【あと一歩】

tmo

総合スコア13

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Atom(フォーマット)

Webサイトの見出しや要約などのメタデータを構造化して記述するXMLベースのフォーマット。

0グッド

0クリップ

投稿2018/10/15 04:58

こんにちは。PHP初学者で、同じ箇所に3日以上悩んでしまったのでご相談させてください。

前提・実現したいこと

sqlにてデータベースより取得した値で、動的にRSS/ATOMフィードを作成したいと思っています。
データベースに入っている記事情報の最新15件を取得し、実行時にatom.xmlとして書き出したいです。

実際、書き出すことはできたのですが、2回目以降に実行時上書きがうまくいきません。

該当のソースコード

php

1 2<?php 3 4 5 try { 6 $db = new \PDO('mysql:host=localhost;dbname=hogehoge;charset=utf8', hogehoge, hogehoge); 7 $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 8 }catch (\PDOException $e) { 9 echo $e->getMessage(); 10 exit; 11 } 12 13 14 // SELECT文を変数に格納 15 $sql = "select * from main order by time desc LIMIT 15"; 16 17 // SQLステートメントを実行し、結果を変数に格納 18 $stmt = $db->query($sql); 19 20 // foreach文で配列の中身を一行ずつ出力 21 foreach ($stmt as $row) { 22 23 $dir = './'; 24 $fileName = 'atom.xml'; 25 26 // 出力のバッファリングを有効にする 27 ob_start(); 28?> 29 <entry> 30 <title><?php echo htmlspecialchars($row['title']) ;?></title> 31 <summary><?php echo htmlspecialchars($row['summary']) ;?></summary> 32 <id><?php echo htmlspecialchars($row['id']) ;?></id> 33 <link><?php echo htmlspecialchars($row['link']) ;?></link> 34 <updated><?php echo htmlspecialchars ($row['time']) ;?></updated> 35 <author><name>hogehoge</name></author> 36 </entry> 37 38 39 40<?php 41$output = $output . ob_get_contents(); 42ob_end_clean(); 43} 44 45file_put_contents($dir . $fileName , $output, FILE_APPEND | LOCK_EX); 46?>

試したこと

上記コードの、file_put_contents()にFILE_APPENDとしているので上書きされずに、延々と最新記事を書き足していってしまうのですが、FILE_APPENDを消すと「2」と出力される、自分にとって謎な現象が起こってしまいます。

foreach()の使い方がいけないのか、ob_start()の使い方がいけないのか、あらゆるパターンを試したつもりですが、うまくいきません。

解決する為の方法をご存知の方がいらっしゃいましたら、
お力をお貸しいただけると嬉しいです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/10/15 05:02

タイトルにはタグにある情報をわざわざ入れる必要はないかと。あと要件には関係ない(例えば「急ぎ」「初心者」など「あと1歩」もなんのことかわかりません)文言もないほうがいいですね。質問一覧から見た時に要件以外の文言があることで要件がくみ取りづらくなります。
m.ts10806

2018/10/15 05:05

再現確認のためにはデータベースの情報も必要です。CREATE文とサンプルデータのINSERT文もご提示ください。また「どのように出ているのが正解か」ゴールとなる形(今回はXMLの最終形)をご提示ください。ゴールがわからないと具体的なアドバイスは得られにくいです
tmo

2018/10/15 05:44

mts10806様 私の認識不足や、今回は初めてteratailの利用でわからない部分もあり、不完全な質問になってしまい申し訳ございませんでした。今回は、別の方に回答していただき、解決することができました。次回お世話になることがあれば、要件をうまく伝えられる質問にできるよう努めます。ありがとうございました。
m.ts10806

2018/10/15 05:45

質問は編集できるので適宜ご対応いただければと
guest

回答1

0

ベストアンサー

FILE_APPENDを消すと「2」と出力される

と書かれていますが、単に APPEND だけ消していませんか?
"|" も消して、以下で行けないですか?

file_put_contents($dir . $fileName , $output, LOCK_EX);

投稿2018/10/15 05:05

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmo

2018/10/15 05:41

ssasaki様 この度はご回答ありがとうございます。 おっしゃる通り"|"が原因で、"|"を削除したところ意図した挙動をしてくれました。 使用しているテキストエディタで"|"の色が目立っていたため、無意識的に残してしまっていました。 この度は、初めての質問で、情報も不十分な中ご回答ありがとうございました。 不必要な"|"があると「2」と出力されるというのには何か理由があるのかも、調べてみたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問