- 締切済み
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関数を他に作っておいてそれを使えば可能なのでしょうか? どなたかご教授頂けませんでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- SAYKA
- ベストアンサー率34% (944/2776)
ぱっと見、その$linkへ値を放り込んでる$urlがforeachの中に入ってるよね? こいつのスコープのせいじゃない? 一端、何もしないでforeachの外側で用意したらどうなるかな($linkとか$urlを)
補足
ご返答、有難う御座います。 whileの外側(関数も何も無い)、whileの内側且つforeachの外側でglobal宣言してみましたが DB登録できませんでした。スコープの問題なのか、オブジェクトの問題(変数の型)なのか わかりません。