2013-03-06 2 views
-1

J'ai le code PHP 4 pour vérifier les différences de deux fichiers, cela fonctionne très bien sur les anciens serveurs avec les versions PHP 4, mais sur les nouveaux serveurs, je reçois des erreurs. Par exemple:Le code PHP 4 donne des erreurs sur php 5

$maxlen est pas défini

Et le plan fonctionnel ne fonctionne pas sur le nouveau serveur. Quelqu'un sait comment changer cela pour une version récente de PHP?

function diff($old, $new){ 
      foreach($old as $oindex => $ovalue){ 
        $nkeys = array_keys($new, $ovalue); 
        foreach($nkeys as $nindex){ 
          $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ? 
            $matrix[$oindex - 1][$nindex - 1] + 1 : 1; 
          if($matrix[$oindex][$nindex] > $maxlen){ 
            $maxlen = $matrix[$oindex][$nindex]; 
            $omax = $oindex + 1 - $maxlen; 
            $nmax = $nindex + 1 - $maxlen; 
          } 
        }   
      } 
      if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new)); 
      return array_merge( 
        diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), 
        array_slice($new, $nmax, $maxlen), 
        diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); 
    } 

    function htmlDiff($old, $new){ 
    $preg="/[\s,]+/"; 
     $old=str_replace(">","> ",$old); 
     $new=str_replace(">","> ",$new); 
     $old=str_replace("<"," <",$old); 
     $new=str_replace("<"," <",$new); 

     $diff = diff(preg_split($preg, $old),preg_split($preg, $new)); 
     foreach($diff as $k){ 
     if(is_array($k)) 
      $ret .= (!empty($k['d'])?"<div style='BACKGROUND-COLOR: red'>".implode(' ',$k['d'])."</div> ":''). 
      (!empty($k['i'])?"<div style='BACKGROUND-COLOR: yellow'>".implode(' ',$k['i'])."</div> ":''); 
      else $ret .= $k . ' '; 
     } 
     return $ret; 
    } 
    function creatediff($oldurl,$newurl,$diffurl){ 
     $sold= file_get_contents($oldurl); 
     $snew= file_get_contents($newurl); 
     $diff=htmlDiff($sold,$snew); 
     $diff=preg_replace('#(href|src)="([^:"]*)("|(?:(?:%20|\s|\+)[^"]*"))#','$1="'.$newurl.'/$2"',$diff); 
     file_put_contents($diffurl,$diff); 
    } 
+1

J'ai essayé le manuel? http://php.net/manual/en/faq.migration5.php – Repox

+0

http://stackoverflow.com/questions/2487021/what-is-the-difference-betwen-variable-in-php4-and-php5 – apoq

+0

D'où obtenez-vous '$ maxlen'? – codingbiz

Répondre

1

Ce n'est pas dû à une différence de version, c'est du mauvais code. Vous avez probablement désactivé error_reporting sur votre installation précédente, ce qui est probablement la raison pour laquelle vous ne l'avez pas vue. Revenez à votre environnement PHP4, définissez error_reporting à E_ALL, et vous verrez probablement la plupart des mêmes avertissements.

Parce que $maxlen n'est défini que lorsqu'une condition particulière if est remplie, elle n'est jamais définie dans les autres cas et génère un avertissement. Vous pouvez éviter cela en définissant $maxlen en haut de votre fonction ou en utilisant isset() avant de tenter de référencer la variable.

+0

oui je fais tout sur php 5 mais n'a pas fonctionné –

1

Votre boucle contient:

if($matrix[$oindex][$nindex] > $maxlen) 

mais la première fois à travers la boucle, $maxlen n'est pas sur quoi que ce soit, si cette comparaison génère un avertissement (pas une erreur).

Vous devez soit initialiser $maxlen avant la boucle, ou le modifier à:

if (!isset($maxlen) || $matrix[$oindex][$nindex] > $maxlen) 

Un autre problème est qu'il n'y a aucun tableau $matrix dans la fonction. Si c'est une variable globale, vous avez besoin de:

global $matrix; 

au début de la fonction.

+0

J'ai édité le script comme ça ne fonctionne toujours pas avec php 5 –

+0

Recevez-vous toujours l'avertissement que '$ maxlen' n'est pas défini? – Barmar