duronのプロフィール

@duron duron
ありがとう数99
質問数0
回答数133
ベストアンサー数
73
ベストアンサー率
77%
お礼率
0%

勉強のために無い知恵絞って回答考えてます。 今は主にPHPを勉強中。

  • 登録日2010/05/24
  • 性別男性
  • 複数の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
    • hpmt28
    • 回答数2
  • データ入力条件

    RSSを元にデータベースを作成予定です。 $db=new PDO("mysql:host=localhost;dbname=database",$dbuser,$dbpass); $rss=simplexml_load_file("http://rss.rssad.jp/rss/itmlifestyle/2.0/camera.xml"); for($i=0;$i<count($rss->item);$i++) { $title[$i]=$rss->item[$i]->title;//タイトル抽出 $url[$i]=$rss->item[$i]->link;//リンク先抽出   //▼▼▼▼▼検索させるクエリ発行▼▼▼▼▼ $search=$db->prepare("SELECT * FROM rss where title = ?"); $res[$i]=$search->execute(array($title[$i]));   //検索結果が偽の場合 if(!$res[$i]) { $INSERT=$db->prepare("INSERT INTO rss(url,title) VALUES(?,?)"); $INSERT->execute(array($url[$i],$title[$i])); } } RSSよりリンクとタイトルを読み込み、DBに入力する際、既に登録されている値(タイトル)がある場合は重複させないよう、登録せず、無い場合は登録をさせようとしています。 こちらが上手く作動しません。 何処がおかしいのか大体探ってみると$res[$i]の部分がいつもtrueの真偽値になっており、判別が出来ず、登録も滅茶苦茶になってしまいます。 登録されている値と重複する場合は登録せず、新しい値のみを登録させることは出来ますよね? 持ってくるRSSの情報が多いと失敗するのか、これまた1個づつなら可能なんでしょうか? ややこやしいですが、どちらかご教授お願い致します。

    • ベストアンサー
    • PHP
  • データ入力条件

    RSSを元にデータベースを作成予定です。 $db=new PDO("mysql:host=localhost;dbname=database",$dbuser,$dbpass); $rss=simplexml_load_file("http://rss.rssad.jp/rss/itmlifestyle/2.0/camera.xml"); for($i=0;$i<count($rss->item);$i++) { $title[$i]=$rss->item[$i]->title;//タイトル抽出 $url[$i]=$rss->item[$i]->link;//リンク先抽出   //▼▼▼▼▼検索させるクエリ発行▼▼▼▼▼ $search=$db->prepare("SELECT * FROM rss where title = ?"); $res[$i]=$search->execute(array($title[$i]));   //検索結果が偽の場合 if(!$res[$i]) { $INSERT=$db->prepare("INSERT INTO rss(url,title) VALUES(?,?)"); $INSERT->execute(array($url[$i],$title[$i])); } } RSSよりリンクとタイトルを読み込み、DBに入力する際、既に登録されている値(タイトル)がある場合は重複させないよう、登録せず、無い場合は登録をさせようとしています。 こちらが上手く作動しません。 何処がおかしいのか大体探ってみると$res[$i]の部分がいつもtrueの真偽値になっており、判別が出来ず、登録も滅茶苦茶になってしまいます。 登録されている値と重複する場合は登録せず、新しい値のみを登録させることは出来ますよね? 持ってくるRSSの情報が多いと失敗するのか、これまた1個づつなら可能なんでしょうか? ややこやしいですが、どちらかご教授お願い致します。

    • ベストアンサー
    • PHP
  • データ入力条件

    RSSを元にデータベースを作成予定です。 $db=new PDO("mysql:host=localhost;dbname=database",$dbuser,$dbpass); $rss=simplexml_load_file("http://rss.rssad.jp/rss/itmlifestyle/2.0/camera.xml"); for($i=0;$i<count($rss->item);$i++) { $title[$i]=$rss->item[$i]->title;//タイトル抽出 $url[$i]=$rss->item[$i]->link;//リンク先抽出   //▼▼▼▼▼検索させるクエリ発行▼▼▼▼▼ $search=$db->prepare("SELECT * FROM rss where title = ?"); $res[$i]=$search->execute(array($title[$i]));   //検索結果が偽の場合 if(!$res[$i]) { $INSERT=$db->prepare("INSERT INTO rss(url,title) VALUES(?,?)"); $INSERT->execute(array($url[$i],$title[$i])); } } RSSよりリンクとタイトルを読み込み、DBに入力する際、既に登録されている値(タイトル)がある場合は重複させないよう、登録せず、無い場合は登録をさせようとしています。 こちらが上手く作動しません。 何処がおかしいのか大体探ってみると$res[$i]の部分がいつもtrueの真偽値になっており、判別が出来ず、登録も滅茶苦茶になってしまいます。 登録されている値と重複する場合は登録せず、新しい値のみを登録させることは出来ますよね? 持ってくるRSSの情報が多いと失敗するのか、これまた1個づつなら可能なんでしょうか? ややこやしいですが、どちらかご教授お願い致します。

    • ベストアンサー
    • PHP
  • PHPのmail関数で送信者を設定できません

    // 表題 $subject = $_POST['news_title']; // 本文 $message = ' <html> <head> <title>'.$_POST['news_title'].'</title> </head> <body> '.$_POST['textarea_id'].' </body> </html> '; // HTML メールを送信するには Content-type ヘッダが必須 $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; // 追加のヘッダ $headers .= 'To: '.$user_name.'<'.$email.'>'. "\r\n"; //$headers .= $_POST['news_title'] . "\r\n"; $headers .= 'From: 姓名 <myname@mymail.com>' . "\r\n"; // 送信する if(mail($to, $subject, $message, $headers)){$mes .= $email.'にメールを送信しました。 ';}else{$mes .= $email.'にメールを送信する際にエラーが発生しました。 ';} (後略) のようなコードになっていますが。$headersでFrom:を設定したのに、受信するメールには、送信者として、なになに@box450.bluehost.comが表示されます。どうやって正しく送信者を設定できるのでしょうか 因みにapacheのhttpd.confやPHPのphp.iniを変更できません。 わかる方がいらっしゃいましたら、ご回答をよろしくお願いします。

    • ベストアンサー
    • PHP
    • 2B2B
    • 回答数2