xmlhttp 请求后未定义 $_POST
Undefined $_POST after xmlhttp request
我的代码向 php 文件发出 xmlhttp 请求,发送一个 ID,以便可以识别记录并将其从数据库中删除。但是,在执行删除查询时,我收到一条错误消息,指出 'comicID' 未定义(使用 POST 发送的 ID 值的变量)。我不确定如何确保它被正确定义。目前,我从错误处理中得到的错误是:"No comic supplied." 删除代码的 ISSET 部分时得到的错误是:"Error. Pages in comic not deleted." 目前,删除查询不起作用。
Javascript:
function delComic()
{
var radioButtons = $("#listID input:radio[name='comicList']");
var radioID = radioButtons.index(radioButtons.filter(':checked'));
console.log(radioID);
if (radioID < 0)
{
window.alert("You must select a comic before deleting.");
}
else
{
var xmlhttp = new XMLHttpRequest();
var url = "delCom.php?comicID="+radioID;
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var message = xmlhttp.responseText;
loadComic();
window.alert(message);
}
}
xmlhttp.open("POST", url, true);
xmlhttp.send();
}
}
PHP:
<?php
if (isset($_POST["comicID"]))
{
$comic = $_POST["comicID"];
$dir = 'comics/'.$comic.'/';
if (!file_exists($dir))
{
mkdir($dir, 0777, true);
}
include_once('includes/conn.inc.php');
mysqli_query($conn, "DELETE FROM serieslink WHERE comicID = '$comic'");
$query = ("DELETE FROM page WHERE comicID = '$comic'");
if (!$result = mysqli_query($conn, $query))
{
echo ("Query1 error: " . mysqli_error($conn));
exit;
}
else
{
if (mysqli_affected_rows($conn) > 0)
{
$dirHandle = opendir($dir);
while($file = readdir($dirHandle))
{
if(!is_dir($file))
{
unlink("$dir"."$file");
}
}
closedir($dirHandle);
rmdir($dir);
$query2 = ("DELETE FROM comic WHERE comicID = '$comic'");
if (!mysqli_query($conn, $query2))
{
echo ("Query2 error: " . mysqli_error($conn));
exit;
}
else
{
if (mysqli_affected_rows($conn) > 0)
{
echo ("The selected comic was successfully deleted.");
}
else
{
echo ("Error. Comic not deleted.");
}
}
}
else
{
echo "Error. Pages in comic not deleted.";
}
}
$conn->close();
}
else
{
$comic = null;
echo "No comic supplied";
}
?>
使用 POST 您的 Ajax 请求不同于使用 GET。查询字符串是 send()
函数的参数,而不是 url 的一部分,并且您省略了 ?
:
var xmlhttp = new XMLHttpRequest();
var url = "delCom.php";
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var message = xmlhttp.responseText;
loadComic();
window.alert(message);
}
}
xmlhttp.open("POST", url, true);
xmlhttp.send("comicID="+radioID);
编辑:
你也真的应该url对参数值进行编码,如果它们可以包含空格等。为了避免可能的浏览器缓存,你可以添加一个带有时间的参数:
var d = new Date();
xmlhttp.send("comicID="+encodeURIComponent(radioID)+"&ts="+d.getTime());
不需要在服务器端读取时间戳参数;它只是为了欺骗浏览器。
将前三行更改为,一切正常。
if (isset($_GET["comicID"]))
{
$comic = $_GET["comicID"];
其实是我自己无意中解决的。事实证明,错误是程序在尝试删除与漫画关联的所有页面时暂停。当它看到一个已经空的漫画时,它会尝试删除不存在的记录。手动将页面添加到漫画中,然后尝试彻底删除漫画,效果非常好。
所以基本上,我只需要对空漫画进行错误处理。
不过,感谢有关 POST 的指点。
我的代码向 php 文件发出 xmlhttp 请求,发送一个 ID,以便可以识别记录并将其从数据库中删除。但是,在执行删除查询时,我收到一条错误消息,指出 'comicID' 未定义(使用 POST 发送的 ID 值的变量)。我不确定如何确保它被正确定义。目前,我从错误处理中得到的错误是:"No comic supplied." 删除代码的 ISSET 部分时得到的错误是:"Error. Pages in comic not deleted." 目前,删除查询不起作用。
Javascript:
function delComic()
{
var radioButtons = $("#listID input:radio[name='comicList']");
var radioID = radioButtons.index(radioButtons.filter(':checked'));
console.log(radioID);
if (radioID < 0)
{
window.alert("You must select a comic before deleting.");
}
else
{
var xmlhttp = new XMLHttpRequest();
var url = "delCom.php?comicID="+radioID;
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var message = xmlhttp.responseText;
loadComic();
window.alert(message);
}
}
xmlhttp.open("POST", url, true);
xmlhttp.send();
}
}
PHP:
<?php
if (isset($_POST["comicID"]))
{
$comic = $_POST["comicID"];
$dir = 'comics/'.$comic.'/';
if (!file_exists($dir))
{
mkdir($dir, 0777, true);
}
include_once('includes/conn.inc.php');
mysqli_query($conn, "DELETE FROM serieslink WHERE comicID = '$comic'");
$query = ("DELETE FROM page WHERE comicID = '$comic'");
if (!$result = mysqli_query($conn, $query))
{
echo ("Query1 error: " . mysqli_error($conn));
exit;
}
else
{
if (mysqli_affected_rows($conn) > 0)
{
$dirHandle = opendir($dir);
while($file = readdir($dirHandle))
{
if(!is_dir($file))
{
unlink("$dir"."$file");
}
}
closedir($dirHandle);
rmdir($dir);
$query2 = ("DELETE FROM comic WHERE comicID = '$comic'");
if (!mysqli_query($conn, $query2))
{
echo ("Query2 error: " . mysqli_error($conn));
exit;
}
else
{
if (mysqli_affected_rows($conn) > 0)
{
echo ("The selected comic was successfully deleted.");
}
else
{
echo ("Error. Comic not deleted.");
}
}
}
else
{
echo "Error. Pages in comic not deleted.";
}
}
$conn->close();
}
else
{
$comic = null;
echo "No comic supplied";
}
?>
使用 POST 您的 Ajax 请求不同于使用 GET。查询字符串是 send()
函数的参数,而不是 url 的一部分,并且您省略了 ?
:
var xmlhttp = new XMLHttpRequest();
var url = "delCom.php";
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var message = xmlhttp.responseText;
loadComic();
window.alert(message);
}
}
xmlhttp.open("POST", url, true);
xmlhttp.send("comicID="+radioID);
编辑:
你也真的应该url对参数值进行编码,如果它们可以包含空格等。为了避免可能的浏览器缓存,你可以添加一个带有时间的参数:
var d = new Date();
xmlhttp.send("comicID="+encodeURIComponent(radioID)+"&ts="+d.getTime());
不需要在服务器端读取时间戳参数;它只是为了欺骗浏览器。
将前三行更改为,一切正常。
if (isset($_GET["comicID"]))
{
$comic = $_GET["comicID"];
其实是我自己无意中解决的。事实证明,错误是程序在尝试删除与漫画关联的所有页面时暂停。当它看到一个已经空的漫画时,它会尝试删除不存在的记录。手动将页面添加到漫画中,然后尝试彻底删除漫画,效果非常好。
所以基本上,我只需要对空漫画进行错误处理。 不过,感谢有关 POST 的指点。