人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでバージョンによるエラー?

Localhostに、appache2.2&PHP5.3.8をインストールして、PHPを勉強しています。
参考書のプログラムを実行したところ以下のエラーが出ました。
「Strict Standards: Only variables should be passed by reference in...」

参考書のPHPのバージョンは5.4.7です。
バージョンの違いによるエラーのようです。

質問1.エラーの原因はバージョンによるものでしょうか。

質問2.PHP 5.4.xにあげる具体的な方法を記述したサイトなどあれば教えてください。

よろしくお願いします。

●質問者: kohhi
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●68ポイント

エラーになった箇所のソースを見ないとなんとも言えません。

ま、正常に動いてたものがバージョンを変えただけでエラーになったのならばバージョンによるエラーと言えますが。


質問2の具体的な方法とは、一体何のことでしょうか?
具体的に教えてください。


kohhiさんのコメント
早速お返事いただき、ありがとうございます。 長くなってすいません。( >エラーになった箇所のソース) 「PHP Web Scraping」Pucktという出版社のP24,P25に記述してあるプログラムです。 --以下本のソース <?php // Function to make GET request using cURL function curlGet($url) { $ch = curl_init();// Initialising cURL session // Setting cURL options curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_URL, $url); $results = curl_exec($ch);// Executing cURL session curl_close($ch);// Closing cURL session return $results;// Return the results } // Function to return XPath object function returnXPathObject($item) { $xmlPageDom = new DomDocument();// Instantiating a new DomDocument object @$xmlPageDom->loadHTML($item);// Loading the HTML from downloaded page $xmlPageXPath = new DOMXPath($xmlPageDom);// Instantiating new XPath DOM object return $xmlPageXPath;// Returning XPath object } $packtPage = curlGet('http://www.packtpub.com/news/experience-amazing-gimp-photo-editing-tools-with-packts-new-ebook');// Calling function curlGet() and storing returned results in $packtPage variable $packtPageXpath = returnXPathObject($packtPage);// Instantiating new XPath DOM object $coverImage = $packtPageXpath->query('//span/img/@src');// Querying for book cover image URL // If cover image exists if ($coverImage->length > 0) { $imageUrl = $coverImage->item(0)->nodeValue;// Add URL to variable $imageName = end(explode('/', $imageUrl));// Retrieving image name from URL // If file is an image if (getimagesize($imageUrl)) { $imageFile = curlGet($imageUrl);// Download image using cURL $file = fopen($imageName, 'w');// Opening file handle fwrite($file, $imageFile);// Writing image file fclose($file);// Closing file handle } } ?> --以上本のソース ここの34行目が Strict Standards: Only variables should be passed by reference in C:\Tools\htdocs\adult\scraper\phpwebscraping\7-scraping-images.php on line 34 と言割れています。 >質問2の具体的な方法とは 他の方の回答を参考にしてみます。

2 ● 牛乳先生(tukihatu)
●66ポイント

http://next-nex.info/?s=2299

http://blog.sarabande.jp/post/24003654486

このサイトで説明されているものを見た感じ、バージョンによるエラーのようです。

しかし過去バージョンのことも考え、変数配列指定するよう心がけたほうがいいと思います。参考書が丁寧じゃないですね。

×array_shift([1,2,3,4,5]);

○$a = [1,2,3,4,5];

array_shift($a);


ちなみに今後こういうエラー文が出てきたら、

・google翻訳してみる

・エラー文そのもので検索してみる

これでエラーの原因がわかることが多いのでやってみてください(今回は「Strict Standards: Only variables should be passed by reference in」で検索したらごろごろ出てきましたので)


牛乳先生(tukihatu)さんのコメント
エラー文の前にエラーが起きてる行数が出てくると思うので、そのあたりで使っている命令を確認してみてください

kohhiさんのコメント
お返事ありがとうございます。エラーのGoogle翻訳、エラー文の検索、確認してみます。

3 ● うぃんど
●200ポイント ベストアンサー

質問1は 牛乳先生(tukihatu)さんから回答を得ていますので、
質問2だけ記述します。

OSバージョンの記述がないので、
質問履歴を辿って見つけたWindows7だと仮定して話を進めます。
ちなみに、Localhostは自分自身という意味で、
Windows以外でも使われるためOSの判別には使えないのです…。

以下、本題

(1)新バージョンの入手
Windows版は下記にあります。最新は5.5系の5.5.5ですが、
テキストに合わせて5.4系の5.4.20で良いでしょう。
http://windows.php.net/download/#php-5.4
apache2.2系ならVC9 x86 Thread Safe版のZipをダウンロードします。

(2)apacheサービスの停止
Apacheのアイコンから出来るようになってると思いますが、
タスクマネージャのサービスでapacheを探して停止してもかまいません。

(3)旧環境の退避
仮にc:\phpであったならフォルダ名をc:\php53といった具合に変えます。
windowsフォルダのphp.iniファイルをc:\php53にコピーしてバックアップとします。

(4)ファイルコピー
以前がc:\phpであったなら、新規にc:\phpを作り、
Zipの中身を丸ごとそのままc:\phpに入れてしまいます。

