views:

137

answers:

6

I am trying to send an XML file from a textfield in my html, via ajax to a PHP file. This is the almighty PHP file:

<?php 
    $data = urldecode($_POST["xml"]);

    echo $data;
?>

Data is sent to this file as such:

$("#btn_save").click(function() {
    var data = escape($("#textfield").text());
    alert(data);
    $.ajax({
        url:        "validate.php",
        method:     "POST",
        data:       "xml=" + data,
        complete:   function(e) { alert(e.responseText); }
    });
});

Now, as long as I don't sent more than a few lines of code, it works as it should. When I paste in a 60 line XML file however, validate.php returns

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /xml_stylist/form/validate.php
on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at dahwan.info Port 80</address>
</body></html>

What am I doing wrong?

Thanks

A: 

Setting the data option on ajax calls means jquery will add these to the query string in a GET request. Most browsers have a limit on the length of a get request. If your xml data is too big, you should switch to POST.

Marco
The limit on GET imposed by browsers used to be about 4K generally, maybe it still is. I stopped using GET for anything heavyweight when I discovered that.
Mark Chorley
+1  A: 

Most browsers have a practical maximum of 2,083 characters in the url; there is no limit for a POST request. A GET request will pass the parameters in the url whereas a post does not. It all depends on how much you're actually sending to determine which you should use or if you're sending sensitive data (use POST).

mjw06d
A: 

Optimize your php.ini

  • post_max_size you may have to set your memory_limit to higher value..
  • depends on the memory usage of your
    script also
  • max_execution_time could be a problem
Flave
+3  A: 

Change

method: "POST"

to

type: "POST"

that may do the trick.

BenSho
ya beat me to it! I always that "type" _should_ be "method"...it would make sense
David Murdoch
Yeah, thanks! :)
Codemonkey
A: 

try this:

$("#btn_save").click(function() {
    var data = $("#textfield").text();
    $.ajax({
        url:        "validate.php",
        type:       "POST",
        data:       {"xml": data},
        complete:   function(e) { alert(e.responseText); }
    });
});
David Murdoch
A: 

BenSho is correct, the argument is called type. In addition:

$("#textfield").text()

I'm guessing that's a <textarea>. You shouldn't use text() or html() to read content from an input field, it doesn't do what you think. Use val().

var data = escape($("#textfield").text());

Don't ever use escape(). It is a weirdo JavaScript-specific function that looks like URL-encoding but isn't. If you use it for URL-encoding you will corrupt plus signs and all non-ASCII characters.

The correct JavaScript function for URL-encoding is encodeURIComponent(). However, since you are using jQuery, much better to let it work out URL-encoding for you by passing an object in:

data: {xml: $("#textfield").text()},

Finally:

$data = urldecode($_POST["xml"]);

You don't have to (and shouldn't) URL-decode anything manually. PHP URL-decodes parameters in a request body into raw strings for you.

bobince