javascript - 如何使用 php 和 ajax 将 GET 方法更改为 POST 方法

标签 javascript php ajax

我在 php 和 ajax 文件中将 GET 方法更改为 POST,但这里的逻辑错误是每次我将学生添加到数据库时它都不起作用。我无法真正找出问题所在,因为我是 AJAX 新手。

这是我的代码:

用于添加的php文件

<?php
//I changed to POST
$q1=$_POST["q1"];
$q2=$_POST["q2"];
$q3=$_POST["q3"];

$con = mysql_connect('localhost', 'root', '');
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }

mysql_select_db("stud", $con);

$sql="INSERT INTO stud_info(IDno, LName, FName) VALUES ('$q1', '$q2', '$q3')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }


mysql_close($con);
?>

获取种群ID

<?php

$q=$_POST["q"]; //I changed to POST

$con = mysql_connect('localhost', 'root', '');
if (!$con)
 {
 die('Could not connect: ' . mysql_error());
 }

mysql_select_db("stud", $con);

$sql="SELECT * FROM stud_info WHERE IDno like '".$q."%'";

$result = mysql_query($sql);

echo "<table border='1'>
<tr>
<th>IDno</th>
<th>LName</th>
<th>FName</th>
</tr>";

while($row = mysql_fetch_array($result))
 {
 echo "<tr>";
 echo "<td>" . $row['IDno'] . "</td>";
 echo "<td>" . $row['LName'] . "</td>";
 echo "<td>" . $row['FName'] . "</td>"; 
 echo "</tr>";
 }
echo "</table>";

mysql_close($con);
?>

JavaScript for ajax 效果不是很好

// JavaScript Document
var xmlHttp;

function showStud(id)
{ 
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
        alert ("Browser does not support HTTP Request");
        return;
    }
    var url="getStud.php";
    url=url+"?q="+id;   
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("POST",url,true);
    xmlHttp.send(null);
}

function addStud(id, ln, fn)
{ 
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
        alert ("Browser does not support HTTP Request");
        return;
    }
    var url="addStud.php";
    url=url+"?q1="+id+"&q2="+ln+"&q3="+fn;  
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("POST",url,true);
    xmlHttp.send(null);
}

function editStud(id, ln, fn)
{ 
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
        alert ("Browser does not support HTTP Request");
        return;
    }
    var url="editStud.php";
    url=url+"?q1="+id+"&q2="+ln+"&q3="+fn;
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("POST",url,true);
    xmlHttp.send(null);
}

function deleteStud(id)
{ 
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
    {
        alert ("Browser does not support HTTP Request");
        return;
    }
    var url="deleteStud.php";
    url=url+"?q="+id;   
    xmlHttp.onreadystatechange=stateChanged;
    xmlHttp.open("POST",url,true);
    xmlHttp.send(null);
}

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    { 
        document.getElementById("txtHint").innerHTML=xmlHttp.responseText;
    } 
}

function GetXmlHttpObject()
{
    var xmlHttp=null;
    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch (e)
    {
        //Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

最佳答案

有几件事我想指出。首先,您在这里执行函数 stateChanged:

xmlHttp.onreadystatechange=stateChanged;

并将该函数的结果(在本例中为 undefined)分配给 xmlHttp.onreadystatechange

现在,当就绪状态改变时,XMLHttpRequest 会尝试调用 onreadystatechange,它现在是 undefined,所以什么都不会发生。

试试这个:

function stateChanged(){
    return function(){
        if(xmlHttp.readyState==4){
            if (xmlHttp.status==200){
                document.getElementById("txtHint").innerHTML=xmlHttp.responseText;
            }

        }
    }
}

现在,您仍然将函数的结果分配给 http.onreadystatechange,但这次它是一个可调用函数,而不是 undefined

其次,要像 HTML 表单一样 POST 数据,请使用 setRequestHeader() 添加 HTTP header ,并在 send() 中指定要发送的数据方法,像这样:

// Example of deleteStud(id) function
var url="deleteStud.php";
xmlHttp.open("POST",url,true);
xmlHttp.onreadystatechange=stateChanged();
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send("q="+id);

已编辑:

例如,您的 showStud 函数将是这样的,

function GetXmlHttpObject(){
    // your code
}

function stateChanged(){
    return function(){
        if(xmlHttp.readyState==4){
            if (xmlHttp.status==200){
                document.getElementById("txtHint").innerHTML=xmlHttp.responseText;
            }

        }
    }
}

function showStud(id)
{ 
    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null){
        alert ("Browser does not support HTTP Request");
        return;
    }
    var url="getStud.php";
    xmlHttp.open("POST",url,true);
    xmlHttp.onreadystatechange=stateChanged();
    xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlHttp.send("q="+id);
}

因此相应地更改您的其他功能。

重新编辑:

您还需要了解一些其他关键事项。

1)正确的调用顺序是:

  • 新的 XMLHttpRequest
  • xmlHttp.open()
  • xmlHttp.onreadystatechange = ...
  • xmlHttp.send()

在某些浏览器中,调用 .open 会清除其上的所有事件处理程序。这允许干净地重用相同的 xmlHttp 对象,这应该更节省内存(但如果您正确编码以让 GC 完成其工作,那真的无关紧要)。因此,只需将 .open 调用放在 onreadystatechange 赋值之前,您就可以开始了。

2) onreadystatechange 不只触发一次。它被触发了多次,你需要能够处理它。这些是您需要处理的代码:

  • 0 UNSENT - open() 尚未调用

  • 1 OPENED - send() 尚未被调用

  • 2 HEADERS_RECEIVED - 已调用 send(),并且 header 和状态可用

  • 3 LOADING 下载 - responseText 包含部分数据

  • 4 RESPONSE 就绪 - 操作完成

因此您的错误检查应该在 xmlHttp.readyState==4 检查中,如下所示:

if(xmlHttp.readyState==4){
    if (xmlHttp.status==200){
        // your code
    }

}

关于javascript - 如何使用 php 和 ajax 将 GET 方法更改为 POST 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870395/

相关文章:

php - 检测 Ajax 调用 URL

php - 获取mysql中列的总和

php - Symfony 爬虫 : how to check that a link to a particular page exists

php - 如何用 PHP 调试 prepare 语句?

php - 按预期打印数组中不同的值

javascript - JQUERY 在图像变化时创建滑动效果

javascript - jquery,将多个值附加到一个隐藏的输入

javascript - 简单的混淆循环和变量工作

ruby-on-rails - 显示记录计数 - Ruby on Rails - Ajax

javascript - PHP : How to get value from DB to already created textbox