• 締切済み

foreachのスコープ

while(0<$i<count($html)) { foreach($html->find('title') as $title) { global $title; } foreach($html->find('img a')as $url) { global $link=$url->href; $link=mb_convert_encoding($url,"utf8","euc-jp"); var_dump($link);//この変数をスコープ範囲外でDBに登録したい } $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $stt=$db->prepare('insert into links(name,url) VALUES(?,?)'); $stt->execute(array($title,$link)); } ------------------------------------------------------------------------- 上記を行いたくコードを記述してましたが$linksの部分に何もなく、DB登録することが出来ませんでした。原因を探すために検索したところ、関数の範囲内の変数のスコープに問題があることがわかりました。外部から内部変数へのアクセス(参照)は不可能なのでしょうか?現在のままだと「$url」が文字列ではない状態なので登録できないと考えております。事実文字列の「$title」はDBに登録出来るのですが$linkのみ値が何も入ってない状態で登録されてしまいます。 スコープの範囲内であれば当然var_dump($link)は表示されます。 使ってるライブラリは「simple html dom parser」で、抽出は完了しています。 この「$link」というのは文字列ではない状態なので文字列変換させる関数に直せばDB登録できるのでしょうか?それならばstrvalまたは__toString関数を他に作っておいてそれを使えば可能なのでしょうか? どなたかご教授頂けませんでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

ぱっと見、その$linkへ値を放り込んでる$urlがforeachの中に入ってるよね? こいつのスコープのせいじゃない? 一端、何もしないでforeachの外側で用意したらどうなるかな($linkとか$urlを)

atlantic32
質問者

補足

ご返答、有難う御座います。 whileの外側(関数も何も無い)、whileの内側且つforeachの外側でglobal宣言してみましたが DB登録できませんでした。スコープの問題なのか、オブジェクトの問題(変数の型)なのか わかりません。

関連するQ&A

  • PDOで取得される値がすべて文字列になる

    xamppを標準インストールした環境にてPHPのPDOを利用したデータベース処理を試しているのですが、SELECTで取得した値がすべて文字列として返されます。 $db = new PDO("sqlite:sample.db"); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $rs = $db->query("select 1 as res"); $rs = $rs->fetch(); 結果: array(1) ( [res] => (string) 1 ) これに加え、やや強引なテストを行ってみたのですが、こちらも結果は同じく文字列となりました $db = new PDO("sqlite:sample.db"); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $rs = $db->prepare("select ? as res"); $rs->bindValue(1, 1, PDO::PARAM_INT); $rs->execute(); $rs = $rs->fetch(); この現象を回避するにはどのようにすればよいでしょうか。

    • ベストアンサー
    • PHP
  • DB接続の関数化

    下記のデータベースに接続する関数の意味は「MySQLに接続して、PDOクラスで接続したデータベース情報を返す」で合っていますか? function get_db_connect(){ // MySQL用のDSN文字列 $dsn = 'mysql:dbname='. DB_NAME .';host='. DB_HOST .';charset='.DB_CHARSET; try { // データベースに接続する $dbh = new PDO($dsn, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (PDOException $e) { exit('接続できませんでした。理由:'.$e->getMessage() ); } return $dbh; }

    • ベストアンサー
    • PHP
  • XMLの空白要素をJavascriptのif文で条件分けする

    JavascriptもXMLも始めたばかりの者です。 分からないことがあり、皆様にご教授頂ければと思い投稿しました。 XMLで生成したファイルから各要素を取り出してHTMLに置き換えるスクリプトをJavascriptで作ろうと思います。 ~XMLファイル~宣言省略 <links> <link> <url>http://www.○○○.com/</url> <title>○○○~</title> <ban>http://www.○○○.com/XX.gif</ban> </link> <link> <url>http://www.×××.com/</url> <title>×××~</title> <ban></ban>//←画像データ空欄 </link> </links> ~Javascript~前後省略 var a = obj.responseXML; var xmlDoc = a.documentElement; var links = xmlDoc.getElementById("links").length; for(var i=0; i<links; i++) { var link = xmlDoc.getElementsByTagName("link")[i].firstChild.nodeValue; var title = xmlDoc.getElementsByTagName("title")[i].firstChild.nodeValue; var image = xmlDoc.getElementsByTagName("image")[i].firstChild.nodeValue; var html = Html(link,title,image); } function Html(link,title,image) { ~中略~ if(image != ""){ html += '<a href="' + link + '"><img src="' + image + '" alt="' + title + '" /></a>'; } return html; } この後、html内の「<div id="html"></div>」に表示させるのですが、function Html(~)では、画像の有無は絶対条件ではない為if文で条件分けしています。 ですが、この「if(image != "")」で「has no properties」エラ-になります。 ちなみに空欄だった画像データ欄に文字列を入れるときちんと動作します。 XMLタグに文字列が入らない場合、配列には""(空)が返されないのでしょうか? 何か良い方法はありましたら、よろしくご教授くださいませ。 よろしくお願いいたします。

    • ベストアンサー
    • XML
  • ODBCによるSQL serverへの接続方法を教えてください。

    PHPでSQL ServerへのODBC接続をしたいのですが、SQL Serverの場合の例がみつけられません。以下の~部分を教えてください。 try{ $db=new PDO("~"); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); print('データベースへの接続を確立しました。'); }catch(PDOException $e){ die("エラーメッセージ:".$e->getMessage()); } ※SQL ServerへはWindows認証で接続しています。 PHP使用環境  OS:Windows2000 pro  PHP:5.1.6  ODBC:登録済み(Windows認証、登録時の接続テスト正常終了)  ※SQL Serverはリモートサーバ。

    • 締切済み
    • PHP
  • データベースからの画像とタイトルにURLがつかない

    RSSを取得して格納までは成功したのですが、画像の取得ができずURL付き画像とタイトルを出力できていません。原因がわからないのですがどのようなことが考えられるでしょうか? <?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; } //RSSをまとめる $url1 = [ 'http://blog.livedoor.jp/dqnplus/index.rdf', 'http://alfalfalfa.com/index.rdf', 'http://himasoku.com/index.rdf',]; // insertの準備 $stmt = $pdo->prepare('insert into teblename (title, link, date) values (?, ?, ?)'); // URLのループ開始 テーブルに格納 foreach ($url1 as $url) { // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 if (($rss = @simplexml_load_file($url)) === false) continue; $site_title = $rss->channel->title;// RSSタイトル取得 値の代入 自作関数 // サイトごとに表示するなら、サイトタイトル表示はこの位置 printf('<h2>%s</h2>', $site_title); $count = 0; // 個別記事のループ開始 RSSの取得が始まる foreach ($rss->item as $item) { if (++$count > 8) break; $title = $item->title;//タイトル取得 $link = $item->link;//リンクを取得 $dc = $item->children('http://purl.org/dc/elements/1.1/');//RSSの情報を取得 $thumb = $item->thumb->url;画像を取得 $thumbnail = '/images/dummy_thumbnail.jpg'; // 画像がない場合の代替画像 if ( $thumb ){ $thumbnail = $thumb; } // 取得した記事データの表示 if ($count === 1) print('<ul>'); $date = date('Y-m-d H:i:s', strtotime($dc->date));//RSS日付け取得 printf('<li>%s:%s:%s</li>', $title, $link, $date,$thumb);// $title, $link, $date,$thumb を表示 } if ($count) print('</ul>'); } ?>

    • ベストアンサー
    • PHP
  • RSSをMYSQLに入れる最適なコードがわからない

    テーブル接続→テーブル作成(必要か不明)→RSSをまとめる→RSSを取得→RSSをテーブルに入れる→RSSを表示をPHPで作成しているのですが、 RSSをテーブルに入れる最適なコードがわからず困っております。 insertを使用してRSSをテーブルに入れたいのですが、INSERT INTOはphpにいきなり書いてもエラーにならないのでしょうか?$を使用するほうの記載のほうが正しいのでしょうか? <?php require_once(dirname(dirname(dirname(dirname( __FILE__ )))) . '/wp-load.php' ); //ファイルの先頭で読み込む try { $dsn = 'mysql:dbname=ozvutmpq_wp1;host=localhost'; $user = 'ozvutmpq_wp1'; $password = 'Rn_&Zi$gWKae'; $dbh = new PDO($dsn,$user,$pass); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる echo "データベースへの接続が出来ました"; }catch (PDOException $e) { echo $e->getMessage();// err時はメッセージを表示 exit; } //RSSをまとめる $url1 = [ 'http://', 'http://', 'http://',];//フィード登録1次元配列に foreach ($url1 as $url) { //複数のRSSを読み込むには?A.RSSのURLを配列に入れ、その配列をsimplexmlの引数にします。 $count = 0;//初期のカウント //RSSを取得 $rss = simplexml_load_file("$url"); // simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。 $site_title = $rss->channel->title; // RSSタイトル取得 値の代入 自作関数 $post_thumbnail= $rss->channel->thumb; // RSSサムネイル画像取得 値の代入 自作関数 foreach ($rss->item as $item) { // この内側で $item を参照する if ($count >= 8) { break;//8件を超えたとき取得を終了する } $count++; $title = $item->title; // タイトル $link = $item->link; // リンク $thumb = $item->thumb->url; // アイキャッチサムネイル $content = $item ->description;// 詳細、必要なのか不明 date_default_timezone_set("Asia/Tokyo");//日時、タイトルとサムネイル画像だけほしいので要らない気がする $dc = $item ->children('http://purl.org/dc/elements/1.1/');//RSSの情報をPHPで取得するとき、[simplexml_load_file()]関数を使いますが、読み込むファイルの形式が[RSS 1.0]の場合、特殊な処理を施してあげないと正確に取得・表示することができません。 $day = date('Y/m/d H:i',strtotime($dc -> date));// RSS日付け取得 値の代入 自作関数 RSS1.0を取得したい場合「dc」の名前空間は「xmlns:dc="http://purl.org/dc/elements/1.1/"」 と定義されているので、これを引数として指定します。 $key = date('YmdGHis', strtotime($dc -> date));//DB等に入れやすい書式に変換 } } //RSSをテーブルに入れる INSERT INTO rssfeed (title, link, thumb,content)//テーブル名 VALUES ($title, $link,$thumb,$content now()) ON DUPLICATE KEY UPDATE up_date = now(); //名前を独自につける $item_insert_sql = "INSERT INTO $db_database.`rssfeed`(title, link, thumb, content) VALUES ('" . $title . "', '" . $link . "', '" . $thumb . "', '" . $content . "')";//mysql_queryとしてまとめてコードとして使うため?

    • ベストアンサー
    • MySQL
  • Oracle8i ストアドプロシジャ

    表名(テーブル名)等を変数にセットし、 いざ使おうとするとエラーになります。 何か関数を使えば、正しく動くものなのか。 ご存知の方、ご教授ください。 例:表領域名、DB_LINK名がデータとして存在する 変数A := 表領域名変数 || '表名' || DB_LINK名変数; select * from 変数A; 上記を「select * from ????(変数A);」 と、すれば出来そうな気がするのですが、????が何か、 または、別の方法があれば、教えてください。

  • データ入力条件

    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の格納、表示がうまくいかない

    データベースへの接続は完了したんですが、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)]; } } ?> 補足情報(FW/ツールのバージョンなど) db name hlxclitx_wp1 table name hlxclitx_feed_rss テーブル名 (data) 名前 item

    • ベストアンサー
    • PHP
  • iPhoneアプリの開発についてです。

    ディクショナリから文字列を取り出す際にエラーが発生します。 XMLファイルから、パースライブラリを利用しタイトルやURLの情報をNSDictionaryでいつでも取り出せるのですが、URLを取り出す際だけエラーが発生します。 XMLのリンクタグは2種類ほどあります。 タイプ1 <link rel="alternate" type="text/html" href="「url」"/> タイプ2 <link>「url」</link> この2つのリンクタグをXMLの形式に応じて取り扱いたいのですが、 NSString *str = dic[@"link"][@"href"]; //dicには既に記事のデータが入っているものとしてください if(str == nil) { str = dic[@"link"];} これだと -[__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1112b4f60 というエラーが発生してしまいます。 ちなみにタグの種類に応じて文字列を取り出せば(例えばタイプ2のタグに対しdic[@"link"][@"href"]という風に取り出す)ちゃんとURLを取得できます。 ご指摘お願いします。

専門家に質問してみよう