Обновление PHP-скриптов

#php #function #plugins #updating #vbulletin

#php #функция #Плагины #обновление #vbulletin

Вопрос:

Я использую программное обеспечение vBulletin forum (старую версию 3.x), это просто мое любимое программное обеспечение для форума. Хотя vBulletin 3 был обновлен для поддержки по крайней мере PHP 7.1, многие продукты, которые были разработаны для него, ужасно устарели.

Я пытаюсь научиться обновлять эти продукты, у меня есть немного знаний PHP, но не так много, как хотелось бы. Например, некоторые вещи, которые я сделал в процессе обучения; я загружаю более старую версию vBulletin 3 и более новую версию, затем сравниваю файлы, чтобы увидеть, какие изменения они внесли. Однако это не очень помогает в обучении. (почему вносятся эти изменения, что означают эти изменения?) Я сохранил заметки о том, что, как я заметил, изменилось в новых файлах, и это пример того, что я менял.

 Find:

datamanager(

function vB_DataManager

function delete()

=amp;

split(

$groupis = $_GET['groupis'];

split

parent::

ereg


Replace:

datamanager_init(

function __construct

function delete($doquery = true)

=

preg_split(

$groupis = intval($_GET['groupis']);

explode

parent::__construct

preg_match
  

Я сохраняю свой список поиска и список замены, чтобы строки соответствовали тому, что нужно заменить на что.

Последний продукт, который я пытаюсь обновить, содержит несколько файлов, одна вещь, которую я знаю, чтобы заменить, которой нет в моем списке, — это ‘amp; $’ (но не всегда …? из того, что я прочитал, итак, когда правильно их заменить?) Это всего лишь один файл из примерно 5, над которым я работаю, в настоящее время он функционирует (с ошибками здесь и там), но я не знаю, с чего начать с фактического обновления этого, чтобы сделать его более эффективным кодом. (удалены некоторые функции для ограничения символов)

 class vbma
{
    var $vbulletin;
    var $fields = array(//Array of commonly used filed names, Also alows intergration
        'custnum' => 'custnum',//Key (short name) => Value (database table name)
        'mpassword' => 'ma_password',
        'info' => 'ma_info'
    );
    var $currency_sym;
    var $vbphrase;
    var $addons = array();
    function vbma($vbulletin, $vbphrase)
    {
        $this->vbulletin = $vbulletin;
        $this->vbphrase = $vbphrase;
        foreach (glob("includes/class_vbma*.php") as $addon)
        {
            if ($addon == 'includes/class_vbma.php')
            {
                continue;
            }
            require_once (DIR . '/' . $addon);
            $addon = basename(substr($addon, 19, strlen($addon)), '.php');
            $name = 'vbma_' . $addon;
            $this->$addon = new $name($this);
            $this->addons["$addon"] = $addon;
        }
    }

    function init($permissions)
    {
        $vbphrase = $this->vbphrase;
        $this->canViewMemArea($permissions);
        if ($this->vbulletin->options['memarea_enabled'] == 0 and !($this->vbulletin->
            userinfo['permissions']['adminpermissions'] amp; $this->vbulletin->
            bf_ugp_adminpermissions['cancontrolpanel']))
        {
            eval(standard_error($this->vbulletin->options['memarea_offmessage']));
        } elseif ($this->vbulletin->options['memarea_enabled'] == 0 and $this->vbulletin->
        userinfo['permissions']['adminpermissions'] amp; $this->vbulletin->
            bf_ugp_adminpermissions['cancontrolpanel'])
        {
            $oringle = $vbphrase['alert_board_off'];
            $vbphrase['alert_board_off'] = $this->vbphrase['memarea_off'];
            eval('$GLOBALS[navbar] .= "' . fetch_template('board_inactive_warning') . '";');
        }

        foreach ($this->addons as $addon)
        {
            if (method_exists($this->$addon, 'init'))
            {
                $this->$addon->init();
            }
        }
        $maxlength = TIMENOW - (60 * 60 * 24 * 3);
        $GLOBALS['ma_session'] = $this->vbulletin->db->query_first("SELECT * FROM " .
            TABLE_PREFIX . "ma_session WHERE userid = '" . $this->vbulletin->userinfo['userid'] .
            "' AND dateline > '" . $maxlength . "'");
        $GLOBALS['curr'] = $this->getCurrency();
        $this->currency_sym = $GLOBALS['currency_sym'] = $this->vbulletin->options['memarea_curr_code'];

    }

    function checkCustomerInfo($customernum, $password)
    {
        $fcust = $this->fields['custnum'];
        $fpass = $this->fields['mpassword'];
        if ($this->vbulletin->userinfo["$fcust"] == $customernum and $this->vbulletin->
            userinfo["$fpass"] == $password)
        {
            return true;
        }
        return false;
    }

    function startSession($userid)
    {
        $this->vbulletin->db->query_write("INSERT INTO " . TABLE_PREFIX .
            "ma_session (`userid`, `dateline`) VALUES (
            '" . $this->vbulletin->db->escape_string($this->vbulletin->userinfo['userid']) .
            "', '" . TIMENOW . "'
        )");
    }

    function getCurrency()
    {
        $curr_a = array('$' => 'USD', $this->vbphrase['memarea_currency_eur'] => 'EUR',
            $this->vbphrase['memarea_currency_pound'] => 'GBP', $this->vbphrase['memarea_currency_nis'] =>
            'NIS');
        return $curr_a[$this->vbulletin->options['memarea_curr_code']];
    }

    function getPaypalAddress($license)
    {
        $paypal = $license['paypal'];
        if (empty($paypal) or $paypal == '0')
        {
            $paypal = $this->vbulletin->options['memarea_paypal_email'];
        }
        return $paypal;
    }

    function getLicense($licenseid, $checkpermission = true, $getproduct = true, $productfields =
        'products.id as proid, products.title as protitle', $throwerror = true, $getExpireDate = true,
        $showExpiredErrors = false, $showSusErrors = false)
    {
        if ($getproduct)
        {
            $license = $this->vbulletin->db->query_first("SELECT licenses.*, $productfields FROM " .
                TABLE_PREFIX . "ma_licenses as licenses 
                LEFT JOIN " . TABLE_PREFIX .
                "ma_products as products ON (products.id = licenses.productid)
                WHERE licenses.id = '" . $licenseid . "'");
        }
        else
        {
            $license = $this->vbulletin->db->query_first("SELECT * FROM " . TABLE_PREFIX .
                "ma_licenses WHERE id = '" . $licenseid . "'");
        }
        if ($throwerror and empty($license))
        {
            eval(standard_error(fetch_error('license_not_found')));
        }
        if ($checkpermission and $this->vbulletin->userinfo['userid'] !== $license['userid'])
        {
            print_no_permission();
        }
        if ($getExpireDate)
        {
            $license['expiredate'] = $this->getLicenseExpireDate($license);
        }
        if ($showExpiredErrors and $this->isExpired($license))
        {
            eval(standard_error(fetch_error('memarea_license_expired')));
        }
        if ($showSusErrors and $this->isSuspended($license))
        {
            eval(standard_error(fetch_error('memarea_suspended_license')));
        }
        return $license;
    }

    function isExpired($license)
    {
        if (intval($license['status']) == 0 or ($license['expire'] !== '0' and (($license['dateline']  
            $license['expire']) <= TIMENOW)))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    function isSuspended($license)
    {
        if (intval($license['status']) == 1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    function getLicenseExpireDate($license)
    {
        if ($license['expire'] == '0')
        {
            return $this->vbphrase['memarea_lifetime'];
        }
        else
        {
            return vbdate($this->vbulletin->options['dateformat'], ($license['dateline']   $license['expire']));
        }
    }

    function sendCustomerInfo($userid, $username, $email, $num, $pass)
    {
        if ($this->vbulletin->options['memarea_notification_type'] == 0 or $this->
            vbulletin->options['memarea_notification_type'] == 2)
        {
            vbmail($email, $this->vbphrase['memarea_email_subject'], construct_phrase($this->
                vbphrase['memarea_email_message'], $num, $pass));
        }
        if ($this->vbulletin->options['memarea_notification_type'] == 1 or $this->
            vbulletin->options['memarea_notification_type'] == 2)
        {
            $pmdm = datamanager_init('PM', $this->vbulletin, ERRTYPE_ARRAY);
            $pmdm->set('fromuserid', $this->vbulletin->options['memarea_botuser']);
            $fuserinfo = $this->vbulletin->db->query_first("SELECT username FROM " .
                TABLE_PREFIX . "user WHERE userid = '" . $this->vbulletin->options['memarea_botuser'] .
                "'");
            $pmdm->set('fromusername', $fuserinfo['username']);
            $pmdm->set('title', $this->vbphrase['memarea_email_subject']);
            $pmdm->set('message', construct_phrase($this->vbphrase['memarea_email_message'],
                $num, $pass));
            $botpermissions = array();
            $botpermissions['adminpermissions'] = 2;
            $pmdm->set_recipients($username, $botpermissions);
            $pmdm->set('dateline', TIMENOW);
            $pmdm->pre_save();
            if (count($pmdm->errors) == 0)
            {
                $pmdm->save();
            }
            else
            {
                var_dump($pmdm->errors);
            }
        }
    }

    function setCustomerNumber($ma_info, $usergroup = '', $usevb = true, $userinfo = '')
    {
        if ($usevb == false)
        {
            $this->vbulletin->userinfo = $userinfo;
        }
        $fcust = $this->fields['custnum'];
        $fpass = $this->fields['mpassword'];
        $finfo = $this->fields['info'];
        $userdm = datamanager_init('User', $this->vbulletin, ERRTYPE_ARRAY);
        $userinfo = fetch_userinfo($this->vbulletin->userinfo['userid']);
        $userdm->set_existing($userinfo);
        if (!$this->vbulletin->userinfo["$fcust"] and !$this->vbulletin->userinfo["$fpass"])
        {
            $rand = rand($this->vbulletin->options['memarea_numstart'], $this->vbulletin->
                options['memarea_numend']);
            $num = $this->vbulletin->options['custnum_prefix'] . substr(md5($rand), 0, $this->
                vbulletin->options['memarea_custnumleng'] - strlen($this->vbulletin->options['custnum_prefix']));
            $userdm->set($fcust, $num);
            $pass = substr(md5(time() . $num . $rand . rand(0, 2000)), 0, $this->vbulletin->
                options['memarea_custnumleng']);
            $userdm->set($fpass, $pass);
            $this->sendCustomerInfo($this->vbulletin->userinfo['userid'], $this->vbulletin->
                userinfo['username'], $this->vbulletin->userinfo['email'], $num, $pass);
        }
        if ($usergroup or $usergroup !== '' or $usergroup !== '0')
        {
            if ($usergroup != $this->vbulletin->userinfo['usergroupid'])
            {
            $ma_info['oldgroup'] = $this->vbulletin->userinfo['usergroupid'];
            $userdm->set('usergroupid', $usergroup);
            }
        }
        if ($ma_info)
        {
            $ma_info = serialize($ma_info);
            $userdm->set($finfo, $ma_info);
        }

        $userdm->pre_save();
        if (count($userdm->errors) == 0)
        {
            $userdm->save();
            return true;
        }
        else
        {
            var_dump($userdm->errors);
            return false;
        }
    }

    function checkProductPermissions($product)
    {
        $perm = unserialize($product['permissions']);
        return in_array($this->vbulletin->userinfo['usergroupid'], $perm);
    }

    function buildInfoValues()
    {
        $values = array();
        if (is_array($this->vbulletin->userinfo['ma_info']))
        {
            foreach ($this->vbulletin->userinfo['ma_info'] as $key => $value)
            {
                if (!$this->vbulletin->GPC["$key"])
                {
                    $values["$key"] = $value;
                }
            }
        }
        return $values;
    }

    function canViewMemArea($permissions)
    {
        if (!($permissions['memarea_permissions'] amp; $this->vbulletin->bf_ugp['memarea_permissions']['memarea_active']))
        {
            print_no_permission();
        }
    }

    function buildInfoArray()
    {
        return array('fullname' => $this->vbulletin->GPC['fullname'], 'address_1' => $this->
            vbulletin->GPC['address_1'], 'address_2' => $this->vbulletin->GPC['address_2'],
            'address_city' => $this->vbulletin->GPC['address_city'], 'address_state' => $this->
            vbulletin->GPC['address_state'], 'address_zip' => $this->vbulletin->GPC['address_zip'],
            'country' => $this->vbulletin->GPC['country'], 'phone' => $this->vbulletin->GPC['phone'],
            'company' => $this->vbulletin->GPC['company']);
    }

    function insertPurchaseInfo($ids, $information, $userid = 'usevb')
    {
        if ($userid == 'usevb')
        {
            $userid = $this->vbulletin->userinfo['userid'];
        }
        $this->vbulletin->db->query_write("INSERT INTO " . TABLE_PREFIX .
            "ma_purchases (`userid`, `dateline`, `order`, `info`) VALUES (
            '" . $userid . "',
            '" . TIMENOW . "',
            '" . $this->vbulletin->db->escape_string(serialize($ids)) . "',
            '" . $this->vbulletin->db->escape_string(serialize($information)) . "'
        )");
        return $this->vbulletin->db->insert_id();
    }

    function buildCartRow($page, $action, $title, $price, $id = 0, $multi = false)
    {
        $currency_sym = $this->currency_sym;
        $product = array('title' => $title, 'price' => $price);
        if ($page == 'billing')
        {
            $delname = 'del_item[' . $id . ']';
            eval('$return = "' . fetch_template('memarea_billingdetailsbit') . '";');
        }
        else
        {
            $_REQUEST['do'] = 'paymentdetails';
            eval('$return = "' . fetch_template('memarea_billingdetailsbit') . '";');
            $_REQUEST['do'] = $action;
        }
        return $return;
    }

    function sendOutNewSaleEmail()
    {
        if (!empty($this->vbulletin->options['memarea_email_new_sale']))
        {
            foreach (explode(",", $this->vbulletin->options['memarea_email_new_sale']) as $userid)
            {
                $userinfo = fetch_userinfo($userid);
                vbmail($userinfo['email'], construct_phrase($this->vbphrase['memarea_new_sale'],
                    $this->vbulletin->options['bbtitle']), construct_phrase($this->vbphrase['memarea_new_sale_body'],
                    $userinfo['username'], $this->vbulletin->options['bbtitle']));
                unset($userinfo);
            }
        }
    }

    function checkDetailsFields($requested, $errormessage)
    {
        if (empty($this->vbulletin->GPC['fullname']) or empty($this->vbulletin->GPC['address_1']) or
            empty($this->vbulletin->GPC['address_city']) or empty($this->vbulletin->GPC['address_zip']) or
            empty($this->vbulletin->GPC['country']) or empty($this->vbulletin->GPC['phone']))
        {
            //$GLOBALS['error'] = $errormessage;
            eval(standard_error($errormessage));
            //$this->handleRequest($requested);
            return false;
        }
        return true;
    }

    function handleRequest($do)
    {
        $method = 'handleRequest' . $do;
        if (method_exists($this, $method))
        {
            $this->{$method}();
        }
        foreach ($this->addons as $addon)
        {
            if (method_exists($this->{$addon}, $method))
            {
                $this->{$addon}->{$method}();
            }
        }
    }

    function handleRequestgivelicense()
    {
        $vbphrase = $this->vbphrase;
        $GLOBALS['id'] = $this->vbulletin->input->clean_gpc('r', 'id', TYPE_UINT);
        $GLOBALS['license'] = $this->getLicense($GLOBALS['id'], true, false, '', true, false);
        $GLOBALS['templatename'] = 'memarea_givelicense';
    }

    function handleRequestdogivelicense()
    {
        $vbphrase = $this->vbphrase;
        $id = $this->vbulletin->input->clean_gpc('r', 'licenseid', TYPE_UINT);
        $username = $this->vbulletin->input->clean_gpc('r', 'usernames', TYPE_STR);
        $userinfo = $this->vbulletin->db->query_first("SELECT userid FROM " .
            TABLE_PREFIX . "user WHERE username = '" . $username . "'");
        if (empty($userinfo))
        {
            $GLOBALS['message'] = $vbphrase['memarea_givelicense_not_found'];
            $this->handleRequestgivelicense();
        }
        else
        { //User exists
            $license = $this->getLicense($id, true, false, '', true, false);
            $licensedm = datamanager_init('License', $this->vbulletin, ERRTYPE_ARRAY);
            $licensedm->set_existing($license);
            $licensedm->setr('userid', $userinfo['userid']);
            $licensedm->save();
            eval(standard_error($vbphrase['memarea_gave_license']));
        }
    }

    function handleRequestmembersarea()
    {
        $vbphrase = $this->vbphrase;
        $licensesq = $this->vbulletin->db->query_read("SELECT licenses.*, licenses.title as sitetitle, products.title as title, products.licenseleng as expire FROM " .
            TABLE_PREFIX . "ma_licenses as licenses 
            LEFT JOIN " . TABLE_PREFIX .
            "ma_products as products ON (products.id = licenses.productid)
            WHERE licenses.userid = '" . $this->vbulletin->userinfo['userid'] . "'");
        $licenses = '';
        while ($license = $this->vbulletin->db->fetch_array($licensesq))
        {
            if (empty($license['sitetitle']))
            {
                $license['sitetitle'] = substr($license['url'], 7);
            }
            $license['expiredate'] = $this->getLicenseExpireDate($license);
            eval('$licenses .= "' . fetch_template('memarea_clientsbit') . '";');
        }
        if ($this->addons['helpdesk'])
        {
            $GLOBALS['tickets'] = $this->helpdesk->getTicketsBitMem();
        }
        $GLOBALS['licenses'] = $licenses;
        $GLOBALS['templatename'] = 'memarea_clients';
    }

    function handleRequestlogout()
    {
        $this->vbulletin->db->query_write("DELETE FROM " . TABLE_PREFIX .
            "ma_session WHERE userid = '" . $this->vbulletin->userinfo['userid'] . "'");
        eval(standard_error($this->vbphrase['memarea_loggedout']));
    }

    function handleRequestlogin()
    {
        $this->vbulletin->input->clean_array_gpc('p', array('customernumber' => TYPE_STR,
            'password' => TYPE_STR));
        if ($this->checkCustomerInfo($this->vbulletin->GPC['customernumber'], $this->
            vbulletin->GPC['password']))
        {
            $this->startSession($this->vbulletin->userinfo['userid']);
            $this->handleRequest('membersarea');
            $GLOBALS['bypass'] = true;
        }
        else
        {
            $this->handleRequest('membersarea');
            $GLOBALS['errormessage'] = $this->vbphrase['memarea_bad_login'];
        }
    }

    function handleRequestresend_details()
    {
        $num = $this->vbulletin->userinfo['custnum'];
        $pass = $this->vbulletin->userinfo['ma_password'];
        $this->sendCustomerInfo($this->vbulletin->userinfo['userid'], $this->vbulletin->
            userinfo['username'], $this->vbulletin->userinfo['email'], $num, $pass);
        eval(standard_error($this->vbphrase['memarea_details_sent']));
    }

    function handleRequestlicence()
    {
        $GLOBALS['templatename'] = 'memarea_licence';
    }

    function handleRequestdetails()
    {
        $GLOBALS['values'] = $this->buildInfoValues();
        $GLOBALS['templatename'] = 'memarea_details';
    }

    function handleRequestsave_details()
    {
        $this->vbulletin->input->clean_array_gpc('p', array('fullname' => TYPE_STR,
            'address_1' => TYPE_STR, 'address_2' => TYPE_STR, 'address_city' => TYPE_STR,
            'address_state' => TYPE_STR, 'address_zip' => TYPE_STR, 'country' => TYPE_STR,
            'phone' => TYPE_STR, 'company' => TYPE_STR));
        if ($this->checkDetailsFields('details', $this->vbphrase['memarea_required_fields']))
        {
            $information = $this->buildInfoArray();
            $this->vbulletin->userinfo['ma_info'] = $information;
            $this->vbulletin->userinfo['usergroupid'] = $usergrpid;
            if ($this->setCustomerNumber($information, $usergrpid))
            {
                $this->vbulletin->url = 'members.php?do=details';
                eval(print_standard_redirect($this->vbphrase['memarea_saved_details'], false, true));
            }
        }
    }

    function handleRequestproducts()
    {
        global $stylevar;
        $vbphrase = $this->vbphrase;
        $products = $this->vbulletin->db->query_read("SELECT * FROM " . TABLE_PREFIX .
            "ma_products");
        $pros = '';
        $haspro = ($this->addons['pro'] == 'pro');
        $currency_sym = $this->currency_sym;
        while ($product = $this->vbulletin->db->fetch_array($products))
        {
            if ($this->checkProductPermissions($product))
            {
                $file = DIR . '/images/productthumbs/' . basename('thumbnail_product_' . $product['id'] .
                    $product['thumbnail_ext']);
                $show['prodthumb'] = false;
                if (file_exists($file))
                {
                    $filename = 'images/productthumbs/' . basename('thumbnail_product_' . $product['id'] .
                        $product['thumbnail_ext']);
                    $show['prodthumb'] = true;
                }
                $product['description'] = fetch_trimmed_title($product['description'], $this->
                    vbulletin->options['memarea_description_length']);
                eval('$pros .= "' . fetch_template('memarea_productsbit') . '";');
            }
        }
        $GLOBALS['pros'] = $pros;
        $GLOBALS['templatename'] = 'memarea_products';
    }
}
  

Я прошу помощи во всем, что вы видите, что необходимо обновить, почему это необходимо обновить, почему это нужно изменить на это. Любые ресурсы, которые я могу использовать для обновления старых продуктов, которые мне нужно обновить, и просто любые другие советы по этому вопросу. Спасибо за ваше время.

Комментарии:

1. Никто не собирается предоставлять обзор всего дампа кода. Настройте тестовую систему (например, 7.4 или php 8-rc) и найдите фактические ошибки. Тогда у вас есть ответный вопрос. // И, возможно, рассмотрите другое программное обеспечение. Предпочтительно тот, где разработчики не думают вручную — patch файлы все еще приемлемы.

2. Может быть, если вы прочтете более внимательно, вы увидите, что я не прошу полного обзора моего кода. Это просто пример файлов, с которыми я работаю, и если кто-то увидит в нем что-то примечательное, что я должен изменить, дайте мне знать, почему. Я в основном спрашиваю, как обновить старый PHP

3. Конечно, перепишите все SQL-запросы, чтобы использовать параметризованные запросы, и избавьтесь от шаблонов eval() for . Или, знаете, спросите на форуме поддержки или исследуйте vB4.

4. Я загрузил старую версию vb3, новейшую версию vb3 и новейшую версию vb4 для сравнения файлов. Также мне указали на php.net/manual/en/migration53.php и прочитать каждый раздел по обновлению. Что касается оценки для создания шаблонов, это своего рода способ компиляции шаблонов по умолчанию в vBulletin, для этого vBulletin пришлось бы полностью переписать, не так ли? И я спросил о vb.org , это просто больше не процветающее сообщество.

5. @Ryan Вы не думаете, что просить нас просмотреть более 500 строк кода и сказать вам «заметные вещи, которые вы должны изменить», — это целый обзор кода? Никто не собирается этого делать, по крайней мере, бесплатно, и нет разумного способа ответить на ваш «вопрос». Этот код необходимо будет полностью переписать, чтобы он соответствовал современным стандартам.