PHP8.1 で PEAR の DB を使うには?

ショコラ
ショコラ

PHP8.1 で PEAR の DB を使うには?

以下の手順でなんとか動きました。
①(int)$result を spl_object_id に書き換える。
②pg_numrows を pg_num_rows に書き換える。
③pg_numfields を pg_num_fields に書き換える。
④is_resource を instanceof に書き換える。
⑤pg_freeresult を pg_free_result に書き換える。
⑥pg_fieldname を pg_field_name に書き換える。
⑦pg_fieldtype を pg_field_type に書き換える。
⑧pg_fieldsize を pg_field_size に書き換える。
⑨adsrc を adbin に書き換える。
⑩pg_errormessage を pg_last_error に書き換える。

もっさん先輩
もっさん先輩

パッチを用意しました

手順の操作をパッチで行います。

curl -LO https://answorz.com/4506/pgsql.php.patch
patch /usr/local/lib/php8/DB/pgsql.php pgsql.php.patch

手順

  1. DB/pgsql.php の中でリソースIDを期待している箇所があります。PHP8.1 では $result には リソースID ではなく PgSql\Result のオブジェクトが渡されますので spl_object_id関数 で ID に変換します。

変更前

$this->row[(int)$result] = 0; // reset the row counter.

変更後

$this->row[spl_object_id($result)] = 0; // reset the row counter.
  1. pg_numrows関数 を pg_num_rows関数に書き換えます。

変更前

$rows = pg_numrows($result);

変更後

$rows = pg_num_rows($result);
  1. pg_numfields関数 を pg_num_fields関数に書き換えます。

変更前

$count = @pg_numfields($id);

変更後

$count = @pg_num_fields($id);
  1. is_resource を instanceof に書き換えます。

変更前

if (is_resource($result))

変更後

if ($result instanceof PgSql\Result)
  1. pg_freeresult を pg_free_result に書き換えます。

変更前

return @pg_freeresult($result);

変更後

return @pg_free_result($result);
  1. pg_fieldname を pg_free_result に書き換えます。

変更前

$case_func(@pg_fieldname($id, $i)),

変更後

$case_func(@pg_field_name($id, $i)),
  1. pg_fieldtype を pg_field_type に書き換えます。

変更前

@pg_fieldtype($id, $i),

変更後

@pg_field_type($id, $i),
  1. pg_fieldsize を pg_field_size に書き換えます。

変更前

@pg_fieldsize($id, $i),

変更後

@pg_field_size($id, $i),
  1. adsrcを adbinに書き換えます。※PostgreSQL12で廃止

変更前

adsrc

変更後

adbin
  1. pg_errormessage を pg_last_error に書き換える。

変更前

pg_errormessage

変更後

pg_last_error

シチュエーション

昔作った PHP のプログラムが PEAR の DB を使っていた。php8.1 では DB でエラーがでて動かない。

Scroll to Top