recherche

Maison  >  Questions et réponses  >  le corps du texte

Les valeurs correctes n'ont pas été renvoyées après la mise à niveau de PHP 5.4 vers PHP 7.4.

J'essaie de faire fonctionner certains scripts exécutés sur PHP 5.4 sur PHP 7.4. Aucune erreur de syntaxe n'a été détectée, à l'exception d'une erreur de passage par référence obsolète qui a été corrigée.

Dans certaines parties de l'application, je n'obtiens pas la valeur de retour correcte. J'ai exécuté php7cc et PHPStorm pour voir si je pouvais détecter des erreurs et des avertissements de dépréciation, mais je n'ai obtenu aucune idée de l'origine du problème.

Il existe un script qui analyse les données XML et les place dans un objet de classe. _MV_WRITE_._MV_SEP_._MV_SEP_.$this->mvKey._MV_SEP_.$this->mvObj->toString()._MV_SEP_Cette partie est correcte sauf que $item->toString() renvoie un espace au lieu de la chaîne correcte valeur.

Y a-t-il quelque chose dans ce code qui fonctionne en PHP 5.4 mais pas en PHP 7.4 ? Ci-dessous le code en question.

Script principal


<html>
    <head>
        <title>Demo MV</title>
    </head>
    <body>
<?php

include_once 'demo_mv.php';
include_once 'demo_xml_parser.php';

$xmltext = "<Test></Test>";

echo "Creating XML Parser. <br>";
$xp = New XMLParser();

echo  "Parsing XML to MV item. <br>";
If( !$xp->ParseToMVItem( $xmltext ) ) {
    echo "Parsing XML item failed. <br>";
}

echo  "Getting formatted output. <br>";
$item = $xp->GetMVItem();
echo print_r( $item ) . "<br>";

$fv = New MVFile("123456789", $item);
$mvObject = $fv->getFormattedItem( );
echo "Formatted output: " . $mvObject . "<br>";
    
?>
    </body>
</html>

Analyseur XML

<?php

Class XMLParser
{
    // set up some variables for use by the parser
        var $xp; // Parser
        var $g_level = 0;           // Current XML depth
        var $g_amc = 0;             // Current Result index
        var $currentTag = "";       // Name of current element
        var $g_elements = Array();  // Names of elements by depth
        var $g_result = Array();    // Result array
        var $errstring;             // String of error message
        var $MVItem;                // MV Item object To Parse into
        var $currentData = "";      // Data in current element

    Function XMLParser()
    {
        // Constructor
    }
    
    Function ParseToMVItem( $xml )
    {
        // Initialise MV Item
        $this->MVItem = New MVItem("");

        // create parser
        $this->xp = xml_parser_create();
        xml_set_object( $this->xp, $this );

        // set element handlers
        xml_set_element_handler($this->xp, "elementBegin", "elementEnd");
        xml_set_character_data_handler($this->xp, "characterData");
        xml_parser_set_option($this->xp, XML_OPTION_CASE_FOLDING, FALSE);

        // parse data
        if (!xml_parse($this->xp, $xml, True )) 
        {
            $errstring = " Line: " . xml_get_current_line_number( $this->xp);
            $errstring .= " Column: " . xml_get_current_column_number( $this->xp) . "<br/>";
            $errstring .= xml_error_string(xml_get_error_code($this->xp) );
            $this->errstring = "XML parser error: " . $errstring ;
            // destroy parser
            xml_parser_free($this->xp);
            Return False;
        }   
        // Success 
        // destroy parser
        xml_parser_free($this->xp);
        Return True;
    }
    
    Function elementBegin($xp, $name, $attributes)
    {   
        //file_log( "Attributes: " . $attributes . "rn" );
        // opening tag handler
        $this->g_amc++;
        $amc = $this->g_amc;
        $level = $this->g_level ++;
        //file_log( "Level: " . $level . "rn" );
        $this->g_elements[ $level -1 ] = $name;
        // export the name of the current tag to the global scope
        $this->currentTag = $name;
        $this->currentData = "";

        // Add to MV Item
        $s_level = $level;
        settype( $s_level, "string");
        $this->MVItem->replace( $s_level, $amc, 1 );
        $this->MVItem->replace( $name, $amc, 2 );
        $ename = $this->MVItem->extract( $amc , 2 );
        // Handle attributes
        $attrib = "";
        $index = 0;
        foreach ($attributes as $key => $value) {
            $index ++;
            $attrib =  trim( $key . "=" . $value );         
//          echo $attrib . " - index=$index<br/>";
            $this->MVItem->replace( $attrib, $amc, 3, $index );
//          echo $this->MVItem->extract(  $amc, 3, $index ) . "=attrib$index<br/>";
        }
    
    }

    Function elementEnd($xp, $name)
    {
        // closing tag handler      
//      echo $this->currentData;
        $this->MVItem->replace( trim($this->currentData), $this->g_amc, 4 );        
         
        $this->g_level --;
        $this->currentTag = $this->g_elements[ $this->g_level -1] ;
    }

    Function characterData($xp, $data)
    {
        // character data handler
        $data = Trim( $data );
        If($data != '') {
//          echo $data . "<br />";
            $this->currentData .= " ". $data;
//          $this->MVItem->replace( $data, $this->g_amc, 4 );       
        }
    }   

    Function GetMVItem()
    {
        Return $this->MVItem;
    }   
}
?>

