[ Index ] |
|
Code source de SPIP 1.8.3 |
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>: ".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><BOUCLE".$id_boucle.">(" 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></BOUCLE".$id_boucle."></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&var_mode_objet=$skel&var_mode_affiche=squelette&var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"); 267 else { 268 $self .= "&var_mode_objet=$skel$boucle&var_mode_affiche=boucle"; 269 270 return !$ligne ? " (boucle <a href='$self#$skel$boucle'>$boucle</a>)" : 271 " (boucle $boucle ligne <a href='$self&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," : "; 336 echo "\n<a href='",$self, "&var_mode_objet=$nom_skel&var_mode_affiche=squelette#$nom_skel'>"._T('squelette')."</a>"; 337 echo "\n<a href='",$self, "&var_mode_objet=$nom_skel&var_mode_affiche=resultat#$nom_skel'>"._T('zbug_resultat')."</a>"; 338 echo "\n<a href='", $self, "&var_mode_objet=$nom_skel&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 = "<".$pretty.">"; 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 "&var_mode_objet=" . 359 $nom . 360 "&var_mode_affiche=boucle#$nom_skel'>" . 361 _T('zbug_boucle') . 362 "</a></td><td><a class='debug_link_boucle' href='" . 363 $self . 364 "&var_mode_objet=" . 365 $nom . 366 "&var_mode_affiche=resultat#$nom_skel'>" . 367 _T('zbug_resultat') . 368 "</a></td><td><a class='debug_link_resultat' href='" . 369 $self . 370 "&var_mode_objet=" . 371 $nom . 372 "&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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |