Question

J'ai un fichier PHP qui n'est accessible que via AJAX. L'appel AJAX s'attend uniquement à des données formatées comme un json_encodeD Sortie. J'essaie de faire une fonction de gestionnaire d'erreurs personnalisée qui attrape les erreurs PHP, et plutôt que de les sortir directement, les transmet plutôt au tableau, ils sont codés pour l'analyseur JSON.

Jusqu'à présent, j'ai

// error handler function
function handleErrors($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting
        return;
    }

    $response['php_error'][] = "Error [$errno] - $errstr on line $errline in file $errfile";

    /* Don't execute PHP internal error handler */
    return true;
}

set_error_handler("handleErrors");

//do other stuff that might trigger php errors

if ($result===true){
    $response['success'] = true;
}else{
    $response['success'] = false;
    $response['error'] = $result;
    $response['request'] = json_encode($_REQUEST);
}

echo json_encode($response);

Mon problème est que le $response Array est hors de portée pour le reste du document pour accéder afin qu'il soit sorti dans l'objet JSON. Existe-t-il un moyen de passer une variable par référence dans la fonction personnalisée ou une autre façon dont j'ai négligé?

Était-ce utile?

La solution

Dans un contexte OOP, vous pouvez définir $response comme propriété.

class myclass {

    var $response;

    function __construct()
    {
        set_error_handler(array($this, 'handleErrors'));
    }

    function handleErrors($errno, $errstr, $errfile, $errline)
    {
        if ( ! (error_reporting() & $errno))
        {
            // This error code is not included in error_reporting
            return;
        }

        $this->response['php_error'][] = "Error [$errno] - $errstr on line $errline in file $errfile";

        /* Don't execute PHP internal error handler */
        return true;
    }

    function outputAjax()
    {
        // my code

        if ($result === true)
        {
            $this->response['success'] = true;
        } else
        {
            $this->response['success'] = false;
            $this->response['error'] = $result;
            $this->response['request'] = json_encode($_REQUEST);
        }

        echo json_encode($this->response);
    }

}

Autres conseils

Définissez $ Response comme global dans votre fonction

function handleErrors($errno, $errstr, $errfile, $errline)
{
    global $response;
    //further code..
}

Ou utilisez $ global

$GLOBALS['response']['php_error'][] = "Error [$errno] - $errstr on line $errline in file $errfile";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top