Проблемы после обновления до PHP 5.2.6 - PullRequest
0 голосов
/ 02 декабря 2009

Я в затруднительном положении. Мой PHP-код работал, но с тех пор, как я обновился до PHP 5.2.6, теперь я получаю:

Warning: domdocument::domdocument() expects parameter 2 to be long, string given in C:\xamps older\xampp167\htdocs\test\myphp\CSR Demo pack\csr\output.php on line 46

Fatal error: Call to undefined method domdocument::loadHTML() in C:\xamps older\xampp167\htdocs\test\myphp\CSR Demo pack\csr\output.php on line 50

Вот источник:

<html>
    <head>
    </head>

    <body>

        <?php

        //error_reporting(0);

        /********** outputer **********/

        $bool=file_exists("data/tcmpsr.txt");
        if ($bool == 1)
        {
            $numstr=file_get_contents("data/tcmpsr.txt");
            if ($numstr <> "")
            {
                $NumOfTitleChars= $numstr;
            }
        }
        Else
        {

        }

        $bool=file_exists("data/dcmpsr.txt");
        if ($bool == 1)
        {
            $numstr=file_get_contents("data/dcmpsr.txt");
            if ($numstr <> "")
            {
             $NumOfDtlChars = $numstr;
            }
        }
        Else
        {

        }

        /*** A new DOM object ***/
            $dom = new DOMDocument('1.0','utf-8');

            /*** load the html into the object ***/
            $html = file_get_contents("data/csr.html");
            $dom->loadHTML($html);

            /*** discard white space ***/
            $dom->preserveWhiteSpace = false;

            /*** get the tags by its tag name ***/
            $artclArray = $dom->getElementsByTagName('div');
            $hdArray = $dom->getElementsByTagName('h2');
            $spanArray = $dom->getElementsByTagName('span');

            $i=0;
            $x=0;
            $y=0;
            $z=0;

        foreach ($artclArray as $memberid)
        {
            $divArray[$x]=$memberid->nodeValue;
            $x++;
        }

        foreach ($hdArray as $memberid)
        {
            $hdlsArray[$y]=$memberid->nodeValue;
            $y++;
        }

        foreach ($spanArray as $memberid)
        {
            $dtlsArray[$z]=$memberid->nodeValue;
            $z++;
        }

        $hdsele=0;
        foreach($hdlsArray as $elemid)
        {
            $AmountOfHdlChars=$NumOfTitleChars;
            $eachTitle=$elemid;

            for ($count=0; $count<$AmountOfHdlChars; $count++)
            {
                $chara[$count]=$eachTitle[$count];
            }
            $smallTitle=implode($chara);
            $shortTitleArray[$hdsele]=$smallTitle;
            $hdsele++;
        }

        $dtlele=0;
        foreach($dtlsArray as $elemid)
        {
            $AmountOfDtlChars=$NumOfDtlChars;
            $eachDetail=$elemid;

            for ($count=0; $count<$AmountOfDtlChars; $count++)
            {
                $chara[$count]=$eachDetail[$count];
            }
            $smallDtl=implode($chara);
            $shortDtlArray[$dtlele]=$smallDtl;
            $dtlele++;
        }
        //echo "".$shortTitleArray[0]."<br />";
        //echo "".$shortDtlArray[0]."<br />";
        //echo "".$divArray[0]."<br />";

        //The Result is three arrays "shortTitleArray", "divArray" and //"shortDtlArray".
        //hdlsArray and dtlsArray contain full actual headlines and details.


        /******************************/

        ?>

        </body>
</html>

Проведя некоторое онлайн-исследование, я обнаружил, что причиной могут быть расширения Zend . Вот как выглядит моя установка Zend.

Эта программа использует движок языка Zend Scripting: Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies с загрузчиком PHP ionCube v3.1.34, Copyright (c) 2002-2009, авторством ionCube Ltd., и с Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, Zend Technologies с Zend Optimizer v3.3.3, Copyright (c) 1998-2007, Zend Technologies

Я проверил этот код на нескольких новых системах Windows, и он провалился на всех. Это наводит меня на мысль, что большинство, если не много, веб-хостов могут использовать настройку, аналогичную моей. Общее решение, основанное на том, что я прочитал, состоит в том, чтобы отключить Zend или закомментировать определенные области файла php.ini. Поскольку это часть сценария, предназначенного для распространения, большинство моих клиентов не будут иметь прямого доступа к php.ini и не имеют прав доступа для изменения настроек веб-сервера, таких как расширения Zend.

Как мне решить это в коде? Есть ли обходной путь? Или есть альтернатива использованию DOMDocument?

1 Ответ

1 голос
/ 02 декабря 2009

Вы можете попробовать SimpleXML в качестве альтернативы DOMDocument. Он должен работать "из коробки" на всех установках PHP5.

Например, это должно быть очень близко к тому, для чего предназначался ваш код DOMDocument:

<?php
// Load the string and create a SimpleXMLElement
$html_string = file_get_contents("data/csr.html");
$root = new SimpleXMLElement($html_string);

// Fetch all div, h2 and span values
$divs = $h2s = $spans = array();
foreach ($xml->div as $div) {
    $divs[] = $div;
}
foreach ($xml->h2 as $h2) {
    $h2s[] = $h2;
}
foreach ($xml->span as $span) {
    $spans[] = $span;
}

// etc...
?>

Не проверял, хотя, возможно, вам придется немного его адаптировать.

Существует также ряд других альтернатив для анализа XML-документов (и большинства допустимых HTML-документов, по расширению). См. PHP: манипулирование XML .

...