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にあげる具体的な方法を記述したサイトなどあれば教えてください。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/10/19 17:53:33
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149

ポイント200pt

質問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]以降を見比べてみてください。

他5件のコメントを見る
id:windofjuly

そこは安全なサイトなのでしょうか…。

公式サイトだから安全とは言い切れませんが、
一応、公式サイト載せておきます。
http://www.zlib.net/

2013/10/20 07:32:24
id:kohhi

危険なサイトもあるようですね。
ありがとうございます。

2013/10/20 08:58:08

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント68pt

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

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


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

id:kohhi

早速お返事いただき、ありがとうございます。

長くなってすいません。( >エラーになった箇所のソース)
「PHP Web Scraping」Pucktという出版社のP24,P25に記述してあるプログラムです。

    • 以下本のソース



// 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の具体的な方法とは
他の方の回答を参考にしてみます。

2013/10/19 09:22:18
id:tukihatu No.2

回答回数180ベストアンサー獲得回数32

ポイント66pt

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」で検索したらごろごろ出てきましたので)

id:tukihatu

エラー文の前にエラーが起きてる行数が出てくると思うので、そのあたりで使っている命令を確認してみてください

2013/10/17 10:51:31
id:kohhi

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

2013/10/19 09:26:45
id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント200pt

質問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]以降を見比べてみてください。

他5件のコメントを見る
id:windofjuly

そこは安全なサイトなのでしょうか…。

公式サイトだから安全とは言い切れませんが、
一応、公式サイト載せておきます。
http://www.zlib.net/

2013/10/20 07:32:24
id:kohhi

危険なサイトもあるようですね。
ありがとうございます。

2013/10/20 08:58:08

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません