昨年末にjoyokanji.infoサーバーのメンテナンスを実施し、PHP 8.1へバージョンアップしました。当日は軽くいくつかのページを閲覧しただけで済ませてしまい不具合の発見が遅れてしまった。
存在しないテーブルのクエリー
PHP(PHP-FPM)のエラーログには次の内容が出力される。
Table 'データベース名.テーブル名' doesn't exist
これま見たままのエラーで、以前はPHP Fatal errorではなかったのでしょう。対応としては、テーブルが存在する場合のみクエリーを実行するようにしました。
get_magic_quotes_gpc関数の呼び出し
エラーログの内容は次の通り。
Call to undefined function get_magic_quotes_gpc()
PHP 8.0.0で削除された関数を数か所で呼び出していました。対応としては、本関数が存在しない場合は呼び出さないように修正しました。
空のIN句を含んだクエリー
エラーログは以下の通り。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY id'
該当のソースコードから次のようなIN句が原因でした。
IN () ORDER BY id
本来マッチした漢字のリストが入るもので、これをマッチした漢字がなくてもクエリーを実行していたことが原因でした。対応としてはマッチした漢字がない場合はクエリーを実行しないように修正しました。
mb_convert_encoding関数で’auto’を指定
エラーログに次の内容が複数回出力されていました。
mb_convert_encoding(): Unable to detect character encoding
これは文書として指定されたものを内部でUTF-8に変換する際、mb_convert_encoding関数を呼び出していたのですが、第3パラメータ$from_encodingに’auto’が含まれていたことが原因でした。暫定的な対応として$from_encodingの内容を見直し、’auto’を含めないように修正しました。
usort関数のコールバックで勘違い
エラーログは次の通り。
usort(): Returning bool from comparison function is deprecated, return an integer less than, equal to, or greater than zero
これはコールバックの戻り値を返すところで、次のように記述していたことが原因でした。
return $a->id > $b->id;
bool値が返ることが原因だったので、次のように修正しました。
return $a->id - $b->id;
まだ気になるところも残っているが…
この週末にエラーログを見ながらいくつか調整。フォームから入力された内容を検証処理を追加したり、文書のUTF-8変換処理を調整したりしました。mb_convert_encoding関数に指定する$from_encodingの最適解を知りたい。