複数の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.'">  '.$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.'">  '.$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;
お礼
host, dbname, user, passwordがすべて空欄なのは こういった大衆の目にデータベースの情報を流さない方がよいのではないか? といった考えから消去してソースコードを掲示しました。 大変失礼いたしました。 データベースに接続はでき、、 SELECT * FROM pg_tables WHERE tableowner='db'; はデータを取得をできているのですが、 $search =$dbh->query("SELECT * FROM $born"); のほうがエラーを出しているのです。