2019/08/23 16:48 JST

Geeklog Japan Forums

PaypalプラグインのPHP7 エラー


状態: オフライン

Ivy

Site Admin
Admin
登録日: 01/01/04
投稿数: 5924
場所:Tokyo
ivywe版 Paypalプラグインは、現在PHP7の環境で、エラーが発生します。
PHP Formatted Code

E_WARNING(2) - preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead @ /.../web/paypal/transaction.php line 96
Call Stack
# Function File Line
1 preg_replace /.../web/paypal/transaction.php 96
 
preg_replace_callback()を代わりにつかえという警告ですが、どう変更したらよいでしょうか。
/admin/plugins/paypal/ipnlog.php
/paypal/transaction.php

状態: オフライン

mystral-kk

Site Admin
Admin
登録日: 03/23/06
投稿数: 1022
場所:福岡県
PHP Formatted Code

  $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $A['ipn_data'] );
 

の部分を、

PHP Formatted Code

    $out = preg_replace(
        '!s:(\d+):"(.*?)";!s',
        function ($args) {
            return sprintf('s:%d:"%s";', strlen($args[2]), $args[2]);
        },
        $A['ipn_data']
    );
 

に変更してみてください。


-- mystral-kk, "Every cloud has a silver lining."

状態: オフライン

mystral-kk

Site Admin
Admin
登録日: 03/23/06
投稿数: 1022
場所:福岡県

失礼、preg_replaceではなくpreg_replace_callbackでした。

PHP Formatted Code

$out = preg_replace_callback(
        '!s:(\d+):"(.*?)";!s',
        function ($args) {
            return sprintf('s:%d:"%s";', strlen($args[2]), $args[2]);
        },
        $A['ipn_data']
    );
 

-- mystral-kk, "Every cloud has a silver lining."

状態: オフライン

Ivy

Site Admin
Admin
登録日: 01/01/04
投稿数: 5924
場所:Tokyo
ありがとうございました!解決しました!

状態: オフライン

Ivy

Site Admin
Admin
登録日: 01/01/04
投稿数: 5924
場所:Tokyo
エラーがもう一つありました。ipnlog.php line 125 でエラーが出ます。
https://github.com/ivywe/geeklog-ivywe/blob/Geeklog2.1.2/extended/public_html/admin/plugins/paypal/ipnlog.php

PHP Formatted Code

An error has occurred:

This is being displayed as "Root Debugging" is enabled in your Geeklog configuration.

If this is a production website you must disable this option once you have resolved any issues you are investigating.

E_RECOVERABLE_ERROR(4096) - Object of class Closure could not be converted to string @ /.../web/admin/plugins/paypal/ipnlog.php line 125