MVItem

<?php

if ( ! defined( '_MV_CLASS' ) ) {
  define('_MV_CLASS', true );

  /*
  * Define constants
  */
  define('_MV_LOGIN_',1);
  define('_MV_LOGOFF_',2);
  define('_MV_EXECUTE_',3);

  define('_MV_CALL_',4);
  define('_MV_SELECT_',5);
  define('_MV_OPEN_',6);
  define('_MV_READNEXT_',7);
  define('_MV_READ_',8);
  define('_MV_READU_',9);
  define('_MV_WRITE_',10);
  define('_MV_RELEASE_',11);
  define('_MV_DELETE_',12);
  define('_MV_CLOSE_',13);
  define('_MV_TEST_EXIST_',14);
  define('_MV_LOCK_ITEM_',15);
  define('_MV_READV_',16);
  define('_MV_NOOP_',18);
  define('_MV_SELECT_TCL_',17);
  define('_MV_STATUS_',19);
  
  define('_MV_SEP_',chr(001));
  define('_MV_AM_',chr(254));
  define('_MV_VM_',chr(253));
  define('_MV_SVM_',chr(252));
  define('_MV_DIFFDATE_',732);
  define('_MV_DIFFTIME_',86400000);
  
  define('_MV_CONNECTION_TCP_',1);
  define('_MV_CONNECTION_TCP_PROXY_',2);
 
class MVFile{
    // Private
    var $mvKey;
    var $mvObj;
    
    function __construct($key, $item){
        $this->mvKey = $key;
        $this->mvObj = $item;
    }
    
    function getFormattedItem(){
        $this->mvKey = _MV_WRITE_._MV_SEP_._MV_SEP_.$this->mvKey._MV_SEP_.$this->mvObj->toString()._MV_SEP_;
        return $this->mvKey;
    }
    
 } // MVFile

class MVItem {
    var $Record;
    var $origrec;
    
    function __construct($rec = ""){
        if(empty($rec)){
            $this->Record = Array();
            $this->origrec = $this->Record;
            return;
        }
        $this->setRecord($rec);
    }

    function setRecord($newval){
        $rec = explode(_MV_AM_,$newval);
        $nbam = count($rec);
        $this->Record = Array();
        $this->origrec = $newval;
        for($am = 0;$am < $nbam;$am++) {
            $vam = explode(_MV_VM_,$rec[$am]);
            $nbvm = count($vam);
            $lvm = Array();
            for($vm = 0;$vm < $nbvm;$vm++){
                $vvm = explode(_MV_SVM_,$vam[$vm]);
                $lvm[$vm] = $vvm;
            }
            $this->Record[$am] = $lvm;
        }
        return true;
    }
    
    function toString(){
       return $this->extract();    
    }
    
    function extract($am = 0,$vm = 0,$svm = 0) {
        $am --;
        $vm --;
        $svm --;
        //file_log( "SVM: " . $svm . "rn" );
        if($vm == -1) $svm = -1;
        
        if($am == -1) {
            $nbam = count($this->Record);
            $res = "";
            for($am = 0;$am<$nbam;$am++) {
                $nbvm = count($this->Record[$am]);
                $lvm = Array();
                for($vm= 0;$vm<$nbvm;$vm++){
                    if(is_array($this->Record[$am][$vm])){
                       $lvm[$vm] = implode(_MV_SVM_,$this->Record[$am][$vm]);
                    }else{
                       $lvm[$vm] = $this->Record[$am][$vm];
                    }
                }
                if(is_array($lvm) ){
                   $res[$am] = implode(_MV_VM_,$lvm);
                } else {
                   $res[$am] = $lvm;
                }
            }
            if(is_array($res)) {
               return implode(_MV_AM_,$res);
            } else {
               return $res;
            }
        }
        
        if($vm == -1) {
            $nbvm = count($this->Record[$am]);
            $lvm = Array();
            for($vm= 0;$vm<$nbvm;$vm++){
                $lvm[$vm] = implode(_MV_SVM_,$this->Record[$am][$vm]);
            }
            return implode(_MV_VM_,$lvm);
        }

        if($svm == -1 ){
//          MM fix undefined offset         
            if(count($this->Record) < ( $am + 1 ) ) {
                //file_log("SVM = -1 rn");
                return "";
            }
            if(count($this->Record[$am]) < ( $vm + 1 ) ) {
                //file_log("SVM = -1 rn");
                return "";
            }
//          End Of fix  

           return implode(_MV_SVM_,$this->Record[$am][$vm]);
        } else {

            return $this->Record[$am][$vm][$svm];
        }
    }
    
    function replace($newval,$am = 0, $vm = 0 , $svm = 0){
        if($am == 0) return;
        if($vm == 0) $svm = 0;
        
        for($i=count($this->Record);$i < $am;$i++){
            $this->Record[$i]= Array(""); 
        }       
        
        if($vm == 0) {
            $this->Record[$am-1] = array($newval);    
        }else{
        
           for($i = count($this->Record[$am-1]);$i < $vm ; $i++){
                $this->Record[$am-1][$i] = Array(""); 
           }
           
           if($svm == 0) {
              $this->Record[$am-1][$vm-1] = Array($newval);
           }else{
               for($i = count($this->Record[$am-1][$vm-1]);$i < $svm ; $i++){
                    $this->Record[$am-1][$vm-1][$i] = Array(""); 
               }
//               $this->Record[$am-1][$vm-1][$svm-1] = Array($newval);
               $this->Record[$am-1][$vm-1][$svm-1] = $newval;
           }
        }
    }

    function ins(&$tab,$pos,$newval){
        $fin = $tab;
        $nb = count($tab);
        array_splice($tab,-($nb-$pos),($nb-$pos));
        array_splice($tab,-1,1,array($newval,""));
        array_splice($fin,0,($pos-1));
        array_splice($tab,-1,1,$fin);
    }
        
    function insert($newval, $am = 0,$vm = 0,$svm = 0){
        if($am == 0) return;
        if($vm == 0) $svm = 0;
        
        if ($am > count($this->Record) ) {
            $this->replace($newval,$am);
            return;
        }
        
        if($vm == 0) {
            $this->ins($this->Record,$am,array($newval));
        }else{
            if($vm > count($this->Record[$am-1])) {
                $this->replace($newval,$am,$vm);
                return;
            }
           
            if($svm == 0) {
               $this->ins($this->Record[$am-1],$vm,$newval);
            }else{
               for($i = count($this->Record[$am-1][$vm-1]);$i < $svm -1 ; $i++){
                   $this->Record[$am-1][$vm-1][$i] = Array(""); 
               }

               $this->ins($this->Record[$am-1][$vm-1],$svm,$newval);
            }
        }
    }
    
    function delete($am = 0 ,$vm = 0,$svm = 0) {
        if($am == 0) return;
        if($vm == 0) $svm =0;
        
        if($vm == 0){
           array_splice($this->Record,$am - 1,1);
        }else{
           if($svm == 0) {
                array_splice($this->Record[$am-1],$vm - 1,1);
           }else{
                array_splice($this->Record[$am-1][$vm-1],$svm - 1,1);
           }
        }
           
    }
    
    function AMCount(){
//MM
//echo '<' . count( $this->Record ) . '>';
        return count($this->Record);
    }
    
    function VMCount($am){
        if ($am > count($this->Record) || $am == 0) return 0;
        $tmp = $this->Record[$am-1];
        
        return count($tmp);
    }
    
    
    function SVMCount($am,$vm){
        if ($am > count($this->Record) || $am == 0) return 0;
        
        $tmp = $this->Record[$am-1];

        if ($vm > count($tmp) || $vm == 0 ) return 0;
        
        $tmp = $tmp[$vm-1];
        
        return count($tmp);
    }
    
    
  } // MVItem
 
}
?>

