Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    277

    Visualizzare messaggi d'errore in una nuova finestra

    Sto estendendo la classe Excpeion per fare sì che ogni messaggio di errore venga aperto in una nuova finestra.

    Il mio codice è:

    Codice PHP:
    class GDIException extends Exception 

    function 
    __construct($message$code=0
    parent::__construct($message$code); }

    public static function 
    showGDIInfo_handle($errno$errmsg$filename$linenum$vars)
    {
    echo 
    '<script type="text/javascript">
    window.open(\'\',\'hhh\',\'width=640,height=880,status=no,toolbar=no,resizable =yes,scrollbars=yes\');
    </script>'
    ;
    echo 
    "<div class='error_handle'><ul>" .
    "[*]

    Messaggio di errore : 
    $errmsg</p>" .
    "[*]

    File sorgente: : 
    $filename</p>" .
    "[*]

    Linea: 
    $linenum</p>" .
    "[/list]</div>";
    }


    ovviamente il giochino non funziona. Perché il js apre la nuova pagina, ma poi il php continua a scrivere nella pagina corrente. Come posso fare ad indirizzare il contenuto (messaggio di errore) sulla nuova pagina?

    Grazie mille!

  2. #2
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Io farei qualcosa del tipo:

    index.php che genera l'eccezione
    Codice PHP:
    <?php
    session_start
    ();
    class 
    MyException extends Exception{
        public function  
    __construct($message$code) {
            
    parent::__construct($message$code);
            
    $_SESSION[__CLASS__][$code]['message']=$message;
        }

        public function  
    __toString() {
            return 
    "<script type=\"text/javascript\">window.open('errore.php');</script>";
        }
    }

    ob_start();
    try{
        echo 
    "Questo testo non apparirà mai";
        throw new 
    MyException("Messaggio di eccezzione che è opportuno visualizzare "125);//Provoco volontariamente l'eccezione
    }catch(MyException $e){
        
    ob_clean();
        echo 
    $e;
    }
    ob_flush();
    ?>
    File Errore.php da completare a proprio piacimento che si occupa di mostrare l'errore
    Codice PHP:
    <?php
    session_start
    ();

    foreach (
    $_SESSION['MyException'] as $key => $value)
        echo 
    "Errore $key
    {$value['message']};

    "
    ;

    unset(
    $_SESSION['MyException']);
    ?>
    I dati tra i file viaggiano via sessione.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    277
    Ottima la tua soluzione, grazie mille!

    Stavo però cercando di tenere separate pagina con gestione del codice e pagina php.

    Allora ho creato due pagine:
    la prima (diciamo: main.php):
    Codice PHP:
    ...
    require_once( 
    str_replace('//','/',dirname(__FILE__).'/') .'../../common/inc/errore.php');
    ...
    try{
        echo 
    "Questo testo non apparirà mai";
        throw new 
    MyException("Messaggio di eccezione che è opportuno visualizzare "125);//Provoco volontariamente l'eccezione
    }catch(MyException $e){
        
    ob_clean();
        echo 
    $e;


    E nel file errore.php:
    Codice PHP:
    <?php
    session_start
    ();

    class 
    MyException extends Exception{
        public function  
    __construct($message$code) {
            
    parent::__construct($message$code);
            
    $_SESSION[__CLASS__][$code]['message']=$message;
        }

        public function  
    __toString() {

        
    $window "http://local-ssp.upt:8080/deploy/common/inc/errore2.php";//per ora qui ho messo l'url diretto della pagina, poi mi preoccuperò di come referenziarlo in modo relativo
            
    return "<script type=\"text/javascript\">window.open('".$window."');</script>";
        }

    foreach (
    $_SESSION['MyException'] as $key => $value)
        echo 
    "Errore $key
    {$value['message']};

    "
    ;

    unset(
    $_SESSION['MyException']);
    ?>
    però non mi funziona.: il mani.php si blocca sul javascript, tra l'altro sparisce tutto ciò che dovrebbe venire prima del js....

    sai come aiutarmi?
    Grazie mille!

  4. #4
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Mi è più semplice darti un esempio didattico funzionante che modificare porzioni di codice.

    L'esempio che segue è una stupidissima calcolatrice che presi due valori dai campi di testo e selezionata l'operazione ti ritorna il risultato. Si genera un eccezione
    • inserendo dei valori non numerici nei campi
    • selezionando come operatore % poichè non implementato in logica.php
    • provando a dividere un numero per 0


    Abbiamo 4 file:
    • index.php - file di visualizzazione
    • logica.php - file della logica php per index.php
    • MyException.php - modulo con la classe per la gestione degli errori
    • errore.php - pagina di visualizzazione di supporto a MyException.php


    index.php
    Codice PHP:
    <?php require_once 'logica.php';?>
    <html>
        <head>
            <title>Stupida Calcolatrice</title>
        </head>
        <body>
            <h1>Stupida Calcolatrice</h1>
            <form action="index.php" method="post">
                <input type="text" name="<?php echo operando;?>[]" value="<?php echo (isset($_POST[operando])) ? $_POST[operando][0] : "Inserire un numero" ?>">
                <select name="<?php echo operatore;?>">
                    <?php
                        
    //Visualizzazione delle option precaricate nell'array $operatori in logica.php
                        // con permanenza dell'ultimo operatore selezionato
                        
    foreach ($operatori as $value)
                            echo 
    "<option ".((isset($_POST[operatore]) and $_POST[operatore]==$value) ? "selected=\"selected\"" "").">$value</option>";
                    
    ?>
                </select>
                <input type="text" name="<?php echo operando;?>[]" value="<?php echo (isset($_POST[operando])) ? $_POST[operando][1] : "Inserire un numero" ?>">
                [b]<?php echo $responso;?>[/b]

                <input type="submit" value="Calcola">
            </form>
        </body>
    </html>
    logica.php
    Codice PHP:
    <?php
    //Sezione di definizione
    session_start();
    require_once 
    'MyException.php';

    define('operando''operando');
    define('operatore','operatore');
    //Per aggiungere un nuovo operatore mi basta metterlo nell'array seguente e
    //definire più sotto il case implementativo
    $operatori=array('/','*','+','-','%');

    $responso="";

    //Sezione di elaborazione
    if (isset($_POST[operatore]))
        try {
            if (!
    is_numeric($_POST[operando][0]))
                throw new 
    MyException("Il primo operatore non &egrave un numero"1);
            if (!
    is_numeric($_POST[operando][1]))
                throw new 
    MyException("Il secondo operatore non &egrave un numero"2);
            switch (
    $_POST[operatore]) {
                case 
    '/':
                    if (
    $_POST[operando][1] == 0)
                        throw new 
    MyException("Non &egrave possibile dividere per 0"3);
                    
    $responso $_POST[operando][0] / $_POST[operando][1];
                    break;
                case 
    '*':
                    
    $responso $_POST[operando][0] * $_POST[operando][1];
                    break;
                case 
    '+':
                    
    $responso $_POST[operando][0] + $_POST[operando][1];
                    break;
                case 
    '-':
                    
    $responso $_POST[operando][0] - $_POST[operando][1];
                    break;
                default:
                    throw new 
    MyException("Operatore non implementato"100);
                    break;
            }
            
    $responso="=$responso";
        } catch (
    MyException $e) {
            
    $responso $e "Operazione non effettuabile";
        }
    ?>
    MyException.php
    Codice PHP:
    <?php
    //Classe per la gestione degli errori
    class MyException extends Exception{
        public function  
    __construct($message$code) {
            
    parent::__construct($message$code);
            
    $_SESSION[__CLASS__]['message']=$message;
            
    $_SESSION[__CLASS__]['code']=$code;
        }

        public function  
    __toString() {
            return 
    "<script type=\"text/javascript\">window.open('errore.php');</script>";
        }
    }
    ?>
    errore.php
    Codice PHP:
    <?php
    //Questa è una pagina di supporto alla classe MyException.php con il compito
    //di visualizzare le eccezzioni sollevate

    //Logica della pagina
    session_start();
    if(!isset(
    $_SESSION['MyException'])){
        echo 
    "Nessun errore da visualizzare";
        exit;
    }

    //Dati
    $code=$_SESSION['MyException']['code'];
    $message=$_SESSION['MyException']['message'];
    unset(
    $_SESSION['MyException']);

    //Visualizzazione
    ?>
    <html>
        <head>
            <title>Messaggio di Errore</title>
        </head>
        <body>
            <fieldset style="width: 20em;">
                <legend>Errore: <?php echo $code;?></legend>
                <?php echo $message;?>
            </fieldset>
        </body>
    </html>
    Mi auguro che siano sufficientemente divisi secondo quanto ti aspettavi.
    E' stupida ma abbastanza carina, quindi quando ho due minuti la carico su un server e posto l'indirizzo all'esempio funzionante.


  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    277
    bene, perfetto.

    Ho messo io il tutto in
    http://www.ssp-solution.com/test/errori/index.php

    ed il tutto funziona alla grande.


    Potremmo però migliorarlo: io pensavo di interecettare tutti gli errori, anche ad esempio i pare error.

    Per questo avevo fatto una classe ereditata dalla principale, in modo da poter scrivere in output il dettaglio errore.

    Questo è utilissimo. Alcuni fornitori di hosting infatti non mandano in output i warning php né in aluni casi sono possibili da interecettare a video.

    Come si potrebbe fare una cosa del genere?

  6. #6
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Non tutti i messaggi di errore possono essere gestiti all'interno dello script. Pur facendo uso di set_error_handler il manuale ci dice che

    The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called. If errors occur before the script is executed (e.g. on file uploads) the custom error handler cannot be called since it is not registered at that time.
    Se il problema è quello, all'interno di uno script, di modificare l'error_reporting senza modificare il php.ini, è comunque possibile fare uso della funzione error_reporting
    Codice PHP:
    $old_err_rep=error_reporting(E_ALL E_STRICT); 
    che setta per lo script attualmente in esecuzione un livello di report utile in fase di sviluppo.

    D'altra parte qualcosa di carino si può ancora realizzare. Ho apportato delle modifiche ai file logica.php e MyException.php ed error.php ma per completezza riposto tutte le pagine di modo che chi copia e incolla trova tutti i file dell'esempio funzionante.

    In logica.php viene effettuata la cattura degli errori prodotti da PHP. All'esterno del blocco try-catch occorre però esplicitamente attivate la cattura e al termine disattivarla per consentire la comparsa di altri errori magari nel file di visualizzazione.

    Il problema maggiore sta nel fatto che quando si verifica una eccezione il codice restante del try non viene eseguito e ciò può provocare dei dati mancanti alla pagina addetta alla visualizzazione. Applicare il controllo all'interno della pagina di visualizzazione può provocare la produzione di pagine incomplete. In tal caso sarebbe opportuno utilizzare le funzioni ob_ come nei primi esempi di modo da pulire il buffer e produrre solo l'errore al posto della pagina incompleta o un avvertimento che segnala la mancata produzione della pagina a causa di errori.

    Nell'esempio di codice viene introdotta la chiamata ad un funzione deprecata all'interno di logica.php che fa scattare l'apertura del popup con i dettagli. La mancata completa esecuzione del corpo try ha comunque delle ripercussioni sulla visualizzazione.

    index.php
    Codice PHP:
    <?php require_once 'logica.php';?>
    <html>
        <head>
            <title>Stupida Calcolatrice</title>        
        </head>
        <body>
            <h1>Stupida Calcolatrice</h1>
            <form action="index.php" method="post">
                <input type="text" name="<?php echo operando;?>[]" value="<?php echo (isset($_POST[operando])) ? $_POST[operando][0] : "Inserire un numero" ?>">
                <select name="<?php echo operatore;?>">
                    <?php
                        
    //Visualizzazione delle option precaricate nell'array $operatori in logica.php
                        // con permanenza dell'ultimo operatore selezionato
                        
    foreach ($operatori as $value)
                            echo 
    "<option ".((isset($_POST[operatore]) and $_POST[operatore]==$value) ? "selected=\"selected\"" "").">$value</option>";
                    
    ?>
                </select>
                <input type="text" name="<?php echo operando;?>[]" value="<?php echo (isset($_POST[operando])) ? $_POST[operando][1] : "Inserire un numero" ?>">
                [b]<?php echo $responso;?>[/b]

                <input type="submit" value="Calcola">
            </form>
        </body>
    </html>
    logica.php
    Codice PHP:
    <?php
    //Sezione di definizione
    require_once 'MyException.php';

    session_start();

    define('operando''operando');
    define('operatore''operatore');
    $responso "";

    //Inizia la cattura degli errori generati da PHP
    MyPHPException::Activate(E_ALL E_STRICT);
    try {
        
        
    //Invoco una funzione deprecata
        
    ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})""1999-1-1"$regs);
     
        
    //Per aggiungere un nuovo operatore mi basta metterlo nell'array seguente e
        //definire più sotto il case implementativo
        
    $operatori = array('/''*''+''-''%');

        
    //Sezione di elaborazione
        
    if (isset($_POST[operatore])) {
            if (!
    is_numeric($_POST[operando][0]))
                throw new 
    MyException("Il primo operatore non &egrave un numero"1);
            if (!
    is_numeric($_POST[operando][1]))
                throw new 
    MyException("Il secondo operatore non &egrave un numero"2);
            switch (
    $_POST[operatore]) {
                case 
    '/':
                    if (
    $_POST[operando][1] == 0)
                        throw new 
    MyException("Non &egrave possibile dividere per 0"3);
                    
    $responso $_POST[operando][0] / $_POST[operando][1];
                    break;
                case 
    '*':
                    
    $responso $_POST[operando][0] * $_POST[operando][1];
                    break;
                case 
    '+':
                    
    $responso $_POST[operando][0] + $_POST[operando][1];
                    break;
                case 
    '-':
                    
    $responso $_POST[operando][0] - $_POST[operando][1];
                    break;
                default:
                    throw new 
    MyException("Operatore non implementato"100);
                    break;
            }
            
    $responso "= $responso";
        }
    } catch (
    MyPHPException $e) {
        
    //Cattura dell'errore PHP
        
    echo $e;    
    } catch (
    MyException $e) {
        
    //Cattura di un errore dell'applicazione gestito
        
    $responso $e "Operazione non effettuabile";
    }
    MyPHPException::\DeActivate();
    //Ripristino il gestore normale per gli errori prodotti da PHP
    ?>
    MyException.php
    Codice PHP:
    <?php
    class MyException extends Exception{
        public function  
    __construct($message$code) {
            
    parent::__construct($message$code);
            
    $_SESSION[__CLASS__][]=array('message'=>$message,'code'=>$code);
        }
        
        public function  
    __toString() {
            return 
    "<script type=\"text/javascript\">window.open('errore.php?id=".__CLASS__."','FinestraErrore','');</script>";
        }
    }

    class 
    MyPHPException extends MyException{
        private static 
    $olderrtype;

        public static function 
    Activate($error_type=E_ALL){
            
    MyPHPException::$olderrtype=error_reporting($error_type);
            
    set_error_handler('MyPHPException::ErrorHandler'$error_type);
        }

        public static function 
    DeActivate(){
            
    error_reporting(MyPHPException::$olderrtype);
            
    restore_error_handler();
        }

        public static function 
    ErrorHandler($errno$errstr$errfile$errline$errcontext){
            
    $message="$errstr

    File: "
    .basename($errfile)."
    Line: 
    $errline

    "
    ;        
            if(
    $errno & (E_PARSE E_USER_ERROR))
               return 
    false;        
            throw new 
    MyPHPException($message$errno);
            return 
    true;
        }
    }
    ?>
    errore.php
    Codice PHP:
    <?php
    //Questa è una pagina di supporto alla classe MyException.php con il compito
    //di visualizzare le eccezzioni sollevate

    //Logica della pagina
    session_start();
    foreach (
    $_SESSION[$_GET['id']] as $subvalue) {
        
    $code[] = $subvalue['code'];
        
    $message[] = $subvalue['message'];
    }
    unset(
    $_SESSION[$_GET['id']]);

    //Visualizzazione
    ?>
    <html>
        <head>
            <title>Messaggio di Errore</title>
        </head>
        <body>
            <?php
            $n
    =count($code);
            for(
    $i=0;$i<$n;$i++){
            
    ?>
            <fieldset style="width: 20em;">
                <legend>Errore: <?php echo $code[$i];?></legend>
                <?php echo $message[$i];?>
            </fieldset>
            <?php }?>
        </body>
    </html>

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    277
    Perfetto!!!

    La tua soluzione è perfetta e funziona benissimo.

    Mi dici però che il tipo di errori che dicevi te non possono essere individuati, giusto?

    se infatti metto nel file logica.php subito dopo il blocco try la stringa:

    Codice PHP:
        require_once('cippa.php'); 
    non apre la finestra con il dettaglio errore.

  8. #8
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Dato che hai rivitalizzato questo 3d mi permetto di linkare la mia pagina in cui è possibile vedere la mia Semplice Calcolatrice in funzione mentre fa uso della mia classe per la gestione dell'errore e da cui è anche possibile prelevare il codice per proprio gaudio.

    La classe di gestione dell'errore l'ho utilizzata anche nel Valutatore di Espressioni Regolari il quale però non lascia creare un popup alla classe ma preleva l'errore e lo visualizza sotto forma di testo nella pagina stessa. Per testarlo basta introdurre in pattern la string /(.*/ e cliccare su Testa per vedere in fondo alla pagina (ma potevo disporlo dove meglio credevo) un discreto messaggio che non stravolge il contenuto della pagina come farebbe php
    codice:
    preg_match_all() [function.preg-match-all]: Compilation failed: missing ) at offset 3
    
    File: index.php
    Line: 11
    Facendo la classe uso della funzione set_error_handler, il manuale ci dice che

    The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.