0) { $env_texte="
" . "
#ENV\n" . "
\n"; foreach ($env as $nom => $valeur) { $env_texte .= "\n"; $env_texte .= "\n"; } $env_texte .= "\n
".nl2br(entites_html($nom)) . ": ".nl2br(entites_html($valeur)) . "
\n"; $env_texte .= "
\n"; } return $env_texte; } // Si le code php produit des erreurs, on les affiche en surimpression // sauf pour un visiteur non admin (lui ne voit rien de special) // ajouter &var_mode=debug pour voir les erreurs et en parler sur spip@rezo.net function affiche_erreurs_page($tableau_des_erreurs) { $GLOBALS['bouton_admin_debug'] = true; $res = ''; foreach ($tableau_des_erreurs as $err) { $res .= "
  • " .$err[0] . ", ".$err[1]."
  • \n"; } return "\n
    "; } // // Si une boucle cree des soucis, on peut afficher la requete fautive // avec son code d'erreur // function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) { $GLOBALS['bouton_admin_debug'] = true; if (eregi('err(no|code):?[[:space:]]*([0-9]+)', $erreur, $regs)) $errno = $regs[2]; else if (($errno == 1030 OR $errno <= 1026) AND ereg('[^[:alnum:]]([0-9]+)[^[:alnum:]]', $erreur, $regs)) $errno = $regs[1]; // Erreur systeme if ($errno > 0 AND $errno < 200) { $retour .= "

    " . _T('info_erreur_systeme', array('errsys'=>$errno)) . "
    \n" . _T('info_erreur_systeme2'); spip_log("Erreur systeme $errno"); } // Requete erronee else { $retour .= "<BOUCLE".$id_boucle.">(" . $type . ")
    \n" . ""._T('avis_erreur_mysql')."
    \n" . htmlspecialchars($query) . "\n
    ".htmlspecialchars($erreur) . "
    " . "</BOUCLE".$id_boucle.">
    \n"; include_ecrire('inc_presentation.php3'); include_ecrire('inc_lang.php3'); utiliser_langue_visiteur(); $retour .= aide('erreur_mysql'); spip_log("Erreur requete $id_boucle (".$GLOBALS['fond'].".html)"); } erreur_squelette($retour); } // // Erreur de syntaxe des squelettes : memoriser le code fautif // function erreur_squelette($message='', $lieu='') { global $tableau_des_erreurs; global $auteur_session; static $runs; if (is_array($message)) list($message, $lieu) = $message; spip_log("Erreur squelette: $message | $lieu (" . $GLOBALS['fond'].".html)"); $GLOBALS['bouton_admin_debug'] = true; $tableau_des_erreurs[] = array($message, $lieu); // Eviter les boucles infernales if (++$runs > 4) { if ($_COOKIE['spip_admin'] OR $auteur_session['statut'] == '0minirezo' OR ($GLOBALS['var_mode'] == 'debug')) { echo debut_entete(_T('admin_debug')), '', affiche_erreurs_page($tableau_des_erreurs); exit; } } } // // Le debusqueur version 3 // // appelee a chaque sortie de boucle (inc-compilo) et a chaque requete // dans ce derniers cas on n'a pas le nom du squelette function boucle_debug_resultat ($id, $type, $resultat) { global $debug_objets; $nom = $debug_objets['courant']; if ($type == 'requete') { $debug_objets['requete']["$nom$id"] = $resultat; } else { // ne pas memoriser plus de 3 tours d'une meme boucle if (count($debug_objets['resultat']["$nom$id"]) < 3) $debug_objets['resultat']["$nom$id"][] = $resultat; } } // appelee a chaque sortie de sequence (inc-compilo) function debug_sequence($id, $nom, $niv, $sequence) { global $debug_objets; if (!$niv) { $debug_objets['sequence'][$nom.$id] = $sequence; } $res = ""; foreach($sequence as $v) $res .= $v[2]; return $res; } // appelee a chaque compilation de boucle (inc-compilo) function boucle_debug_compile ($id, $nom, $code) { global $debug_objets; $debug_objets['code'][$nom.$id] = $code; } // appelee a chaque compilation de squelette (inc-compilo) function squelette_debug_compile($nom, $sourcefile, $code, $squelette) { global $debug_objets; $debug_objets['squelette'][$nom] = $squelette; $debug_objets['sourcefile'][$nom] = $sourcefile; if (is_array($GLOBALS['contexte_inclus'])) $debug_objets['contexte'][$nom] = $GLOBALS['contexte_inclus']; else { $debug_objets['contexte'][$nom] = $GLOBALS['contexte']; if (!isset($debug_objets['principal'])) $debug_objets['principal'] = $nom; } } // appelee a chaque analyse syntaxique de squelette function boucle_debug ($nom, $id_parent, $id, $type, $crit, $avant, $milieu, $apres, $altern) { global $debug_objets; $debug_objets['courant'] = $nom; $debug_objets['parent'][$nom.$id] = $id_parent; $debug_objets['pretty'][$nom.$id] = "BOUCLE$id($type)" . htmlspecialchars( preg_replace(",[\r\n],", "\\n", $crit)); // on synthetise avec la syntaxe standard, mais "$avant") . "" . $milieu . "" . (!$apres ? "" : "$apres") . (!$altern ? "" : "$altern"); } function trouve_boucle_debug($n, $nom, $debut=0, $boucle = "") { global $debug_objets; $id = $nom . $boucle; foreach($debug_objets['sequence'][$id] as $v) { if (!ereg('^(.*)(<\?.*\?>)(.*)$', $v[2],$r)) $y = substr_count($v[2], "\n"); else { if ($v[1][0] == '#') // balise dynamique $incl = $debug_objets['resultat'][$v[0]]; else // inclusion $incl = $debug_objets['squelette'][trouve_squelette_inclus($v[1])]; $y = substr_count($incl, "\n") + substr_count($r[1], "\n") + substr_count($r[3], "\n"); } if ($n <= ($y + $debut)) { if ($v[1][0] == '?') return trouve_boucle_debug($n, $nom, $debut, substr($v[1],1)); elseif ($v[1][0] == '!') { if ($incl = trouve_squelette_inclus($v[1])) return trouve_boucle_debug($n, $incl, $debut); } return array($nom, $boucle, $v[0]); } $debut += $y; } return array($nom, $boucle, $n-$debut); } function trouve_squelette_inclus($script) { global $debug_objets; // on suppose que X.php appelle le squelette X.html (a revoir) ereg('^.(.*).php?3', $script, $reg); $incl = $reg[1] . '.html$'; foreach($debug_objets['sourcefile'] as $k => $v) { if (ereg($incl,$v)) return $k; } return ""; } function reference_boucle_debug($n, $nom, $self) { list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom); if (!$boucle) return !$ligne ? "" : (" (" . (($nom != $skel) ? _L("squelette inclus, ligne: ") : _L("squelette, ligne: ")) . "$ligne)"); else { $self .= "&var_mode_objet=$skel$boucle&var_mode_affiche=boucle"; return !$ligne ? " (boucle $boucle)" : " (boucle $boucle ligne $ligne)"; } } // affiche un texte avec numero de ligne et ancre. function ancre_texte($texte, $fautifs=array()) { global $var_mode_ligne; if ($var_mode_ligne) $fautifs[]=$var_mode_ligne; ob_start(); highlight_string($texte); $s = ob_get_contents(); ob_end_clean(); if (substr($s,0,6) == '') { $s=substr($s,6); echo '';} $tableau = explode("
    ", $s); $format = "%0". strlen(count($tableau)). "d "; $format10=str_replace('black','pink',$format); $formaterr="%s"; $i=1; foreach ($tableau as $ligne) { echo "
    \n", sprintf((($i%10) ? $format :$format10), $i), "", sprintf(in_array($i, $fautifs) ? $formaterr : '%s', $ligne) ; $i++; } } // l'environnement graphique du debuggueur function debug_dumpfile ($texte, $fonc, $type) { global $debug_objets, $var_mode_objet, $var_mode_affiche; $debug_objets[$type][$fonc . 'tout'] = $texte; if (!$debug_objets['sourcefile']) return; if ($texte && ($var_mode_objet != $fonc || $var_mode_affiche != $type)) return; if (!$fonc) $fonc = $debug_objets['principal']; $link = new Link; $link->delvar('var_mode_affiche'); $link->delvar('var_mode_objet'); $link->addvar('var_mode','debug'); $self = quote_amp($link->getUrl()); // en cas de squelette inclus, virer le code de l'incluant: // - il contient souvent une Div restreignant la largeur a 3 fois rien // - ca fait 2 headers ! ob_end_clean(); @header('Content-Type: text/html; charset='.lire_meta('charset')); echo debut_entete('Spip ' . $GLOBALS['spip_version_affichee'] . ' ' . _T('admin_debug') . ' ' . supprimer_tags(extraire_multi(lire_meta('nom_site')))), "", "\n", "\n
    \n"; if ($var_mode_affiche !== 'validation') { foreach ($debug_objets['sourcefile'] as $nom_skel => $sourcefile) { echo "
    ",$sourcefile," : "; echo "\n"._T('squelette').""; echo "\n"._T('zbug_resultat').""; echo "\n"._T('zbug_code').""; if (is_array($contexte = $debug_objets['contexte'][$nom_skel])) echo afficher_debug_contexte($contexte); $i = 0; $colors = array('#e0e0f0', '#f8f8ff'); $res = ""; foreach ($debug_objets['pretty'] as $nom => $pretty) if (substr($nom, 0, strlen($nom_skel)) == $nom_skel) { $i++; $aff = "<".$pretty.">"; if ($var_mode_objet == $nom) $aff = "$aff"; $res .= "\n$i" . "" . _T('zbug_boucle') . "" . _T('zbug_resultat') . "" . _T('zbug_code') . "" . $aff . ""; } if ($res) echo "\n$res
    \n"; echo "
    \n"; } echo "
    \n\n"; if ($var_mode_objet && ($res = $debug_objets[$var_mode_affiche][$var_mode_objet])) { echo "
    "; if ($var_mode_affiche == 'resultat') { echo "",$debug_objets['pretty'][$var_mode_objet],""; ancre_texte($debug_objets['requete'][$var_mode_objet]); foreach ($res as $view) if ($view) echo "\n
    ",interdire_scripts($view),"
    "; } else if ($var_mode_affiche == 'code') { echo "",$debug_objets['pretty'][$var_mode_objet],""; ancre_texte("<"."?php\n".$res."\n?".">"); } else if ($var_mode_affiche == 'boucle') { echo "",$debug_objets['pretty'][$var_mode_objet],""; ancre_texte($res); } else if ($var_mode_affiche == 'squelette') { echo "",$debug_objets['sourcefile'][$var_mode_objet],""; ancre_texte($debug_objets['squelette'][$var_mode_objet]); } echo "
    "; } } if ($texte) { $ouvrant = $fermant = $err = ""; $titre = $GLOBALS['var_mode_affiche']; if ($titre != 'validation') { $titre = 'zbug_' . $titre; } else { include_ecrire("inc_spip_sax.php"); $res = spip_sax($texte); if (!$res) $err = _L("impossible"); elseif (ereg("^[[:space:]]*([^<][^0-9]*)([0-9]*)(.*[^0-9])([0-9]*)$", $GLOBALS['xhtml_error'], $r)) { $fermant = $r[2]; $ouvrant = $r[4]; $rf = reference_boucle_debug($fermant, $fonc, $self); $ro = reference_boucle_debug($ouvrant, $fonc, $self); $err = ": " . $r[1] . "$r[2]$rf" . $r[3] ."$r[4]$ro"; } else { $err = _L("correcte"); $texte = $res; } } echo "
    ", _T($titre), ' ', $err, ""; ancre_texte($texte, array($ouvrant, $fermant)); echo "
    "; } echo "\n
    "; echo inclure_balise_dynamique( balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $debug_objets) ); echo ''; exit; } ?>