When I was new to working with AJAX functions—especially in the realm of form submission—one hurdle I often encountered was how to handle processing errors in my back-end script and give meaningful feedback to my users. I didn’t understand how to designate a response as an error instead of successful processing. Early on, I sometimes employed a dirty hack of prepending any error with the string ERROR: and then adding in some quick checking to see if that substring existed in my response text. While that may get the job done, it’s not good form. It causes convoluted code usage, thumbs its nose at existing error handling functionality and makes future maintenance a headache. But there is a better way by simply utilizing your processing language’s inherent header and error handling functionality.
N.B. From a JavaScript standpoint, I’m showing code based on the jQuery library, because I use it on a regular basis. The concept of triggering the XMLHttpRequest
object error handling with proper headings is applicable to any type of JavaScript coding. Likewise, my server-side processing examples in this article are coded in PHP, but that is not the only applicable language. You can produce similar results with other languages as well, so long as that language allows you to send header information. If you’re willing to translate my examples into another language or non-libraried JavaScript, please do so in the comments or e-mail me (rae.arnold@gmail.com), and I’ll add it into this article (and give you credit, of course).
The information in this article refers to AJAX requests with return dataType
s of html
or text
. JSON and XML dataType
s are for another day.
The client side of things
Let’s say we’re working with a bare-bones comment form: your users add a name, e-mail address and their comment. Three fields, all required, easy-peasy. For the purposes of this article, we’re going to ignore all of the validation you would want to do on the form and focus solely on the process of sending it via AJAX to your PHP processing script. The resulting AJAX call with jQuery might look something like:
//[warning: most of this is pseudo-code, not code you can copy+paste and expect to immediately work]
$.ajax({
type: "get",
url: "/processing/process_comment.php",
data: $("#commentForm").serialize(),
dataType: "html",
async: true,
beforeSend: function(obj) {
//give user feedback that something is happening
showProcessing();
},
success: function(msg) {
//add a success notice
showNotice("success",msg);
clearForm();
},
error: function(obj,text,error) {
//show error
showNotice("error",obj.responseText);
},
complete: function(obj,text) {
//remove whatever user feedback was shown in beforeSend
removeProcessing();
}
});
Essentially, the above JS expects the server-side processing script to return a message to show the user. We’ll set up such a script next.
The server side of things
Processing our simple comment form is close to trivial. We’d want to do some basic validation, make sure the submitter hasn’t been blacklisted for spamming or other reasons (in this example based on IP address), and then add the comment to a DB. The interesting part, however is how to tell the server that an error occurred during the processing and have that error propagate back to the AJAX properly. This is where the header
and exit
functions come in handy. Look at this example:
<?php //[warning: the "processing" is pseduo-code functions, however the error throwing parts are valid]
// perform validation
if (validValues($_GET)) {
if (blacklisted()) {
header('HTTP/1.1 403 Forbidden');
exit("Uh, hi. Your IP address has been blacklisted for too many spammy attempts. Back away from the keyboard slowly. And go away.");
}
if (addComment($_GET)) {
// We have success!
print("Your comment has been successfully added.");
exit(0);
}
// if the code reaches this point, something went wrong with saving the comment to the db, so we should show an error
header('HTTP/1.1 500 Internal Server Error');
exit("Something went wrong when we tried to save your comment. Please try again later. Sorry for any inconvenience");
} else {
header('HTTP/1.1 400 Bad Request');
exit("This is a message about your invalid fields. Please correct before resubmitting.");
}
?>
In PHP, the header
function allows you to send headers to the client. In the syntax used above, it is allowing us to specify error status. For more info on the header
function, head to the PHP manual on header
. exit
is a handy construct that ends script execution while allowing you to print an error. Upon successful completion of the processing, we make sure to call exit(0)
, which signifies successful completion of the script. Any non-0 value indicates that an error occurred. Learn more at the PHP manual on exit
. For errors, you can also use the die
construct, which is equivalent to exit
.
Putting it all together: View a Demo
Let’s get advanced
The above examples for the error
function are pretty simple, but you can create very elegant error handling solutions with it by utilizing other properties of the XMLHttpRequest object. One possibility is to take unique actions based on status code returned. By using the status
property of the object, you can customize your error handling based on the status returned. For instance, this error function script would alert a user to modify form information if needed, but completely remove the form if they found the user is a blacklisted IP (using the same server-side script from above).
error: function(obj,text,error) {
self.showNotice("error",obj.responseText);
if (obj.status == "403") {
self.remove();
}
}
Have you utilized this method in your AJAX programming before? Let us know how it worked for you.
Great post – very informative! You have a very clear, detailed writing style that works great for tutorials.