ショコラ
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 でエラーがでて動かない。