Call Stack
#       Function        File    Line
1       preg_replace    /.../web/admin/plugins/paypal/ipnlog.php        125
2       plugin_getListField_paypal_IPNlog       /.../private/sciglobe/system/lib-admin.php      528
3       ADMIN_list      /.../web/admin/plugins/paypal/ipnlog.php        95
4       PAYPAL_listIPNlog       /.../web/admin/plugins/paypal/ipnlog.php        563
 array(7) {
  ["fieldname"]=>
  string(2) "id"
  ["fieldvalue"]=>
  string(2) "83"
  ["A"]=>
  array(12) {
    [0]=>
 




状態: オフライン

Ivy

Site Admin
Admin
登録日: 01/01/04
投稿数: 5924
場所:Tokyo
ipnlog.php でまだエラーが出ます。
PHP Formatted Code

E_RECOVERABLE_ERROR(4096) - Object of class Closure could not be converted to string @ /var/www/.../web/admin/plugins/paypal/ipnlog.php line 125

Call Stack
#       Function        File    Line
1       preg_replace    /var/www/.../web/admin/plugins/paypal/ipnlog.php        125
2       plugin_getListField_paypal_IPNlog       /var/www/.../private/bioclean/system/lib-admin.php      528
3       ADMIN_list      /var/www/.../web/admin/plugins/paypal/ipnlog.php        95
4       PAYPAL_listIPNlog       /var/www/.../web/admin/plugins/paypal/ipnlog.php        563
 array(7) {
  ["fieldname"]=>
  string(2) "id"
  ["fieldvalue"]=>
  string(3) "110"
  ["A"]=>
  array(12) {
    [0]=>
    string(3) "110"
    ["id"]=>
    string(3) "110"
 
とエラーが出ます。
以下のように修正済みでした。

from:
PHP Formatted Code
$out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $A['ipn_data'] );
to:
PHP Formatted Code

    $out = preg_replace_callback(
        '!s:(\d+):"(.*?)";!s',
        function ($args) {
            return sprintf('s:%d:"%s";', strlen($args[2]), $args[2]);
        },
        $A['ipn_data']
    );
 

状態: オフライン

mystral-kk

Site Admin
Admin
登録日: 03/23/06
投稿数: 1022
場所:福岡県
$A['ipn_data']に入っているデータは何ですか?  データ型は?
-- mystral-kk, "Every cloud has a silver lining."

状態: オフライン

Ivy

Site Admin
Admin
登録日: 01/01/04
投稿数: 5924
場所:Tokyo
plugin_getListField_paypal_IPNlog() は、PAYPAL_listIPNlog() からだけ、呼ばれているようです。
PHP Formatted Code

function PAYPAL_listIPNlog()
{
    global $_CONF, $_TABLES, $LANG_PAYPAL_1, $_USER;

    require_once $_CONF['path_system'] . 'lib-admin.php';

    $retval = '';

        if (DB_count($_TABLES['paypal_ipnlog']) == 0){
            $retval .= '<p>' . $LANG_PAYPAL_1['ipnlog_empty'] . '</p>';
        }


    $header_arr = array(      // display 'text' and use table field 'field'
        array('text' => $LANG_PAYPAL_1['ID'], 'field' => 'id', 'sort' => true),
        array('text' => $LANG_PAYPAL_1['IP_address'], 'field' => 'ip_addr', 'sort' => true),
        array('text' => $LANG_PAYPAL_1['date_time'], 'field' => 'time', 'sort' => true),
        array('text' => $LANG_PAYPAL_1['verified'], 'field' => 'verified', 'sort' => true),
                array('text' => $LANG_PAYPAL_1['txn_id'], 'field' => 'txn_id', 'sort' => true),
                array('text' => $LANG_PAYPAL_1['payment_status'], 'field' => 'payment_status', 'sort' => true),
        array('text' => $LANG_PAYPAL_1['purchaser'], 'field' => 'custom', 'sort' => true)
    );
    $defsort_arr = array('field' => 'id', 'direction' => 'desc');

    $text_arr = array(
        'has_extras' => true,
        'form_url' => $_CONF['site_admin_url'] . '/plugins/paypal/ipnlog.php'
    );
       
        $sql = "SELECT * FROM {$_TABLES['paypal_ipnlog']} WHERE 1=1";

    $query_arr = array(
        'table'          => 'paypal_ipnlog',
        'sql'            => $sql,
        'query_fields'   => array('id', 'ip_addr', 'time', 'verified', 'txn_id', 'ipn_data'),
        'default_filter' => COM_getPermSQL ('AND', 0, 3)
    );

    $retval .= ADMIN_list('paypal', 'plugin_getListField_paypal_IPNlog',
                          $header_arr, $text_arr, $query_arr, $defsort_arr);

    return $retval;
}


/**
*   Get an individual field for the paypal screen.
*
*   @param  string  $fieldname  Name of field (from the array, not the db)
*   @param  mixed   $fieldvalue Value of the field
*   @param  array   $A          Array of all fields from the database
*   @param  array   $icon_arr   System icon array
*   @param  object  $EntryList  This entry list object
*   @return string              HTML for field display in the table
*/

function plugin_getListField_paypal_IPNlog($fieldname, $fieldvalue, $A, $icon_arr)
{
    global $_CONF, $_PAY_CONF, $LANG_PAYPAL_1;
       
        //$A['ipn_data'] = base64_decode($A['ipn_data']);
       
        // PHP7 error {
        // $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $A['ipn_data'] );

    $out = preg_replace_callback(
        '!s:(\d+):"(.*?)";!s',
        function ($args) {
            return sprintf('s:%d:"%s";', strlen($args[2]), $args[2]);
        },
        $A['ipn_data']
    );


        // } PHP7 error


 

状態: オフライン

mystral-kk

Site Admin
Admin
登録日: 03/23/06
投稿数: 1022
場所:福岡県
ADMIN_list()からのコールバックで呼ばれているので、$Aにクエリーの結果が1行分入っているのは分かっています。 $A['ipn_data'] にはString(文字列)型のデータが入っているはずなのですが、現実にはObject型のデータが入っているので、Object --> String に変換しようとして失敗しています。だから、先の質問で「$A['ipn_data']のデータ型は何ですか?」と質問しました。デバッガーを使えばブレークポイントを設定してすぐにわかるはずです。
-- mystral-kk, "Every cloud has a silver lining."

状態: オフライン

Ivy

Site Admin
Admin
登録日: 01/01/04
投稿数: 5924
場所:Tokyo
すみません!
$out = preg_replace(
から
$out = preg_replace_callback(
への変更漏れがありました。解決しました!

時刻はすべて JST , 現在の時刻は 04:48 PM

  • 通常
  • 注目トピック
  • ロック済
  • 新着
  • 注目トピック 新着
  • ロック済トピック 新着
  •  ゲストユーザの投稿を見る
  •  ゲストユーザ投稿可能
  •  一部のHTMLを許可
  •  バッドワードをチェック