42 votes

Retourner les erreurs de l'exécution de PHP via. AJAX ?

Existe-t-il un moyen de faire en sorte que PHP renvoie un code d'erreur AJAX si le script PHP échoue quelque part ? Je suivais un tutoriel et j'ai tapé ceci dans mon PHP :

$return\['error'\] = true;
$return\['msg'\] = "Could not connect to DB";

Et tout allait bien, jusqu'à ce que je réalise que c'était des données JSON. Existe-t-il un moyen de renvoyer les erreurs en utilisant le standard $_POST et les données HTML renvoyées (par exemple, en déclenchant la fonction AJAX de JQuery) ? error: événement ?

101voto

Linus Kleen Points 15925

Je ne connais pas jQuery, mais s'il fait la distinction entre les requêtes Ajax réussies et non réussies (HTTP 200 OK vs. HTTP != 200), vous pourriez vouloir que votre script PHP réponde avec un code HTTP non égal à 200 :

if ($everything_is_ok)
    {
        header('Content-Type: application/json');
        print json_encode($result);
    }
else
    {
        header('HTTP/1.1 500 Internal Server Booboo');
        header('Content-Type: application/json; charset=UTF-8');
        die(json_encode(array('message' => 'ERROR', 'code' => 1337)));
    }

1voto

Webist Points 23
$return = array();
$return['msg'] = "Could not connect to DB";

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest')
{
    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/json');
    die(json_encode($return));
}

-1voto

Tangi Points 21

Essayez ceci. J'espère que cela vous aidera.

<!-- This is index.php --->
<html>
        <head>
            <script src="js/jquery.js" type="text/javascript"></script><!-- link to jQuery -->
            <script language="javascript"> 
            $(document).ready(function () {
                $('input#send').click(function(){
                    /* Empty div#error and div#result incase they contain info from the last submission */
                    $('#error').empty('');
                    $('#result').empty('');
                    /* Client-side validation */
                    var name = $("input#name").val();
                    var age = $("input#age").val();
                    if (name==''){
                        alert('Insert your name.');
                    }
                    else if (age==''){
                        alert('Insert your age.');
                    } else { 
                        var params = 'name=' + name + '&age=' + age;   
                        $.ajax({        
                             url:'b.php',        
                             type:'post',                 
                             dataType:'html',            
                             data:params,
                             cache: false,            
                             success:data     
                             }); 
                        function data (html) {
                            var $html = $( html ); // create DOM elements in a jQuery object
                            /* Return errors from 'b.php' */
                            $html.filter('#err').appendTo("#error");
                            /* Return valid Post */
                            $html.filter('#res').appendTo("#result");
                            /* Clear name input */
                            $('input#name').val('');
                            /* Clear age input */
                            $('input#age').val('');
                        }
                    }
                }); 
            }); 
            </script>
            <style type='text/css'>
                #error{
                    color:maroon;
                    font-weight:bold;
                }
                #result{
                    color:green;
                    font-weight:bold;
                }
            </style>
        </head>
        <body>
            <div id="error"></div><!-- View Errors -->
            <div id="result"></div><!-- View valid Post -->
            <input type='text' name='name' id="name" value='' /><br/ >
            <input type='text' name='age' id="age" value='' /><br/ >
            <input type='submit' name='send' id="send" value='Send' />
        </body>

<?php
/* This is b.php */
if(($_POST['name']=='')||($_POST['age']=='')){
    $error = '<div id="err">Error: Fill in ALL fields.</div>';
} elseif(is_numeric($_POST['name'])){
    $error = '<div id="err">Error: Name should NOT contain numbers.</div>';
} elseif(!is_numeric($_POST['age'])){
    $error = '<div id="err">Error: Age should ONLY contain numbers.</div>';
} else{
    $result = '<div id="res">Hi '.$_POST['name'].', you are '.$_POST['age'].' years old.</div>';
}
echo $error;
echo $result;
?>

-2voto

Pour un simple transfert de données de PHP vers AJAX, l'encodage Json ou les paires clé-valeur ne sont pas toujours nécessaires. Il est possible de le faire simplement en utilisant la manipulation des chaînes de caractères.

Un exemple de code expliquant cette fonctionnalité est présenté ci-dessous.

    $query = "SELECT email FROM login WHERE email = '". mysqli\_real\_escape\_string($conn,$email) ."' AND password = '". mysqli\_real\_escape\_string($conn,$pass) ."'" ;

    $result = mysqli\_query($conn,$query);
    $row=mysqli\_fetch\_row($result);

    $row\_cnt = mysqli\_num\_rows($result);
    $s\_email = $row\[0\];

    if ($row\_cnt == 1) {
        $response="success";
    } else {
    $response = "Invalid Credentials";
    }

    $conn->close();

    $\_SESSION\["email"\]= $s\_email;
    echo $response;

Ce code montre comment une réponse de "succès" est renvoyée à ajax en appelant le code php. Plus loin dans ajax, ce qui suit pourrait être fait pour récupérer la réponse.

    $.ajax({ type : 'POST',
          data : {email: $('#email').val(), password: $('#pass').val()},
          url  : 'login.php',              
          success: function (data) {
            if(data == 'success'){  //the value echoed from php can be stored in the data variable of ajax
                window.location.assign('upload.php');
            }
            else{
                alert(data);
            }
          },
          error: function ( xhr ) {
            alert("error");
        }
    });

Le concept ci-dessus peut être étendu pour renvoyer également des VALEURS MULTIPLES. Cette méthode permet un transfert simple des données de PHP à AJAX dans un format de chaîne.

Nous devons suivre une étape simple consistant à faire écho à tout ce que nous devons envoyer comme réponse du php à l'ajax, en le séparant par un séparateur unique.

    echo $response.#;
    echo $email.#;
    echo $password.#;
    echo "Hello".#;
    echo "World";

Ensuite, les données variables dans ajax pourraient être simplement récupérées comme dans l'exemple ci-dessus et une simple fonction comme,

    var res = data.split("#");

données, étant la variable dans ajax. Le tableau res peut alors être utilisé dans js pour n'importe quel but que nous avons besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X