Wap
Wap

Reputation: 587

Asynchronous PHP Query with Ajax?

I'm having trouble understand this. Ajax is asynchronous, that much is certain...it asynchronously calls on PHP, and that PHP has a sql query for the database. That means that PHP sql query is also done asynchronously, right? Otherwise, it defeats the purpose. But without using Ajax, the PHP sql query would be synchronous, is that it? I know how to put it to code, but I'm just confused on how it works internally.

Upvotes: 4

Views: 2726

Answers (2)

Ian
Ian

Reputation: 50933

The SQL query is "asynchronous" in terms of it being apart of the original AJAX call. Don't get hung up on the terminology past that. Client and server are totally separate, especially when dealing with HTTP requests, and in this scenario. The meaning of "asynchronous" with AJAX is that it is processed asynchronously from the rest of the Javascript - it doesn't block the other code from executing. But from then on, everything must be synchronous, otherwise it will not work (excluding the readystatechange for the AJAX).

The AJAX request goes to the server, the server queries the database, the server responds, the Javascript hears that response, and the AJAX handler processes the response as soon as it isn't being blocked by other Javascript.

So no, the PHP SQL query itself is always synchronous; it's the HTTP request that is asynchronous.

UPDATE:

As an example, here's a very stripped, low level of AJAX that most libraries wrap in certain ways:

var xhr= new XMLHttpRequest();
var params = "x=2&y=3";
var url = "/your/url";
xhr.open("POST", url, true);
xhr.onreadystatechange = function () {
    // The `xhr.readyState` changes based on the client's 
    // The `xhr.status` is set based on the server's response
    // Normally, you check for `readyState` being 4 and `status` being 200
    //   meaning that the request is complete and the HTTP status code is 200 (good response)
    if (xhr.readyState == 4) {
        if (xhr.status == 200) {
            // All good
        }
    } else {

    }
};
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(encodeURIComponent(params));

When xhr.send is called, it makes the asynchronous HTTP request to the server, and that's just about that for the Javascript. The onreadystatechange listener is what runs when the readyState changes. A value of 4 means it has completed, and status 200 is what you're looking for...whenever that is.

Anything can happen on the server. You can make an "asynchronous" (unrelated) database call, contact a different server in whatever way, delay for whatever reason (to a certain limit) or something like that. The point is that nothing is known on the client (Javascript) until the server returns a response. The server could loop for a long time checking the database each time, and never respond until there's a certain change (an example of long polling).

Upvotes: 4

usumoio
usumoio

Reputation: 3568

Okay, you're pretty much correct, but here is some specification. Your right that a query to your database will be asynchronous. It is important to note that your PHP server will create an open and unique data session with the client machine. Now, when a page is requested, the client will send a response that will include a script (probably in javascript) that will run commands on the client machine. In your case some of those commands make asynch calls to your server, and your server can remember because of the session. Then based on what your server knows about the session it will serve the calls as you request. You can call your database server or access session variables or do some kind of processesing that might be easier in PHP. Then when that processing is done the server will send a response back to the client in question based on the unique session. As an important side note remember that what ever you do asynchronously will take its time on the server and do what it has to do. If you reference variables in your client scripts that where being processed by the server before it finishes its work, they will appear on your client machine as wrong (potentially but very likely). Your database calls will happen asynchronously as you expected.

Upvotes: 2

Related Questions