10

Possible Duplicate:
How to manage a redirect request after a jQuery Ajax call

I have a form that is validated client-side with Jquery. Jquery then passes this data to a php script for server-side validation. At the end of the php script, I try to redirect upon success, but no re-direction happens.

Is Jquery interfering with the redirection? How can I get the php script to redirect. Don't want to redirect with jquery, bc I am going to use sessions and want to keep the session data at redirection.

Here is the code:

JQUERY:

$.ajax({
                    //this is the php file that processes the data and send mail
                    url: "includes/process/processAdminLogin.php",
                    //POST method is used
                    type: "POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType: "text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.

                        if(data == "fail"){
                            $("#statusMessage").html("");
                            $("#statusMessage").html("<p class='statusBoxWarning'>Username and password do not match!</p>");
                            $('button').removeAttr('disabled');
                            document.forms[0].reset();
                        }                               
                    }
                }); 

PHP

if($correctPass == 1){
ob_start();
session_start();
$_SESSION['usernameIdentity'] = $userName;
unset($userName, $userPass);
header("Location: ../../adminDashboard.html");
exit;
}else{
echo "fail";
}

The php script gets to the redirection part and just hangs up. I would really want to keep jquery functionality, along with php redirection. Is there a better method?

Thanks!

                              FINAL WORKING SOLUTION:

Ok, after the input from this post and other similar posts, this is what I have as the working solution. It may not be the most efficient or prettiest solution, but it works, and will have to do for now.

JQUERY

$.ajax({
                    //this is the php file that processes the data and send mail
                    url: "includes/process/processAdminLogin.php",
                    //GET method is used
                    type: "POST",
                    //pass the data        
                    data: dataString,    
                    //indicate result is text
                    dataType: "text",
                    //Do not cache the page
                    cache: false,
                    //success
                    success: function (data) {
                        $('input').removeAttr('disabled'); //enable input fields again.
                        if(data == "success"){
                            $('#statusMessage').html('<form action="http://www.example.com/test/userRegistration/adminDashboard.html" name="userSubscription" method="post" style="display:none;"><input type="text" name="username" value="' + reg_contact_username + '" /><input type="text" name="password" value="' + reg_contact_password + '" /></form>');
                            document.forms['userSubscription'].submit();
                        }else{alert("couldn t redirect");}                              

                    }
                }); 

PHP

if($correctPass == 1){
echo "success";
}else{
echo "fail";
}

The receiving redirection page will have to verify username and password being given again, so validation will be done 2x...which is really inefficient. If anybody can provide me with a better solution - please! A sample write out would also help out.

Thanks!

Community
  • 1
  • 1
Johny
  • 359
  • 1
  • 5
  • 14

3 Answers3

5

Since AJAX happens "behind the scenes" (so to speak) your redirect will just interrupt the response to your javascript handler.

You'll need to return the URL and have your callback kick the browser to a new location.

Update:

On this note, since you have to return data to the front end, you'll want to add a status or similar variable so that you can switch your front end behavior based on whether the call "failed" or not.

Update 2:

In response to your solution, I strongly recommend against your form submission technique. As you say, it's not efficient, it's not pretty, and it requires twice the work (validating the user 2 times).

Why don't you use PHP's built in session handling to set a session if the user logs in successfully, and then simply check the session after a simple javascript browser redirect?

A javascript redirect is as simple as window.href = "http://mylocation" and if you don't know much about PHP's sessions, you could use this class I've built up (please disregard that it's also managing cookies, that's a silly oversight).

rockerest
  • 10,412
  • 3
  • 37
  • 67
  • I am thinking by "status" variable, you're referring to implementing a solution similar to the one seen at the possible content duplicate link above ("How to manage a redirect..."), right? – Johny Jan 29 '13 at 03:14
  • Yes, very similar. I'm a big fan of creating PHP `stdClass` objects, then `json_encode` them to create a nice javascript object on the front end. – rockerest Jan 29 '13 at 03:28
  • Thanks for the input. I will work on implementing the method as you suggested. – Johny Jan 29 '13 at 05:02
1

Where are you flushing your output buffer? Try to add ob_end_flush(); after the header() redirection and see if that works.

EDIT: Maybe turning your relative URI to an absolute URI will fix your issue. This is a general example directly pulled from php.net. It creates an absolute URI based on a relative one - you could always hard-code the absolute URI instead of doing it this way.

<?php
  /* Redirect to a different page in the current directory that was requested */
  $host  = $_SERVER['HTTP_HOST'];
  $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  $extra = 'mypage.php';
  header("Location: http://$host$uri/$extra");
  exit;
?>
istos
  • 2,654
  • 1
  • 17
  • 19
  • Directly quoted from php.net: "Note: HTTP/1.1 requires an absolute URI as argument to » Location: including the scheme, hostname and absolute path, but some clients accept relative URIs. You can usually use $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] and dirname() to make an absolute URI from a relative one yourself" – istos Jan 29 '13 at 03:14
  • Buffers are flushed implicitly upon `exit;` – Ja͢ck Jan 29 '13 at 03:19
  • @Jack Interesting... didn't know! – istos Jan 29 '13 at 03:20
  • No, it's not working. I think Rockerest is right...I need to implement the redirect with jquery...but then comes the question of how to keep the session data active...ugh! – Johny Jan 29 '13 at 03:22
  • Yes I think Rockerest is right too. I just tried it myself and what happens is that the content of the redirected page is sent back to the jQuery's success function as the data parameter. If you console.log() the data parameter in the success function, you should be able to see what's on the "adminDashboard.html" page. So technically it is redirecting (I guess), it's just that the content of the redirected page goes back to JavaScript... which makes sense if you think about it. Hope it helps! – istos Jan 29 '13 at 03:46
0

Try using the full url in the AJAX call.

Instead of:

    url: "includes/process/processAdminLogin.php",

Try:

    url: "http://www.mysite.com/includes/process/processAdminLogin.php",
sgarbesi
  • 339
  • 4
  • 6