フォルダ内の php.ini-production を コピーして名前を php.ini にします。
開発者向けのphp.ini-developmentもあるのですが、
レンタルサーバーの環境に近づけるため今回はproductionを選択しています。

(4)php.iniの編集で環境設定
MySQLを使っているので、下記の行を探して先頭の;を消します。
;extension=php_mysql.dll
;extension=php_mysqli.dll
;extension=php_pdo_mysql.dll
マルチバイト対応も必要でしょうから、下記の行を探して先頭の;を消します。
;extension=php_mbstring.dll
学習用ということなら下記の行を探してOffをOnに書き換えて、
エラーメッセージが標準出力(ブラウザなら画面)に出るようにします。
display_errors = Off

書き直しが済んだらwindowsフォルダにコピーします。
古いものは(3)でバックアップしたはずですから上書きします。

(5)apacheサービス起動
apacheサービスの起動だけでかまいませんが、
Windowsを再起動しちゃってもかまいません。

(6)バージョンチェック
すでにご存じかもしれませんが、phpinfo() だけのファイルを用意して、
apache上でphpが動いているかをチェックします。

<?php
echo phpinfo();

(7)不具合が起こったら…。
バックアップした古いphp.iniと新しいphp.iniを見比べて違う部分を合わせます。
文字化け関係は[mbstring]以降を見比べてみてください。


kohhiさんのコメント
早速お返事ありがとうございます。 はい、OSはWindows7です。 手とり足とり、ご丁寧にありがとうございます。 念のために完全なバックアップとってから始めてみます。 (Acronisというソフトで夜寝る前にクローン作ってからやってみます。) 早速お返事いただき、ありがとうございます。

うぃんどさんのコメント
今回の根本原因はこれですね。 >> $imageName = end(explode('/', $imageUrl)); // Retrieving image name from URL << メッセージの意味は「不確実な部分があるので注意せよ!」みたいなもので、 実はエラーメッセージではなく警告メッセージだったんです。 http://php.net/manual/ja/migrating5.errorrep.php >> 非推奨であったり将来の互換性が保証されていなかったりするコードを書いたときにメッセージが表示されます。 << だから5.4にあげても引き続きメッセージは出るはずです…。 php.iniで下記の;を外すことで出力を抑制することもできますが、 ; Development Value: E_ALL 出力を抑制すると思いもよらないミスを起こしてしまうかもしれないので、 プログラムを書き直したほうが良いでしょう。 試してませんが、たとえばこんな感じ…。 >|| $imageNames = explode('/', $imageUrl); $imageName = end( $imageNames ); ||< それはさておき、 5.3系のサポートはホントは2013年3月で終わってますので、 せっかくの機会ですから5.4へのアップデートは続けて良いと思います。 挙げられたソースコードを見るとcurlモジュールを使っているので、 php.ini編集では以下のdllも先頭の;を消して有効にしましょう。 ;extension=php_curl.dll 拡張モジュールの役目は下記参照。 http://php.net/manual/ja/install.windows.extensions.php ひとまず、これにて失礼…。

kohhiさんのコメント
ありがとうございました。 PHP5.3の環境で $imageNames = explode('/', $imageUrl); $imageName = end( $imageNames ); を加え動きました。 バージョンアップについて 5.4.2にして、 php.ini(870行目)を extension=php_curl.dll の;をとってWindowsごと再起動してもエラーが出ます。 エラー:Fatal error: Call to undefined function curl_init() 参照: http://blog.prostaff1.com/?p=1057 の通りやりました。 localhost/info.phpで Loaded Configuration File:C:\php5\php.ini で確かに修正したファイルです。 5.3.8に戻して勉強進めています。 お心当たりありましたらアドバイスください。 この質問はここで終了させていただきます。 ありがとうございました。

うぃんどさんのコメント
cURLを動かすには、 phpとは別途でzlib.dll、wldap32.dllというものが必要なのですが、 私の示した手順だと php 5.3.8 で cURLが動いているなら、 そのまま引き継いだと思うのですが…。 まずはwindows\system32フォルダの中に、 zlib.dll、wldap32.dllが存在するかを確認してみてください。 もしも、 php5.3.8 以下のどこかにzlib.dll、wldap32.dllが含まれていたら、 それを 5.4.21 の同じ位置にコピーしてみてください。 それ以外は、ちょっと即座には思い浮かばないです。

kohhiさんのコメント
A:zlib.dll(どこにもなかったので http://www.nodevice.jp/download.html からダウンロード)、 B:wldap32.dll(system32フォルダの中にありました)を 1.windows\system32フォルダの中 2.C:\PHP5 にいれても同じエラーになりますね。 バージョンをあげるのは、この質問の本来の目的ではありませんので、 別途勉強してみます。 余分な事聞いてかえってすいませんでした。

うぃんどさんのコメント
そこは安全なサイトなのでしょうか…。 公式サイトだから安全とは言い切れませんが、 一応、公式サイト載せておきます。 http://www.zlib.net/

kohhiさんのコメント
危険なサイトもあるようですね。 ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