我在PHP和ajax文件中将GET方法更改为POST,但这里的逻辑错误是每次我将学生添加到数据库中都不起作用.我无法弄清楚这个问题,因为我是AJAX的新手.
这是我的代码:
<?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);
?>
获得专业证书
<?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);
?>
用于ajax的JavaScript它不能很好地工作
// 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;
并将该函数的RESULT(在本例中为未定义)分配给xmlHttp.onreadystatechange.
现在,当readystate更改时,XMLHttpRequest尝试调用现在未定义的onreadystatechange,因此不会发生任何事情.
试试这个:
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标头,并在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完成它的工作,那真的无关紧要).所以,只需在onreadystatechange赋值之前放置.open调用,你应该好好去.
2)onreadystatechange不仅仅被解雇了一次.它被多次激活,你需要能够处理它.这些是您需要处理的代码:
> 0 UNSENT – 尚未调用open()
> 1 OPENED – 尚未调用send()
> 2 HEADERS_RECEIVED – 已调用send(),并且标题和状态可用
> 3 LOADING下载 – responseText保存部分数据
> 4 RESPONSE准备就绪 – 操作完成
因此,您的错误检查应该在xmlHttp.readyState == 4检查中,如下所示:
if(xmlHttp.readyState==4){
if (xmlHttp.status==200){
// your code
}
}