[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ecrire/ -> inc_debug_sql.php3 (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2005                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  
  14  //
  15  // Ce fichier ne sera execute qu'une fois
  16  if (defined("_INC_DEBUG_SQL")) return;
  17  define("_INC_DEBUG_SQL", "1");
  18  
  19  function afficher_debug_contexte($env) {
  20      static $n;
  21      $n++;
  22  
  23      if (is_array($env_tab = @unserialize($env)))
  24          $env = $env_tab;
  25  
  26      $env_texte="";
  27      if (count($env)>0) {
  28          $env_texte="<div class='spip-env'>"
  29              . "<fieldset><legend>#ENV</legend>\n"
  30              . "<div><table>\n";
  31          foreach ($env as $nom => $valeur) {
  32              $env_texte .= "\n<tr><td><strong>".nl2br(entites_html($nom))
  33                  . "</strong></td>";
  34              $env_texte .= "<td>:&nbsp;".nl2br(entites_html($valeur))
  35                  . "</td></tr>\n";
  36          }
  37          $env_texte .= "\n</table></div>\n";
  38          $env_texte .= "</fieldset></div>\n";
  39      }
  40      return $env_texte;
  41  }
  42  
  43  // Si le code php produit des erreurs, on les affiche en surimpression
  44  // sauf pour un visiteur non admin (lui ne voit rien de special)
  45  // ajouter &var_mode=debug pour voir les erreurs et en parler sur spip@rezo.net
  46  function affiche_erreurs_page($tableau_des_erreurs) {
  47  
  48      $GLOBALS['bouton_admin_debug'] = true;
  49      $res = '';
  50      foreach ($tableau_des_erreurs as $err) {
  51          $res .= "<li>" .$err[0] . ", <small>".$err[1]."</small><br /></li>\n";
  52      }
  53      return "\n<div id='spip-debug' style='"
  54      . "position: absolute; top: 20px; left: 20px; z-index: 1000;"
  55      . "filter:alpha(opacity=60); -moz-opacity:0.6; opacity: 0.6;"
  56      . "'><ul><li>"
  57      . _T('zbug_erreur_squelette')
  58  ## aide locale courte a ecrire, avec lien vers une grosse page de documentation
  59  #        aide('erreur_compilation'),
  60      . "<br /></li>"
  61      . "<ul>"
  62      . $res
  63      . "</ul></ul></div>";
  64  }
  65  
  66  //
  67  // Si une boucle cree des soucis, on peut afficher la requete fautive
  68  // avec son code d'erreur
  69  //
  70  function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) {
  71  
  72      $GLOBALS['bouton_admin_debug'] = true;
  73  
  74      if (eregi('err(no|code):?[[:space:]]*([0-9]+)', $erreur, $regs))
  75          $errno = $regs[2];
  76      else if (($errno == 1030 OR $errno <= 1026)
  77          AND ereg('[^[:alnum:]]([0-9]+)[^[:alnum:]]', $erreur, $regs))
  78      $errno = $regs[1];
  79  
  80      // Erreur systeme
  81      if ($errno > 0 AND $errno < 200) {
  82          $retour .= "<tt><br /><br /><blink>"
  83          . _T('info_erreur_systeme', array('errsys'=>$errno))
  84          . "</blink><br />\n"
  85          . _T('info_erreur_systeme2');
  86          spip_log("Erreur systeme $errno");
  87      }
  88      // Requete erronee
  89      else {
  90          $retour .= "<tt><blink>&lt;BOUCLE".$id_boucle."&gt;("
  91          . $type . ")</blink><br />\n"
  92          . "<b>"._T('avis_erreur_mysql')."</b><br />\n"
  93          . htmlspecialchars($query)
  94          . "\n<br /><font color='red'><b>".htmlspecialchars($erreur)
  95          . "</b></font><br />"
  96          . "<blink>&lt;/BOUCLE".$id_boucle."&gt;</blink></tt>\n";
  97  
  98          include_ecrire ('inc_presentation.php3');
  99          include_ecrire ('inc_lang.php3');
 100          utiliser_langue_visiteur();
 101          $retour .= aide('erreur_mysql');
 102          spip_log("Erreur requete $id_boucle (".$GLOBALS['fond'].".html)");
 103      }
 104  
 105      erreur_squelette($retour);
 106  }
 107  
 108  
 109  //
 110  // Erreur de syntaxe des squelettes : memoriser le code fautif
 111  //
 112  function erreur_squelette($message='', $lieu='') {
 113      global $tableau_des_erreurs;
 114      global $auteur_session;
 115      static $runs;
 116  
 117      if (is_array($message)) list($message, $lieu) = $message;
 118  
 119      spip_log("Erreur squelette: $message | $lieu ("
 120          . $GLOBALS['fond'].".html)");
 121      $GLOBALS['bouton_admin_debug'] = true;
 122      $tableau_des_erreurs[] = array($message, $lieu);
 123      // Eviter les boucles infernales
 124      if (++$runs > 4) {
 125          if ($_COOKIE['spip_admin'] OR
 126          $auteur_session['statut'] == '0minirezo' OR
 127              ($GLOBALS['var_mode'] == 'debug')) {
 128              echo debut_entete(_T('admin_debug')), '</head><body>',
 129                  affiche_erreurs_page($tableau_des_erreurs);
 130              exit;
 131          }
 132      }
 133  }
 134  
 135  //
 136  // Le debusqueur version 3
 137  //
 138  
 139  // appelee a chaque sortie de boucle (inc-compilo) et a chaque requete
 140  // dans ce derniers cas on n'a pas le nom du squelette
 141  
 142  function boucle_debug_resultat ($id, $type, $resultat) {
 143      global $debug_objets;
 144  
 145      $nom = $debug_objets['courant'];
 146  
 147      if ($type == 'requete') {
 148        $debug_objets['requete']["$nom$id"] = $resultat;
 149      }
 150      else {
 151        // ne pas memoriser plus de 3 tours d'une meme boucle
 152        if (count($debug_objets['resultat']["$nom$id"]) < 3)
 153          $debug_objets['resultat']["$nom$id"][] = $resultat;
 154      }
 155  }
 156  
 157  // appelee a chaque sortie de sequence (inc-compilo)
 158  function debug_sequence($id, $nom, $niv, $sequence) {
 159      global $debug_objets;
 160  
 161      if (!$niv)
 162        {
 163          $debug_objets['sequence'][$nom.$id] = $sequence;
 164        }
 165      $res = "";
 166      foreach($sequence as $v) $res .= $v[2];
 167      return $res;    
 168  }
 169  
 170  // appelee a chaque compilation de boucle (inc-compilo)
 171  function boucle_debug_compile ($id, $nom, $code) {
 172      global $debug_objets;
 173  
 174      $debug_objets['code'][$nom.$id] = $code;
 175  }
 176  
 177  // appelee a chaque compilation de squelette (inc-compilo)
 178  function squelette_debug_compile($nom, $sourcefile, $code, $squelette) {
 179      global $debug_objets;
 180  
 181      $debug_objets['squelette'][$nom] = $squelette;
 182      $debug_objets['sourcefile'][$nom] = $sourcefile;
 183  
 184      if (is_array($GLOBALS['contexte_inclus']))
 185          $debug_objets['contexte'][$nom] = $GLOBALS['contexte_inclus'];
 186      else {
 187          $debug_objets['contexte'][$nom] = $GLOBALS['contexte'];
 188          if (!isset($debug_objets['principal']))
 189            $debug_objets['principal'] = $nom;
 190      }
 191  }
 192  
 193  // appelee a chaque analyse syntaxique de squelette
 194  function boucle_debug ($nom, $id_parent, $id, $type, $crit, $avant, $milieu, $apres, $altern) {
 195      global $debug_objets;
 196      $debug_objets['courant'] = $nom;
 197      $debug_objets['parent'][$nom.$id] = $id_parent;
 198      $debug_objets['pretty'][$nom.$id] = 
 199          "BOUCLE$id($type)" . htmlspecialchars(
 200              preg_replace(",[\r\n],", "\\n", $crit));
 201      // on synthetise avec la syntaxe standard, mais "<//" pose pb 
 202      $debug_objets['boucle'][$nom.$id] = 
 203        (!$avant ? "" : "<B$id>$avant") . 
 204        "<BOUCLE$id($type)$crit>" .
 205        $milieu .
 206        "</BOUCLE$id>" .
 207        (!$apres ? "" : "$apres</B$id>") . 
 208        (!$altern ? "" : "$altern<//B$id>");
 209  }
 210  
 211  function trouve_boucle_debug($n, $nom, $debut=0, $boucle = "")
 212  {
 213      global $debug_objets;
 214  
 215      $id = $nom . $boucle;
 216      foreach($debug_objets['sequence'][$id] as $v) {
 217        if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/', $v[2],$r))
 218          $y = substr_count($v[2], "\n");
 219        else {
 220          if ($v[1][0] == '#')
 221            // balise dynamique
 222            $incl = $debug_objets['resultat'][$v[0]];
 223          else
 224            // inclusion
 225            $incl = $debug_objets['squelette'][trouve_squelette_inclus($v[1])];
 226          $y = substr_count($incl, "\n")
 227            + substr_count($r[1], "\n") 
 228            + substr_count($r[3], "\n");
 229        }
 230  
 231        if ($n <= ($y + $debut)) {
 232          if ($v[1][0] == '?')
 233            return trouve_boucle_debug($n, $nom, $debut, substr($v[1],1));
 234          elseif ($v[1][0] == '!') {
 235            if ($incl = trouve_squelette_inclus($v[1]))
 236          return trouve_boucle_debug($n, $incl, $debut);
 237          }
 238          return array($nom, $boucle, $v[0]);
 239        }
 240        $debut += $y;
 241      }
 242      return array($nom, $boucle, $n-$debut);
 243  }      
 244  
 245  function trouve_squelette_inclus($script)
 246  {
 247    global $debug_objets;
 248    // on suppose que X.php appelle le squelette X.html (a revoir)
 249    ereg('^.(.*).php?3', $script, $reg);
 250    $incl = $reg[1] . '.html$';
 251    foreach($debug_objets['sourcefile'] as $k => $v) {
 252      if (ereg($incl,$v)) return $k;
 253    }
 254    return "";
 255  }
 256  
 257  function reference_boucle_debug($n, $nom, $self)
 258  {
 259    list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom);
 260  
 261    if (!$boucle)
 262      return !$ligne ? "" :  
 263        (" (" .
 264         (($nom != $skel) ? _L("squelette inclus, ligne: ") :
 265      _L("squelette, ligne: ")) .
 266         "<a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)");
 267    else {
 268    $self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
 269  
 270      return !$ligne ? " (boucle <a href='$self#$skel$boucle'>$boucle</a>)" :
 271        " (boucle $boucle ligne <a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)";
 272    }
 273  }
 274  
 275  // affiche un texte avec numero de ligne et ancre.
 276  
 277  function ancre_texte($texte, $fautifs=array())
 278  {
 279      global $var_mode_ligne;
 280      if ($var_mode_ligne) $fautifs[]=$var_mode_ligne;
 281      ob_start();
 282      highlight_string($texte);
 283      $s = ob_get_contents();
 284      ob_end_clean();
 285      if (substr($s,0,6) == '<code>') { $s=substr($s,6); echo '<code>';}
 286      $tableau = explode("<br />", $s);
 287      $format = "<span style='color: black'>%0".
 288        strlen(count($tableau)).
 289        "d </span>";
 290      $format10=str_replace('black','pink',$format);
 291      $formaterr="<span style='background-color: pink'>%s</span>";
 292      $i=1;
 293  
 294      foreach ($tableau as $ligne) {
 295          echo "<br />\n<a id='L$i' href='#debug_boucle'>",
 296            sprintf((($i%10) ? $format :$format10), $i),
 297            "</a>",
 298            sprintf(in_array($i, $fautifs) ? $formaterr : '%s',
 299                $ligne) ;
 300          $i++;
 301      }
 302  }
 303  
 304  // l'environnement graphique du debuggueur 
 305  function debug_dumpfile ($texte, $fonc, $type) {
 306  
 307      global $debug_objets, $var_mode_objet, $var_mode_affiche;
 308  
 309      $debug_objets[$type][$fonc . 'tout'] = $texte;
 310      if (!$debug_objets['sourcefile']) return;
 311      if ($texte && ($var_mode_objet != $fonc || $var_mode_affiche != $type))
 312          return;
 313      if (!$fonc) $fonc = $debug_objets['principal'];
 314      $link = new Link;
 315      $link->delvar('var_mode_affiche');
 316      $link->delvar('var_mode_objet');
 317      $link->addvar('var_mode','debug');
 318      $self = quote_amp($link->getUrl());
 319  
 320  // en cas de squelette inclus,  virer le code de l'incluant:
 321  // - il contient souvent une Div restreignant la largeur a 3 fois rien
 322  // - ca fait 2 headers !
 323      ob_end_clean();
 324  
 325      @header('Content-Type: text/html; charset='.lire_meta('charset'));
 326      echo debut_entete('Spip ' . $GLOBALS['spip_version_affichee'] . ' ' .
 327                _T('admin_debug') . ' ' .
 328                supprimer_tags(extraire_multi(lire_meta('nom_site')))), 
 329        "<link rel='stylesheet' href='spip_admin.css' type='text/css'>",
 330        "</head>\n<body style='margin:0 10px;'>",
 331        "\n<div id='spip-debug' style='position: absolute; top: 22px; z-index: 1000;height:97%;left:10px;right:10px;'><div id='spip-boucles'>\n"; 
 332  
 333      if ($var_mode_affiche !== 'validation') {
 334        foreach ($debug_objets['sourcefile'] as $nom_skel => $sourcefile) {
 335          echo "<fieldset><legend>",$sourcefile,"&nbsp;: ";
 336          echo "\n<a href='",$self, "&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=squelette#$nom_skel'>"._T('squelette')."</a>";
 337          echo "\n<a href='",$self, "&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=resultat#$nom_skel'>"._T('zbug_resultat')."</a>";
 338          echo "\n<a href='", $self, "&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=code#$nom_skel'>"._T('zbug_code')."</a></legend>";
 339  
 340          if (is_array($contexte = $debug_objets['contexte'][$nom_skel]))
 341              echo afficher_debug_contexte($contexte);
 342  
 343          $i = 0;
 344          $colors = array('#e0e0f0', '#f8f8ff');
 345          $res = "";
 346          if (is_array($debug_objets['pretty']))
 347          foreach ($debug_objets['pretty'] as $nom => $pretty)
 348              if (substr($nom, 0, strlen($nom_skel)) == $nom_skel) {
 349                  $i++;
 350                  $aff = "&lt;".$pretty."&gt;";
 351                  if ($var_mode_objet == $nom)
 352                      $aff = "<b>$aff</b>";
 353                  $res .= "\n<tr bgcolor='" .
 354                    $colors[$i%2] .
 355                    "'><td  align='right'>$i</td><td>" .
 356                    "<a  class='debug_link_boucle' href='" .
 357                    $self .
 358                    "&amp;var_mode_objet=" .
 359                    $nom .
 360                    "&amp;var_mode_affiche=boucle#$nom_skel'>" .
 361                    _T('zbug_boucle') .
 362                    "</a></td><td><a class='debug_link_boucle' href='" .
 363                    $self .
 364                    "&amp;var_mode_objet=" .
 365                    $nom .
 366                    "&amp;var_mode_affiche=resultat#$nom_skel'>" .
 367                    _T('zbug_resultat') .
 368                    "</a></td><td><a class='debug_link_resultat' href='" .
 369                    $self .
 370                    "&amp;var_mode_objet=" .
 371                    $nom .
 372                    "&amp;var_mode_affiche=code#$nom_skel'>" .
 373                    _T('zbug_code') .
 374                    "</a></td><td>" .
 375                    $aff .
 376                    "</td></tr>";
 377              }
 378          if ($res) echo "<table width='100%'>\n$res</table>\n";
 379          echo "</fieldset>\n";
 380        }
 381        echo "</div>\n<a id='$fonc'></a>\n"; 
 382        if ($var_mode_objet && ($res = $debug_objets[$var_mode_affiche][$var_mode_objet])) {
 383          echo "<div id=\"debug_boucle\"><fieldset>";
 384          if ($var_mode_affiche == 'resultat') {
 385          echo "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
 386          ancre_texte($debug_objets['requete'][$var_mode_objet]);
 387          foreach ($res as $view) 
 388              if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>";
 389  
 390          } else if ($var_mode_affiche == 'code') {
 391          echo  "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
 392          ancre_texte("<"."?php\n".$res."\n?".">");
 393          } else if ($var_mode_affiche == 'boucle') {
 394          echo  "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
 395          ancre_texte($res);
 396          } else if ($var_mode_affiche == 'squelette') {
 397          echo  "<legend>",$debug_objets['sourcefile'][$var_mode_objet],"</legend>";
 398          ancre_texte($debug_objets['squelette'][$var_mode_objet]);
 399          }
 400          echo "</fieldset></div>";
 401        }
 402      }
 403      if ($texte) {
 404  
 405        $ouvrant = $fermant = $err = "";
 406        $titre = $GLOBALS['var_mode_affiche'];
 407        if ($titre != 'validation') {
 408          $titre = 'zbug_' . $titre;
 409        }
 410        else {
 411            include_ecrire ("inc_spip_sax.php");
 412            $res = spip_sax($texte);
 413            if (!$res)
 414          $err = _L("impossible");
 415            elseif (ereg("^[[:space:]]*([^<][^0-9]*)([0-9]*)(.*[^0-9])([0-9]*)$", $GLOBALS['xhtml_error'], $r)) {
 416          $fermant = $r[2];
 417          $ouvrant = $r[4];
 418          $rf = reference_boucle_debug($fermant, $fonc, $self);
 419          $ro = reference_boucle_debug($ouvrant, $fonc, $self);
 420          $err = ": " . $r[1] .
 421            "<a href='#L" . $r[2] . "'>$r[2]</a>$rf" .
 422            $r[3] ."<a href='#L" . $r[4] . "'>$r[4]</a>$ro";
 423            } else {
 424            $err = _L("correcte");
 425            $texte = $res;
 426            }
 427        }
 428        echo "<div id=\"debug_boucle\"><fieldset><legend>",
 429          _T($titre),           
 430          ' ',
 431          $err,
 432          "</legend>";
 433        ancre_texte($texte, array($ouvrant, $fermant));
 434        echo "</fieldset></div>";
 435      }
 436      echo "\n</div>";
 437      echo inclure_balise_dynamique(
 438          balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $debug_objets)
 439      );
 440      echo '</body></html>';
 441      exit;
 442  }
 443  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7