Ajax发送GET而不是POST请求

3

我已经按照能够找到的所有指南和教程进行了操作,但我仍然无法确定是什么导致了这个问题:

我使用以下代码:

        function updaterow(){
            $.ajax({
                url: 'updaterowajax.php',
                type:'POST',
                data: 'ID=' + ID + '&SupStatus=' + SupStatus +'&$OrderOther=' + OrderOther,
                success: function(result){
                    console.log(result);
                    }
                });
        }

将表单内容发布到php页面,但由于某种原因它似乎没有以post方式发送,尤其是没有将它发送到正确的页面。
在地址栏中出现了以下文本:
orderlist.php?ID=36&SupStatus=2&OrderOther=Ska+binda+Telia+Liten+18+m%E5n.&Submit36=Spara
这是我的AJAX脚本所在的文件名。 在我看来,它正在向当前页面发送GET请求,而不是POST请求到“updaterowajax.php”。
我做错了什么吗? GET中的所有信息都是正确的,但它没有被传递。
代码或者服务器设置有问题吗? 默认Apache,MySQL和我有jQuery 1.7.1.
表单应该被发布:
        while ($row = mysql_fetch_array($query)) {
        echo "<tr><form id='".$row['ID']."'>
                    <td class='idcell'><input type='text' name='ID' readonly='readonly' value='".$row['ID']."' /></td>
                    <td>".$row['ArtName']."</td>
                    <td>".$row['ArtNumber']."</td>
                    <td><a href='/singlepost.php?ID=".$row['ID']."' title='Skriv ut ".$row['CustName']."'>".$row['CustName']."</a></td>
                    <td>".$row['CustContact']."</td>
                    <td>
                        <select name='SupStatus'>
                            <option value='".$row['SupStatus']."'>".$row['SupRealStatus']."</option>
                            <option value='01'>Mottagen</option>
                            <option value='02'>Lagd i korg</option>
                            <option value='03'>Beställd</option>
                            <option value='04'>Ankommen</option>
                            <option value='05'>Slutförd</option>
                            <option value='06'>Nekad</option>
                        </select>
                    <td>".$row['SupRealName']."</td>
                    <td>".$row['Date']."</td>
                    <td><textarea name='OrderOther' cols='40' rows='3'>".$row['OrderOther']."</textarea><input type='submit' value='Spara' name='Submit".$row['ID']."' onClick='updaterow()' /></td></form></tr>";}

还有updaterowajax.php文件

<?php

    $ID = $_POST['ID'];
    $OrderOther = $_POST['OrderOther'];
    $SupStatus = $_POST['SupStatus'];

    mysql_connect ("localhost", "root", "bilradio388") or die ('Kan inte ansluta till databasen för att: ' . mysql_error());
    mysql_select_db ("bil_best");

    mysql_query("UPDATE BestTable SET OrderOther = '$OrderOther' WHERE ID = '$ID'");
    mysql_query("UPDATE BestTable SET SupStatus = '$SupStatus' WHERE ID = '$ID'");

    echo "Dra på trissor"

 ?>

就是这些了!

编辑:正如我在下面的帖子中提到的,我曾经成功运行过它。我使用了建议的方法:onClick='return updaterow();' 它实际上是有效的。尝试了三次。然后我更改了一些代码,它停止工作了。我已经恢复到旧的工作状态,但是,不幸的是,它不再工作了:P 我想我可能错过了 ' 或 " 或 ; 或其他什么的,但是到目前为止,我还没有找到缺失的链接。如果我找到了,我会回报的。但是,上述的方法似乎有效。

编辑2:好吧,让"防止表单正常发送"的方式工作了(谢谢你的帮助),但是Firebug告诉我ID没有定义。我觉得这很奇怪,因为我没有更改从其输入到数据库时的任何内容。但是请明确一点:我错过了什么吗?上面的代码应该实际定义了ID的值,对吧?特别是因为在以GET方式发送时,代码似乎没有问题地定义它。


1
你是否尝试过使用$.post()而不是$.ajax呢? - Paul Nikonowicz
糟糕,updaterowajax.php的代码没有显示出来。 - wecsam
4
您的代码容易受到SQL注入攻击 - Flukey
$.post() 只是 $.ajax() 的缩写,其中 type 被设置为 'POST'。没有任何区别。 - kapa
5个回答

3
问题的原因是您从提交按钮的单击事件中调用了updaterow()函数,因此表单会像平常一样被提交,同时也会进行AJAX提交。您需要将输入类型更改为button
在函数中添加return false;event.preventDefault()都行不通,因为它只会应用于按钮上的事件,而不是表单提交事件。
顺带一提,最好通过JavaScript或jQuery附加您的事件,而不是使用onclick HTML属性。

@MaxiWheat:我认为updaterow返回false并不会停止submit事件,因为这是在不同元素上的另一个事件。 - gen_Eric
@MaxiWheat 在这种情况下从函数返回 false 是行不通的,因为它是通过按钮调用的,而不是表单。 - Rory McCrossan
@RoryMcCrossan:实际上,从updaterow返回false;是有效的。 onclick返回false将停止提交按钮(提交表单)的默认操作。http://jsfiddle.net/sSW3T/ - gen_Eric
@MaxiWheat:我收回之前的话,你是对的。(附注:他必须将 onclick 改为 onClick='return updaterow();'。) - gen_Eric
2
只要在 onclick 属性中添加 return,似乎就可以正常工作。 - Rory McCrossan

0
这是因为表单无论如何都会提交(在您的ajax调用之后)。在最后一行中,请修改如下:
onClick='updaterow()'

转换为:

onsubmit='updaterow(); return false;'

1
很接近了,但是onsubmit只能在<form>标签上起作用,而不能在submit按钮上。 - gen_Eric

0
"<input type='submit' value='Spara' name='Submit".$row['ID']."' onClick='updaterow()' />"

这是您的问题。这是一个submit按钮,因此在运行单击处理程序后通常会提交表单。

您需要将其更改为<input type='button',或者阻止表单上的提交事件。

"<form id='".$row['ID']."' onsubmit='return false;'>"

我已将其更改为以下内容: <input type='button' value='Spara' name='Submit".$row['ID']."' onClick='updaterow();' />它会阻止表单被发送到当前页面。但由于某种原因,表单的内容未定义。请参见原帖中我的编辑说明。 - Johannes Ohlsson

0

表单正在提交以及 AJAX 请求。

为了阻止这种情况,将点击事件附加到提交按钮:

$("#submitButtonId").click(function(event) {
           // stop the form from submitting
           event.preventDefault();
           $.ajax({
                url: 'updaterowajax.php',
                type:'POST',
                data: 'ID=' + ID + '&SupStatus=' + SupStatus +'&$OrderOther=' + OrderOther,
                success: function(result)
                {
                    console.log(result);
                }
           });
});

或者将该元素移出表单以防止触发提交。 - Marcin

0

现在它似乎正在工作。我遵循了建议,只需在提交按钮上放置“return updaterow()”,它就非常好用!

这么简单的事情,但我还是花了很长时间才找到答案。非常感谢!我现在知道在将来应该去哪里问我的问题了!

编辑:Jay,它起作用了!大约尝试了三次。对表单进行了一些更改(我希望它能提交更多数据),然后一切都变得混乱了。所以我把它改回了之前的状态,但现在它又不起作用了...现在可能需要一把枪:P

我知道代码存在漏洞,但它只应该在本地使用,所以我还没有关注那部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接