Voici les valeurs de retour correctes en PHP 5.4

Creating XML Parser.
Parsing XML to MV item.
Getting formatted output.
MVItem Object ( [Record] => Array ( [0] => Array ( [0] => Array ( [0] => 0 ) [1] => Array ( [0] => Test ) [2] => Array ( [0] => ) [3] => Array ( [0] => ) ) ) [origrec] => Array ( ) ) 1
Formatted output: 101234567890�Test��

Voici les résultats que j'obtiens en PHP 7.4 :

Creating XML Parser.
Parsing XML to MV item.
Getting formatted output.
MVItem Object ( [Record] => Array ( [0] => Array ( [0] => Array ( [0] => 0 ) [1] => Array ( [0] => Test ) [2] => Array ( [0] => ) [3] => Array ( [0] => ) ) ) [origrec] => Array ( ) ) 1
Formatted output: 101234567890

L'analyseur XML devrait fonctionner correctement car le tableau renvoyé est le même. Le vrai problème réside dans la méthode getFormattedItem(), qui n’implique en réalité que la méthode extract(). J'ai essayé d'ajouter des instructions d'impression à divers endroits, mais je n'arrive pas à déterminer quelle instruction est à l'origine du problème.

P粉718165540P粉718165540501 Il y a quelques jours480

répondre à tous(1)je répondrai

  • P粉442576165

    P粉4425761652023-07-18 09:21:50

    只需查看您的最终输出。我猜可能是字符集的问题。通常,新安装的 PHP 版本的 default_charset 值是 UTF-8,但旧版本可能将该值设置为 ISO-8859-1(即 latin-1),因此请检查您的 php.ini(以及可能更改字符集的项目中的其他脚本)。

    répondre
    0
  • Annulerrépondre