Newsgroup: it.comp.www.php
Titolo: funzione utile per il controllo delle query

dovendo debuggare un sistema piuttosto grosso ho scritto questa
funzione che spero possa esservi utile, ha quattro livelli di
dettaglio:
3: paranoia, ossia ogni query viene stampata a monitor con un EXPLAIN
query in maniera da capire se c'è qualcosa di lento, indici mal
utilizzati e così via
2: debugging, vine stampata ogni query
1: staging, ogni query che fallisce stampa l'errore mysql_error
0: production, ogni query che fallisce invia una mail a un indirizzo
predefinito
è banale in sé, ma la trovo veramente utile, spero che vi possa
essere utile.
per farla funzionare è sufficiente sostituire ogni occorrenza di
"mysql_query" nelle vostre pagine con "my_mysql_query" e includere la
seguente funzione nel file di configurazione:
<?php
function die_($error,$SQL){
print("<pre>".$error.$SQL."</pre>");
exit;
}
function get_microtime_ms(){
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}
define ("test", 3); //scegli il livello di dettaglio:
function my_mysql_query($SQL){
    if(test == 3){ // paranoia
        $query_start = get_microtime_ms();
        $exp = mysql_query("EXPLAIN ".$SQL);
        $query_end =   get_microtime_ms();
        $query_time = $query_end - $query_start;
        $explain .="\n<table border=\"1\">";
        $explain
.="<tr><td>id</td><td>select_type</td><td>table</td><td>type</td><td>possible_keys</td><td>key</td><td>key_len</td><td>ref</td><td>rows</td><td>Extra</td></tr>";
        while( $explain_r = mysql_fetch_array($exp)){
            $explain .="\n\t<tr>";
                for($i=0;$i<10;$i++){
                    $explain .=
"\n\t\t<td>".$explain_r[$i]."&nbsp;</td>";
                }
            $explain .="\n\t</tr>";
        }
        $explain .="\n</table>";
        $r = mysql_query($SQL)or die(die_(mysql_error(),$SQL));
        $returned = mysql_num_rows($r);
        print("<pre>".trim($SQL)."\n".$explain."Time spent:
".$query_time."\nReturned rows:
".$returned."\n--------------\n</pre>");
        return $r;
    }
    if(test == 2){ // hard debugging
        print("<pre>".trim($SQL)."\n--------------\n</pre>");
        $r = mysql_query($SQL)or die(die_(mysql_error(),$SQL));
        return $r;
    }
    elseif(test == 1){ // testing
        $r = mysql_query($SQL)or die(die_(mysql_error(),$SQL));
        return $r;
    }
    elseif(test == 0){ //production
        $r = mysql_query($SQL)or die(mail("
tua...@tuodominio.com
",
"[SQL ".$_SERVER["HTTP_HOST"]."] Error on ".$_SERVER['SCRIPT_NAME'],
date()."\nError\n".mysql_error()."\n".$SQL."\n")." a query went
wrong");
        return $r;
    }
}
?>
(magari possiamo migliorarla insieme)

 (magari possiamo migliorarla insieme)
sai che mi sembra una bella idea .. :) quindi grazie, ora la guardo e ti 
dirò :D
-- 
SEZIONE DIVERTIMENTO & AFFINI: "Qual è il poliziotto più sfortunato? 
Quello che muore al posto di  blocco. E quello più fortunato? Blocco!"
[CapoBecchino] - hotmail/msn: capobecchino [@] hotmail [.] com

 
Io con PHP5 preferisco utilizzare le eccezioni. In questo modo ho un 
migliore controllo del flusso. Perň l'idea č buona. Evita di cambiare 
tutto ogni volta.
-- 
Dott. Hellboy
MSN: 
simo...@hotmail.com
IChat: 
simo...@mac.com
http://www.hardboiled.it

 
sì, e poi c'è da dire una cosa, se si utilizza un motore di template quella
funzione stampa tutto ordinatamente come un listato, e poi sotto c'è la
pagina così come sarebbe normalmente.
-- 
rotolando sul pavimento che ride