PHPのバージョンアップについて

Pocket

ヘテムルでは、2014年6月より順次サーバメンテナンスを行い、PHP5.2以下のご提供を終了いたします。

※PHP5.2の提供を終了いたしました。また、PHP5.3およびPHP5.4は、PHP自体のサポートの提供が終了しております。PHP5.6 以上のご利用をお勧めいたします。

そのため、バージョンアップを行っていただく必要がございますが、バージョンにより互換性のないものがございます。
今回はPHPのバージョンアップの際に、影響が大きい変更点についてご案内いたします。

[1]PHP4 → PHP5.3へのバージョンアップでの注意点

包括的な対応については、下記PHP マニュアルをご一読下さい。

>>PHP 4 から PHP 5.0.x への移行:新しいオブジェクトモデル
>>PHP 4 から PHP 5.0.x への移行:下位互換性のない変更点
>>PHP 5.0.x から PHP 5.1.x への移行
>>PHP 5.1.x から PHP 5.2.x への移行:下位互換性のない変更点

回避策
下記ページをご確認の上ご対応下さい。
>>Zend Engine 1の詳細
>>PHP 4 から PHP 5.0.x への移行:下位互換性のない変更点

 

[2]PHP5.2 → PHP5.3 へのバージョンアップでの注意点

包括的な対応については、下記PHP マニュアルをご一読下さい。
>>PHP 5.2.x から PHP 5.3.x への移行:下位互換性のない変更点

・mysqlnd ライブラリが新しいパスワードフォーマット(41バイト)を使用

>>mysql_connectについて

・データベースに接続できなくなる
・16バイトのパスワードを使うと、mysql_connect() 系の関数がエラーを出力

回避策
・データベースへの移行やパスワードの変更を行い、新しいパスワードフォーマットを使用する

>>データベースの移行方法
>>MySQL5へPHP5.4接続しエラーとなる場合の対応方法

 

・eregi() の deprecated

 >>eregiについて

PHP 5.3.0から推奨されない機能となったため、下記のようなエラーとなる。

PHP Deprecated: Function eregi() is deprecated in

回避策

preg_match()i (PCRE_CASELESS) 修飾子 を使う

 [3]PHP5.3 → PHP5.4へのバージョンアップでの注意点

包括的な対応については、下記PHP マニュアルをご一読下さい。
>>PHP 5.3.x から PHP 5.4.x への移行:下位互換性のない変更点

 

マジッククォート

>>マジッククォートについて
>>参考サイト:今更ながらmagic_quotes_gpcの欠点

今まで意識せずに書いていた箇所にセキュリティの脆弱性が存在する可能性があります

回避策

・適切な箇所でエスケープを行なう
・データベース自体のエスケープ機能やプリペアドステートメントを使用する

サンプル
GPC(Get/Post/Cookie) 処理に関する変数に以下の文字が含まれている場合は全て自動的にバックスラッシュでエスケープ処理が行われます。

  • ‘  (シングルクオート)
  • ”  (ダブルクオート)
  • \  (バックスラッシュ)
  • NULL

php

という文字がmagic_quotes_gpc On の場合バックスラッシュでエスケープされ

php2

magic_quotes_gpc Off の場合はエスケープされません

php3

・htmlspecialchars()
>>htmlspecialcharsについて
>>参考:PHP5.4のhtmlspecialcharsに非互換問題

PHP5.4から文字エンコーディングの初期設定がUTF-8 に変わりました。 そのため、htmlspecialchars関数の第3引数を指定しておらず
内部文字エンコーディングがShift_JISあるいはEUC-JPの場合、プログラムが正常に動作しません

回避策
・htmlspecialcharsの第3引数を指定する
・内部文字エンコーディングをUTF-8に変更

サンプル
内部文字エンコーディングをUTF-8以外に設定

【PHP5.3】

<?php
    mb_internal_encoding('UTF-8');
    $message = "こんにちは! hetemlです!";
    $message = mb_convert_encoding($message, 'EUC-JP', 'UTF-8');
    echo htmlspecialchars($message, ENT_QUOTES);

問題なく出力されます

こんにちは heteml です!!

【PHP5.4】
第三引数を指定しない場合

<?php
    mb_internal_encoding('UTF-8');
    $message = "こんにちは! hetemlです!";
    $message = mb_convert_encoding($message, 'EUC-JP', 'UTF-8');
    echo htmlspecialchars($message, ENT_QUOTES);

出力(表示されなくなる)

 

第三引数を指定する場合

<?php
    mb_internal_encoding('UTF-8');
    $message = "こんにちは! hetemlです!";
    $message = mb_convert_encoding($message, 'EUC-JP', 'UTF-8');
    echo htmlspecialchars($message, ENT_QUOTES, 'EUC-JP');

出力(表示される)

こんにちは heteml です!!

呼び出し時の参照渡しをサポートしなくなった

>>言語リファレンス:リファレンス渡し

プログラムで呼び出し時に参照渡しをしているとErrorになる

回避策

・参照渡しをやめる

サンプル

<?php
    $i = 0;
    foo(&$i);
    echo $i;
    function foo($i){
        $i++;
    }

【PHP5.3】
1 と表示される

1

【PHP5.4】
エラーが表示されます

Fatal error: Call-time pass-by-reference has been removed in 

サンプル

<?php
    $i = 0;
    $i = foo($i);
    echo $i;
    function foo($i){
        return $i + 1;
    }

【PHP5.4】
1 と表示される

1
Pocket