Ajax 发送 GET 而不是 POST

Posted

技术标签:

【中文标题】Ajax 发送 GET 而不是 POST【英文标题】:Ajax send GET instead of POST 【发布时间】:2012-03-09 00:34:48 【问题描述】:

我几乎遵循了我可以接触到的所有指南和教程,但我就是看不出是什么导致了这个问题:

我使用以下代码:

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

将表单的内容发布到 php 页面。但由于某种原因,它似乎没有将其作为帖子发送。尤其是它不会将其发送到正确的页面。

我最终得到的是地址栏中的这个:

orderlist.php?ID=36&SupStatus=2&OrderOther=Ska+binda+Telia+Liten+18+m%E5n.&Submit36=Spara

这是我的 AJAX 脚本所在文件的名称。它似乎正在做的(对我来说)是它向当前页面发送 GET,而不是向“updaterowajax.php”发送 POST。

我在这里做错了吗? 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>";

还有更新rowajax.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();'它实际上正在工作。为三试。然后我更改了一些代码,它停止工作。我已经恢复到旧的工作状态,但是唉,不,它不再起作用了:PI 认为我错过了 ' 或 " 或 ; 或其他任何东西,但到目前为止我还没有找到丢失的链接.如果我找到了,我会报告。但是,上述方法似乎有效。

编辑 2:好吧,让“防止表单正常发送”开始工作(感谢您,这并不难),但萤火虫告诉我 ID 未定义。我觉得这很奇怪,因为我没有改变任何东西,从它确实可以输入到数据库中。但要明确一点:我错过了什么吗?上面的代码实际上应该定义了 ID 的值,对吧?尤其是当代码作为 GET 发送时,定义它似乎没有问题。

【问题讨论】:

你试过用$.post()代替$.ajax吗? 糟糕,updaterowajax.php 的代码没有显示出来。 您的代码容易受到SQL Injection的攻击 @PaulNikonowicz $.post() 只是 $.ajax() 的简写,type 设置为 'POST'。没有区别。 【参考方案1】:

问题是因为您通过单击提交按钮调用了updaterow() 函数,因此表单正在像通常那样提交以及 AJAX 提交。您需要将输入的类型更改为button

return false;event.preventDefault() 添加到您的函数将不起作用,因为它只会返回仅适用于按钮上的事件,而不适用于表单提交。

另一方面,最好通过 javascript 或 jQuery 附加您的事件,而不是使用 onclick html 属性。

【讨论】:

@MaxiWheat:我认为updaterow return false 不会停止submit 事件,因为这是不同元素上的不同事件。 @MaxiWheat 从函数返回 false 在这种情况下不起作用,因为它是通过按钮而不是表单调用的。 @RoryMcCrossan:实际上,来自updaterowreturn false; 确实有效。 onclick 返回 false 将停止提交按钮的默认操作(提交表单)。 jsfiddle.net/sSW3T @MaxiWheat:我收回这一点,你是对的。 (P.S. 他必须将onclick 更改为onClick='return updaterow();')。 只要在onclick 属性中添加'return',你是对的,它似乎可以工作【参考方案2】:

那是因为表单正在提交(在您的 ajax 调用之后) 在最后一行,改变这个:

onClick='updaterow()'

到这里:

onsubmit='updaterow(); return false;'

【讨论】:

关闭,但onsubmit 仅适用于&lt;form&gt; 标记,不适用于submit 按钮。【参考方案3】:
"<input type='submit' value='Spara' name='Submit".$row['ID']."' onClick='updaterow()' />"

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

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

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

【讨论】:

我把它改成了这样: 它阻止表单被发送到当前页面。但是由于某种原因,表单的内容没有定义。请参阅我在原始帖子中的编辑以获取解释。【参考方案4】:

正在提交表单以及 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);
                
           );
);

【讨论】:

或者,将元素移出表单以防止触发提交。【参考方案5】:

它实际上似乎现在正在工作。我按照建议简单地将“return updaterow()”放在提交按钮上,效果很好!

这么简单的事情,我仍然花了很长时间试图找到答案。非常感谢!我现在知道以后该去哪里提问了!

编辑:杰,它成功了!大约三试。对表单进行了一些更改(我希望它提交更多数据),这一切都变得混乱了。所以我把它改回了它工作的时候,但现在它又不能工作了……现在可以用枪了:P

而且我知道代码很容易受到攻击,但它应该只能在本地使用,所以我还没有在意这部分。

【讨论】:

以上是关于Ajax 发送 GET 而不是 POST的主要内容,如果未能解决你的问题,请参考以下文章

jquery中使用ajax发送post请求变成get请求

Ajax中get请求和post请求

Angularjs `$http` 发送 POST 而不是 GET

表单提交发送 POST 请求而不是 GET

Ajax中post与get的区别

为啥 HttpClient.PostAsync 似乎将请求作为 GET 而不是 POST 发送?