পিএইচপি 5.5 ত্রুটি - অবচিত কার্যকারিতা: প্রাক-স্থান ()


16

আমরা পিএইচপি 5.5 এ আপগ্রেড করার পরে, কোনও ওয়েবসাইট, স্টোর বা স্টোর ভিউ যুক্ত করার সময় আমরা নিম্নলিখিত ত্রুটিটি পাই। এই বাগটি এখনও Magento 1.9.0.1 এ উপস্থিত রয়েছে

Exception message: Deprecated functionality: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in app/code/core/Mage/Core/Helper/Abstract.php on line 238
Trace: #0 [internal function]: mageCoreErrorHandler(8192, 'preg_replace():...', 'app...', 238, Array)
#1 app/code/core/Mage/Core/Helper/Abstract.php(238): preg_replace('# <(?![/a-z]) |...', 'htmlentities('$...', 'New Store Name')
#2 app/code/core/Mage/Adminhtml/controllers/System/StoreController.php(175): Mage_Core_Helper_Abstract->removeTags('New Store Name')
#3 app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_System_StoreController->saveAction()
#4 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('save')
#5 app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#7 app/Mage.php(686): Mage_Core_Model_App->run(Array)
#8 index.php(87): Mage::run('', 'store')
#9 {main}

এটি কোড যা ত্রুটি তৈরি করে

কোড পাওয়া যাবে Mage_Core_Helper_Abstract

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

এটি আমার মতে পদ্ধতির সবচেয়ে সহজ প্যাচ:

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi",
        create_function('$matches', 'return htmlentities($matches);'),
        $html
    );
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

পদ্ধতিটি কেবলমাত্র দ্বারা ব্যবহৃত হয় Mage_Adminhtml_System_StoreController::storeAction()

এটি ঠিক করার জন্য তিনটি সম্ভাব্য জায়গা রয়েছে:

  1. Mage_Core_Helper_Abstract => এটাই যেখানে পদ্ধতিটি রয়েছে, তবে এটি সফল হয় কারণ এটি একটি মূল ফাইল স্পর্শ করে।
  2. পুনর্লিখন Mage_Core_Helper_Abstract => এটি একটি বিমূর্ত শ্রেণি, তাই এটি পুনরায় লিখতে হবে না।
  3. Mage_Adminhtml_Helper_Data আবার লিখুন এবং সেখানে পদ্ধতিটি যুক্ত করুন। => আমি মনে করি এটিই যাওয়ার পথ।

আপনারা কি ভাবেন?

  1. # 3 বিকল্পটি সমস্যার সমাধানের সঠিক উপায়।
  2. আমার প্যাচে কোডটি কি সঠিক?

ইস্যুটি এখনও 1.9.1 সিই এবং 1.14.1 ইই

উত্তর:


13

হ্যাঁ তুমিই ঠিক. প্রশাসক সহায়িকা ঠিক করুন। আমি যে ফিক্সটি ব্যবহার করি তার জন্য এটি ভিন্ন:

--- app/code/core/Mage/Core/Helper/Abstract.php.orig 2014-09-25 15:32:56.000000000 +0200
+++ app/code/core/Mage/Core/Helper/Abstract.php 2014-09-25 15:34:42.000000000 +0200
@@ -235,7 +235,9 @@
  */
 public function removeTags($html)
 {
-        $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
+        $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi", function($matches) {
+            return htmlentities($matches[0]);
+        }, $html);
         $html =  strip_tags($html);
         return htmlspecialchars_decode($html);
 }

এই আচরণটি পিএইচপি 5.4 এর মতোই রয়েছে তা নিশ্চিত করার জন্য একটি পরীক্ষা:

<?php

namespace Vinai\Kopp\Magento\Tests;

class MageAdminhtmlHelperDataTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Mage_Adminhtml_Helper_Data
     */
    private $helper;

    static public function setUpBeforeClass()
    {
        ini_set('display_errors', 1);
        umask(0);
        error_reporting(E_ALL);
        require_once 'app/Mage.php';
        \Mage::setIsDeveloperMode(true);
    }

    public function setUp()
    {
        $this->helper = new \Mage_Adminhtml_Helper_Data();
    }

    /**
     * @covers \Mage_Core_Helper_Abstract::removeTags
     * @dataProvider removeTagsDataProvider
     */
    public function testRemoveTags($inputHtml, $expected)
    {
        $result = $this->helper->removeTags($inputHtml);
        $this->assertEquals($expected, $result);
    }

    public function removeTagsDataProvider()
    {
        return array(
            array('<b>', ''),
            array('<b> >', ' >'),
            array('<b> <', ' <'),
            array('<b/> </', ' '),
            array('< <b/>', '< '),
            array('> <b/>', '> '),
            array('</ <b/>', ''),
            array('x />', 'x />'),
            array('> <', '> <'),
            array('>>', '>>'),
            array('<<', '<<'),
            array('<>', '<>'),
        );
    }
} 

4

এটি এখন Magento EE 1.14.1 এবং 1.9.1 এ স্থির করা হয়েছে। অতিরিক্ত অসম্পূর্ণতা হ'ল প্যাক () / আনপ্যাক () পরিবর্তনগুলি যা ব্যাকআপ / রোলব্যাক এবং ইনস্টলেশনের সময় কিছু এক্সটেনশানগুলিকে প্রভাবিত করে - টার ফাইলগুলিতে স্পর্শ করে এমন কিছু। আমি ধরে নিলাম যে কেউ প্রযোজনায় ম্যাজেন্টো চালাচ্ছেন তারা সেগুলি ব্যবহার করছেন না।


পূর্ববর্তী সংস্করণগুলির জন্য প্যাচটি কখন প্রকাশ করা হচ্ছে;)
বেন লেসানী - সোনাসি

এখনও / কখন জানি না
পিয়োটার কামিনস্কি

3

সংক্ষিপ্ত উত্তর: ম্যাজেন্টো পিএইচপি 5.5 উপযুক্ত নয়, আপনার ওয়েবসারভার 5.5-এ আপডেট করবেন না।

দীর্ঘ উত্তর: আমি ধরে নেব, ম্যাজেন্টো পরবর্তী সংস্করণটি দিয়ে এই বাগটি সংশোধন করে, তাই আমি কেবল একটি মূল হ্যাক করব এবং সেরাটি আশা করব। আমি কোডটি সঠিক কিনা তা জানিনা, দুঃখিত।


হাই ফ্যাবিয়ান, আমরা বেশ কিছু সময়ের জন্য আমাদের সমস্ত সার্ভারগুলি পিএইচপি 5.5 এ চালাই। এটিই আমার প্রথম সমস্যার মুখোমুখি। অন্য কোন জ্ঞাত অসঙ্গতিগুলি বিদ্যমান বা এই তথ্যটি কোথা থেকে এসেছে?
রবএম 84

1
tbh আমার কোন ধারণা নেই পদ্ধতি এবং আইএনআই সেটিংসের জন্য আপনি কেবলমাত্র চেঞ্জলগ php.net/manual/en/migration54.php এবং গ্রেপ পরীক্ষা করতে পারেন
ফ্যাবিয়ান ব্ল্যাচসমিট

1
বাস্তবে ম্যাজিওটোতে এটিই একমাত্র পিএইচপি 5.5 সমস্যা, আমরা গত অর্ধ বছরে এটি চালিয়ে অন্য কোনওটিকে আঘাত করিনি
ফ্লাইংম্যানা

2
সত্যই খারাপ পরামর্শও দেয়, পিএইচপি 5.4 কখনই সত্যিকারের স্থিতিশীল অবস্থায় আঘাত করে না কারণ বেশিরভাগ লোক এপিসিতে এটি ব্যবহার করে, 5.5 বর্তমানে একমাত্র ন্যূনতম স্থিতিশীল সমর্থিত পিএইচপি সংস্করণ অ্যাভাইলাবিল, সমস্ত সুরক্ষা সংস্থার উল্লেখ না করে যা নয় পুরানো পিএইচপি সংস্করণগুলিতে অন্তর্ভুক্ত রয়েছে
ফ্লায়িংম্যানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.