PHP 5.6 → PHP 8.3のエラーまとめ

この記事について

環境サーバー移行でPHP 5.6.30 → 8.3.13
目的移行で出たエラーと書き換え方を記録する
結果mysql_*系の廃止関数をmysqliに置き換えて解消

つまずきポイント要約

  • mysql_*系関数はPHP 7で全廃止。mysqliかPDOへ書き換える
  • 未定義の配列キーはNoticeからWarningに格上げされた。isset()?? でチェックする
  • トランザクション系は $db->autocommit(false)$db->commit() に集約

webサイトのサーバー移行のときにPHPのバージョンも変わった。

PHP 5.6.30 → PHP 8.3.13

このページでは、その時に出たエラーをまとめる

Warning: Undefined array key “action” in /var/www/html

未定義の配列キーを参照しようとするとき、PHP 5.6 の場合には単に Notice として表示されることが多かったが、PHP 8.3 ではより厳密になり、警告 (Warning: Undefined array key) が発生する。

このエラーを解消するには、以下のように安全に配列キーをチェックしてから参照する方法を採用する必要がある。

修正前

$action = $_GET['action'];

修正後

if (isset($_GET['action']) && $_GET['action'] === 'some_action') {
  // 特定のアクションに対応する処理
}


Fatal error: Uncaught Error: Call to undefined function mysql_real_escape_string() in /var/www/html/

mysql_real_escape_string() は廃止されたので、代わりに、mysqli_real_escape_string()PDO::quote() を使う必要がある。

Fatal error: Uncaught Error: Call to undefined function mysql_query() in /var/www/html/

mysql_query() は廃止されたので、代わりに、mysqli_query() や PDO を使う必要がある。

Fatal error: Uncaught Error: Call to undefined function mysql_fetch_assoc() in /var/www/html/

mysql_fetch_assoc() は廃止されたので、代わりに、mysqli_fetch_assoc() や PDO を使う必要がある。

Fatal error: Uncaught Error: Call to undefined function mysql_num_rows() in /var/www/html/

mysql_num_rows() は廃止されたので、代わりに、$result->num_rows や PDO を使う必要がある

// mysql_query("SET AUTOCOMMIT = 0"); //オートコミットを無効にする
// mysql_query("begin"); //トランザクション開始

↓↓↓↓↓↓

$db->autocommit(false); //オートコミット無効化とトランザクション開始
//mysql_query("commit"); //ここで上記二つの処理が同時に実行される

↓↓↓↓↓↓

$db->commit(); //ここで上記二つの処理が同時に実行される

Fatal error: Uncaught Error: Call to undefined function mysql_data_seek() in /var/www/html/

mysql_data_seek($result, 0);

↓↓↓↓↓↓

$result->data_seek(0); OR mysqli_data_seek($result, 0);

まとめ:書き換え対応表

PHP 5.6(廃止)PHP 8.3での書き換え
mysql_real_escape_string()mysqli_real_escape_string() / PDO::quote()
mysql_query()mysqli_query() / PDO
mysql_fetch_assoc()mysqli_fetch_assoc() / $result->fetch_assoc()
mysql_num_rows()$result->num_rows
mysql_data_seek()$result->data_seek() / mysqli_data_seek()
タイトルとURLをコピーしました