Lỗi PHP 5.5 - Chức năng không dùng nữa: preg numplace ()


16

Sau khi chúng tôi nâng cấp lên PHP 5.5, chúng tôi gặp lỗi sau khi thêm Trang web, Cửa hàng hoặc Cửa hàng. Lỗi này vẫn còn trong 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}

Đây là mã tạo ra lỗi

Mã có thể được tìm thấy trong 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);
}

Theo tôi, đây là bản vá dễ nhất cho phương thức:

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

Phương pháp chỉ được sử dụng bởi Mage_Adminhtml_System_StoreController::storeAction().

Có ba nơi có thể sửa nó:

  1. Mage_Core_Helper_Abauge => đó là nơi đặt phương thức, nhưng nó hút vì nó chạm vào một tệp cốt lõi.
  2. Viết lại Mage_Core_Helper_Abauge => nó là một lớp trừu tượng, vì vậy nó không nên / không thể viết lại.
  3. Viết lại Mage_Adminhtml_Helper_Data và thêm phương thức vào đó. => Tôi nghĩ rằng đây là con đường để đi.

các bạn nghĩ sao?

  1. Là lựa chọn số 3 là cách chính xác để khắc phục vấn đề.
  2. Là mã trong bản vá của tôi chính xác?

Vấn đề vẫn tồn tại trong 1.9.1 CE và 1.14.1 EE

Câu trả lời:


13

Vâng, bạn đúng. Sửa chữa trình trợ giúp adminhtml. Đây là khác biệt cho bản sửa lỗi tôi sử dụng:

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

Đây là một thử nghiệm để xác nhận hành vi giống như với 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

Điều này hiện đã được sửa trong Magento EE 1.14.1 và 1.9.1. Không tương thích bổ sung là các thay đổi pack () / unpack () ảnh hưởng đến Sao lưu / Rollback và một số tiện ích mở rộng trong khi cài đặt - bất cứ điều gì chạm vào tệp tar. Tôi cho rằng bất cứ ai đang chạy Magento trong sản xuất đều không sử dụng chúng.


Khi bản vá được phát hành cho các phiên bản trước đó;)
Ben Lessani - Sonassi

chưa biết nếu / khi nào
Piotr Kaminski

3

Câu trả lời ngắn: Magento không tương thích với PHP 5.5, đừng cập nhật máy chủ web của bạn lên 5.5.

Câu trả lời dài hơn: Tôi sẽ giả sử, Magento sửa lỗi này với phiên bản tiếp theo, vì vậy tôi sẽ thực hiện một bản hack lõi và hy vọng điều tốt nhất. Tôi không biết liệu mã là chính xác, xin lỗi.


Xin chào Fabian, chúng tôi chạy tất cả các máy chủ của chúng tôi trên PHP 5.5 từ khá lâu rồi. Đây là vấn đề đầu tiên tôi từng gặp phải. Những sự không tương thích đã biết khác tồn tại hoặc thông tin này đến từ đâu?
RobM84

1
Tôi không có ý kiến. Bạn chỉ có thể kiểm tra thay đổi php.net/manual/en/migration54.php và grep để biết các phương thức và cài đặt ini
Fabian Blechschmidt

1
thực sự đây là vấn đề PHP 5.5 duy nhất trong magento CE, chúng tôi đã không gặp phải vấn đề khác trong nửa năm qua chạy trên nó
Flyingmana

2
Ngoài ra, đó là một lời khuyên thực sự tồi tệ, vì 5.3 đã lỗi thời, php 5.4 không bao giờ đạt đến trạng thái ổn định thực sự vì hầu hết mọi người sử dụng nó với APC, 5.5 hiện là phiên bản PHP được hỗ trợ ổn định tối thiểu duy nhất, không đề cập đến tất cả các bản sửa lỗi bảo mật không phải là được bao gồm trong các phiên bản PHP cũ hơn
Flyingmana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.