ショコラ
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
手順
- 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.
- pg_numrows関数 を pg_num_rows関数に書き換えます。
変更前
$rows = pg_numrows($result);
変更後
$rows = pg_num_rows($result);
- pg_numfields関数 を pg_num_fields関数に書き換えます。
変更前
$count = @pg_numfields($id);
変更後
$count = @pg_num_fields($id);
- is_resource を instanceof に書き換えます。
変更前
if (is_resource($result))
変更後
if ($result instanceof PgSql\Result)
- pg_freeresult を pg_free_result に書き換えます。
変更前
return @pg_freeresult($result);
変更後
return @pg_free_result($result);
- pg_fieldname を pg_free_result に書き換えます。
変更前
$case_func(@pg_fieldname($id, $i)),
変更後
$case_func(@pg_field_name($id, $i)),
- pg_fieldtype を pg_field_type に書き換えます。
変更前
@pg_fieldtype($id, $i),
変更後
@pg_field_type($id, $i),
- pg_fieldsize を pg_field_size に書き換えます。
変更前
@pg_fieldsize($id, $i),
変更後
@pg_field_size($id, $i),
- adsrcを adbinに書き換えます。※PostgreSQL12で廃止
変更前
adsrc
変更後
adbin
- pg_errormessage を pg_last_error に書き換える。
変更前
pg_errormessage
変更後
pg_last_error
シチュエーション
昔作った PHP のプログラムが PEAR の DB を使っていた。php8.1 では DB でエラーがでて動かない。