PHP 5.5 Bug - เลิกใช้งานฟังก์ชั่น: preg_replace ()


16

หลังจากเราอัพเกรดเป็น PHP 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 CE และ 1.14.1 EE

คำตอบ:


13

ใช่คุณถูก. แก้ไขผู้ช่วย adminhtml นี่คือความแตกต่างสำหรับการแก้ไขที่ฉันใช้:

--- 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);
 }

นี่คือการทดสอบเพื่อยืนยันว่าพฤติกรรมนั้นเหมือนกับ php 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 ความไม่เข้ากันเพิ่มเติมคือการเปลี่ยนแปลง pack () / unpack () ซึ่งมีผลต่อการสำรองข้อมูล / ย้อนกลับและส่วนขยายบางอย่างระหว่างการติดตั้ง - สิ่งใดก็ตามที่แตะไฟล์ tar ฉันถือว่าทุกคนที่ใช้ Magento ในการผลิตไม่ได้ใช้สิ่งเหล่านั้น


เมื่อไหร่จะมีการ
อัพเดท

ยังไม่ทราบว่าเมื่อใด
Piotr Kaminski

3

คำตอบสั้น ๆ : วีโอไอพีไม่รองรับ PHP 5.5 อย่าอัปเดตเว็บเซิร์ฟเวอร์ของคุณเป็น 5.5

อีกต่อไปคำตอบ: ฉันจะสมมติว่า Magento แก้ไขบั๊กนี้ด้วยเวอร์ชันถัดไปดังนั้นฉันจะทำแฮ็คหลักและหวังว่าจะดีที่สุด ฉันไม่ทราบว่ารหัสถูกต้องขอโทษ


สวัสดีเฟเบียนเราใช้เซิร์ฟเวอร์ของเราทั้งหมดบน PHP 5.5 มาระยะหนึ่งแล้ว นี่เป็นปัญหาแรกที่ฉันเคยพบ มีความเข้ากันไม่ได้อื่น ๆ ที่รู้จักกันอยู่หรือข้อมูลนี้มาจากไหน?
RobM84

1
tbh ฉันไม่มีความคิด คุณสามารถตรวจสอบ changelog php.net/manual/en/migration54.phpและ grep สำหรับวิธีการและการตั้งค่า ini
Fabian Blechschmidt

1
อันที่จริงนี่เป็นปัญหา PHP 5.5 เดียวใน magento CE เราไม่ได้ตีอีกในช่วงครึ่งปีหลังที่ทำงานอยู่
Flyingmana

2
ยังเป็นคำแนะนำที่แย่มากเพราะ 5.3 เป็นวิธีที่ล้าสมัย php 5.4 ไม่เคยเข้าสู่สถานะที่มั่นคงจริงเพราะคนส่วนใหญ่ใช้กับ APC 5.5 ปัจจุบันเป็นรุ่นเสถียรขั้นต่ำเพียงตัวเดียวที่รองรับ PHP ไม่พูดถึงการแก้ไขความปลอดภัยทั้งหมดที่ไม่ รวมอยู่ใน PHP เวอร์ชันเก่า
Flyingmana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.