本家XOOPSの最新版(以下XOOPS25)の環境に最新モジュールを導入して「新基盤」を構築するという作業を行っているところだ.すでにXPressMe(WordPress),picoの2モジュールは導入済みとなっているが,まだ走行時にエラーが発生している.いずれもPHPのバージョンの問題と考えられるが,相当広範囲で発生している模様で今のところ収束の見通しは立っていない.ともかく,やるっきゃないので進むことにしよう.
まず,始業時バックアップから.今日はXOOPS25,xampp7とも,まるごとバックアップを取っておくことにする.バックアップファイルのネーミングで日付が変わったものは新しい日付を当日日付としているが,宵越しのものは前日の日付に追番を付したものを使うことにしよう.つまり,始業時バックアップはつねに追番の付かない日付で表示される.(以前からそういうルールだったのだが,徹底していなかった)念のため,MySQLも取っておこう.
管理画面下部の状態表示ブロックはErros(2)で以下のエラーが表示されている.
Unknown: Methods with the same name as their class will not be constructors in a future version of PHP; D3LanguageManager has a deprecated constructor in file D:/XoopsCore25/xoops_lib/libs/altsys/class/D3LanguageManager.class.php line 3
Unknown: Non-static method D3LanguageManager::getInstance() should not be called statically in file D:/XoopsCore25/xoops_lib/modules/pico/xoops_version.php line 8
ただし,これらは警告のようでだるまが出るようなFatal Errorではないので,このままもう少し進めることにする.まず,使われていたモジュールを可能な限り復元しておきたい.XOOPSサイトとGitHubから集めたモジュールは以下の8種(altsys, smartfaq, tellafriend, XPressMe, Pico, WebLinks, Evennew Mailer, Mantis Bug Tracker)でうち,altsys, XPressMeとpicoはインストール済み,それ以外のものも一度インストールに成功しているので多分簡単に片付くと思う.まず,これをやっておこう.一つづつ片付けてゆくことにする.
evennews ゼルコバ通信の発行に使っていたモジュール.インストールは問題なく完了したがモジュール画面でデータベースのQUERIESでエラーが起きている.
0.000613 – SELECT * FROM wp_blogs
Error number: 1146
Error message: Table ‘xoops25.zelkova_wp_blogs’ doesn’t exist
mantis バグレポート用モジュール.インストール画面→This Module Adminでだるまだ.
Error: Error: Call to undefined function split() in file /modules/mantis/core/timer_api.php line 46
https://www.marineroad.com/staff-blog/19442.html
「「split関数」は PHP5.3.0 で非推奨となり、 PHP7.0.0 で削除されました。」
ということのようだ.代替関数があるという.preg_split(),explode(),str_split().splitは正規表現を与えて文字列を分解するので,preg_splitを使うのが妥当と思われる.split()は以下のファイルに出現している.
1.\class\logger\render.php(193):
2.\modules\mantis\core\email_api.php(647, 661):
3.\modules\mantis\core\timer_api.php(46):
4.\modules\wordpress\wp-content\plugins\xpressme\include\xpress_common_functions.php(329, 346):
5.\modules\wordpress\wp-includes\class-wp-customize-manager.php(2069):
6.\modules\wordpress\wp-includes\media-template.php(34, 134, 1197, 1288):
7.\xoops_lib\modules\protector\library\HTMLPurifier\AttrDef\HTML\Class.php(14, 19):
8.\xoops_lib\modules\protector\library\HTMLPurifier\AttrDef\HTML\Nmtokens.php(24, 39):
ただし,protectorで使われているsplitはHTMLPurifier_AttrDef_HTML_Classクラスの関数で別物だ.また,logger, wordpressで使われているsplitも引数を一つしか持っていないので別物と思われる.mantis以外ではxpressmeのxpress_common_functions.phpで使われているが,これはとりあえず,パスしておこう.従って修正箇所はmantisの3箇所だけということになる.ダメだ.まだ通らない.
Error: Error: Call to undefined function mysql_escape_string() in file /modules/mantis/core/database_api.php line 292
この関数は上記の1箇所しか使われていない.しかし,mysqli_escape_stringという関数も使われた箇所がない.ともかくmysqli_escape_stringという関数名に変更してみよう.mysqli_escape_stringという関数は存在するが引数の個数が異なる.⇒どうも新しい関数ではDBへのリンクが必要になっているようだ.mysqli::escape_stringは使えるだろうか?ダメだ.この関数は動的関数なので静的な呼び出しはできない.以下のようにしてみたが無理なようだ.
$foo = new mysqli;
return $foo->escape_string( $p_string );
だるま→Error : Error: Call to undefined function mysql_result()
SYSTEM WARNING: mysqli::escape_string(): invalid object or resource mysqli
皆さんどうやってこれを切り抜けているのだろう?esc_sqlという関数があるみたいだ.ただし,これはWordPressの中だけの話かもしれない.やはり見つからない.wordpress本体ではesc_sqlを以下のように定義している.
function esc_sql( $data ) {
global $wpdb;
return $wpdb->_escape( $data );
}
mantisではDBにアクセスするときにはつねにホスト名使っているので,このようなグローバル変数を持っていないと思われる.mantisもdb_connectを持っているが,ブール値を返している.mantisはmysql_connectでDBに接続している.この関数もmysqli_connectに換えなくてはならないが,その戻り値をグローバル変数にいれておけばアクセスできるかもしれない.ここは一旦保留して次に進むことにする.smartfaq_masterを導入する.⇒再描画でエラーが出てしまった.picoがエラーを出している.
Fatal error: Cannot make static method MyTextSanitizer::getInstance() non static in class PicoTextSanitizer in D:\XoopsCore25\xoops_lib\modules\pico\class\pico.textsanitizer.php on line 14
これはあとで見ることにしてsmartfaqを導入しておこう.⇒インストール画面→This Module Adminでエラーになった.
Fatal error: require_once(): Failed opening required ‘D:/XoopsCore25/htdocs/modules/smartfaq/class/category.php’ (include_path=’C:\xampp7\php\PEAR’) in D:\XoopsCore25\htdocs\modules\smartfaq-master\class\faq.php on line 11
フォルダ名をsmartfaq_master→smartfaqに変えてこのエラーは一応収まったがどうも動作がいまいちだ.もう一度インストールし直してみる.smartfaqはアンインストールできたが,DBがまだ残っている.⇒MySQLで削除した.今度はうまく行った.SMARTFAQの管理画面にも入れる.TELL A FRIENDもインストールできた.weblinksはインストールできたが,happy_linuxが必要というメッセージが出ている.happy_linuxはXOOPS Xのサイトにはあったような気もするが,XOOPSのModule Repositoryには置いてない.
http://www.xoopscube.net/modules/xupdatemaster/index.php?action=StoreView&store_id=11
上記リンクからhappy_linux-master.zipをダウンロードした.⇒インストールできた.旧サイトで使っていたモジュールでXOOPS Xに残っているものがまだあるのではないだろうか?XOOPSからダウンロードできなかったものでXOOPS Xにあると思われるものには以下がある.
XOOPS Xでも見つからないモジュールには以下がある.
現時点でSYSTEMを含めて12個のモジュールがインストールされている.以下の6個のモジュールをネットからZIPでダウンロードしてある.bulletin, cubeUtils, d3forum, dbtheme, mobile_templates, search.しかし,これらのインストールは後回しにして現在導入済みのモジュールの動作確認を行い,データベースをリストアしてどこまで復元可能かを見ることにする.「Unknown: Methods with the same name as their class will not be constructors in a future version of PHP」や「Notice: Only variables should be assigned by reference in file」などの「警告」は当面無視することにする.Deprecated()も同様に無視される.
ただし,Queries()の中で赤字で表示されるエラーについてはチェックを要する.とりあえず,モジュールの管理画面が開けるかどうかを個別に確認しておこう.
SYSTEMS Errors(6), Dprecated(1), Queries(33)で以下のエラーが発生している.
0.000291 – SELECT * FROM wp_blogs
Error number: 1146
Error message: Table ‘xoops25.zelkova_wp_blogs’ doesn’t exist
WordPress関係のテーブルはすでに16個生成されている.またそれと別にprefixの付かないテーブルが12個ある.これらは何らかの理由で誤って作られているものである可能性がある.接頭辞が付かないテーブルというのは基本的に考えられないからだ.zelkova_wp_blogsが存在していないのはまだ作られていないためという可能性もある.WordPressの動作を見ておこう.
WORDPRESS: Errors(25), Deprecated(5), Queries(41) ではエラーが2件起きている.一つは上と同じだが,もう一つある.
0.000362 – SELECT mid FROM _modules WHERE `dirname` = ‘wordpress’
Error number: 1146
Error message: Table ‘xoops25._modules’ doesn’t exist
zelkova_modulesは存在する.このエラーはかなり具合が悪い.一度バックアップを取ってから,これらのおかしなテーブルを破棄してみることにする.XOOPS25とMySQLだけバックアップし,併せてxoops25データベースのSQLを取っておこう.エクスポートでエラーが出ている.
Deprecation Notice in .\libraries\classes\Export.php#592
implode(): Passing glue string after array is deprecated. Swap the parameters
Backtrace
.\libraries\classes\Export.php#592: implode(
array,
string ‘|’,
)
.\export.php#470: PhpMyAdmin\Export->exportServer(
array,
string ‘structure_and_data’,
,
string ‘ ‘,
string ‘server_export.php’,
string ‘server’,
boolean false,
boolean true,
boolean false,
boolean false,
array,
string ”,
)
phpMyAdminの中では例外なく上記の仕様になっている.⇒いや,確かに指摘された位置では逆になっている.直してみよう.⇒確かに収まった.接頭辞の付いてないテーブルを独立にエクスポートしておく.テーブルの個数は101個に減少した.しかし,WPのクエリエラーは変わらない.XOOPS_DB_PREFIXが通っていないことが考えられるが,暫定的にwp-config.phpを書き換えていることが影響しているのだろうか?追いかけるのは止めて一通りチェックしてみよう.
ALTSYSでダルマが出た.Error : Error: Call to undefined method XoopsTpl::XoopsTpl()というエラーが起きている.$XoopsTplという変数は頻繁に出現するが,XoopsTplというのはクラス名で,XoopsTpl()はそのコンストラクタだ.それが未定義というのはちょっと考え辛いのだが…
Error: Error: Call to undefined method XoopsTpl::XoopsTpl() in file D:/XoopsCore25/xoops_lib/libs/altsys/class/D3Tpl.class.php line 9
D3TplというのはXoopsTplの派生クラスでD3Tpl.class.php line 9というのはそのコンストラクタの中で呼び出しているparent::XoopsTpl() ;の行だ.PHPでは親のコンストラクタを明示的に呼出す必要があるのだろうか?XoopsTplはSmartyの派生クラスで,確かにXoopsTplという名前のコンストラクタは持っていない.C++の場合はクラス名が自動的にコンストラクタ名になるのだが,ここでは任意の名前を付けることができてしかもそれを派生クラスのコンストラクタから明示的に呼び出さなくてはならないということのようだ.XoopsTpl::__constructというのが,その名前だ.XoopsTpl() の出現は45箇所あるが,こういう呼び出し方をしているのはここだけだ.⇒一応このエラーは解消したものと思われるが,まだ後がある.
error: ArgumentCountError: Too few arguments to function XoopsForm::__construct(), 0 passed in /class/xoopsform/form.php on line 141 and at least 3 expected in file /class/xoopsform/form.php line 122
XoopsFormクラスにはXoopsFormという関数の他に__constructも定義されている.
public function __construct($title, $name, $action, $method = ‘post’, $addtoken = false, $summary = ”)
__constructの最初の引数3個にはデフォルト値がないので明示的に与えなくてはならない.しかし,XoopsFormは引数なしで呼び出されるのでどうすることもできない.これは,この関数XoopsFormの定義が間違っているとしか言いようがない.XoopsForm()は2箇所から呼び出されているがいずれも引数5個の呼び出しになっている.__constructの引数をそっくり持たせるようにした.⇒これでエラーは解消した.
picoではエラーが発生する.
Fatal error: Cannot make static method MyTextSanitizer::getInstance() non static in class PicoTextSanitizer in D:\XoopsCore25\xoops_lib\modules\pico\class\pico.textsanitizer.php on line 14
WebLinkでも起きる.
Fatal error: Cannot make static method happy_linux_locate_factory::getInstance() non static in class weblinks_locate_factory in D:\XoopsCore25\htdocs\modules\weblinks\class\weblinks_locate.php on line 64
これら以外のモジュールでは少なくとも最初の画面を開くことはできる.PicoTextSanitizer はMyTextSanitizerの派生クラスで pico.textsanitizer.php on line 14 には以下の関数がある.
function &getInstance()
{
static $instance;
if (!isset($instance)) {
$instance = new PicoTextSanitizer();
}
return $instance;
}
MyTextSanitizer::getInstance はstaticとして定義されている.
public static function getInstance()
{
static $instance;
if (!isset($instance)) {
$instance = new MyTextSanitizer();
}
return $instance;
}
これはかなり混乱したコードだ.MyTextSanitizer::$instanceはstaticだからシステムに一つしかないはずだ.何をやろうとしているのかよくわからない.static function &getInstance のようにgetInstanceをstaticに指定してこのエラーは消えたが,画面が表示されていない.picoというタイトルが表示されているだけだ.
以下のようなWarningが出ているので,おそらくhtmlが生成されていないか紛失してしまっているのだろう.
Warning: Smarty error: unable to read resource: “db:altsys_inc_mymenu.html” in file /class/smarty/Smarty.class.php line 1100
weblinks_locate.phpの方も同種のエラーなので同じ修正を入れてみる.WebLinksでは簡単な画面が出た.