PHP脚本未接收到jQuery的POST请求

3
首先,我对jQuery和PHP都不太熟悉,所以如果这是一个愚蠢的问题而我在互联网上搜索后仍然无法弄清楚哪里出了问题,我很抱歉。此外,如果您看到其他错误/混乱的代码等,请告诉我:)。
我正在尝试创建一个画廊,其中有一个上一个和下一个按钮。当单击“上一个”时,通过jquery更改img标记的src属性以显示上一个图像,并通过单击“下一个”来更改为下一个图像。但是,当单击上一个按钮且当前图像是第一个图像时,我希望它返回到最后一个图像。由于我有几个具有不同总图片数量的这些库,我需要动态执行此操作。现在,我的当前方法大致如下:
1.从单击的按钮向我的图像切换函数发送方向参数(“backward”或“forward”) 2.提取图像源文件路径并将其发布到外部PHP脚本,然后计算该目录中的文件数。 3.检查方向参数是否向前。如果是,则将当前图像文件名末尾的数字加1。否则,减去1(导致不存在的文件名)。将此新文件名分配给nextImage变量。 4.检查nextImage是否存在。如果是,则将其分配为img src属性的值。如果没有,则从外部PHP脚本获取文件计数,将其作为文件编号实现到nextImage中,然后将其分配给src属性。
大部分都可以正常工作。但是,在单击第一个图像上的“上一个”时获取最后一个图像似乎不起作用。我进行了一些调试,并将其缩小到似乎停止工作的点。Firebug告诉我jQuery POST函数起作用(我也得到了成功的警报)并且它将我想要的数据发布到PHP文件中。但是,在PHP脚本内部,从未进入 if(isset($ _POST [“id1”]))分支。即使我基本上从此网站上接受的答案中复制和粘贴了整个脚本,它仍然直接进入else分支。
以下是jQuery代码:
var nextImageLength = " ";
var nextImage = " ";
var imageString = " ";
var nextImageStr = " ";
var nextImageNmb = 0;

var countImageLength = function($countimagelength) {
    nextImageLength = nextImageStr.length;
    if (nextImageLength < 3) {
        if (nextImageLength < 2) {
            nextImage = imageString + '00' + nextImageStr + '.jpg';
        }
        else {
            nextImage = imageString + '0' + nextImageStr + '.jpg';
        }
    }
    else {
        nextImage = imageString + nextImageStr + '.jpg';
    }
}

function multiPageToggle(direction) {
    var currentImage = $(".viewport_img_high").attr("src");
    imageString = currentImage.slice( 0, 35 );
    $.ajax(
            {
            type: "POST",
                url: "countImages.php",

                data: { id1: imageString},
                success: function (count) {
                    //alert('success');

            }
    });     
    var currentImageNmb = currentImage.slice(-7, -4);
    if (direction == "forward") {
        nextImageNmb = (parseInt(currentImageNmb)) + 1;
    }
    else {
        nextImageNmb = (parseInt(currentImageNmb)) - 1;
    }
    nextImageStr = nextImageNmb.toString();
    countImageLength();
    $.get(nextImage)
            .done(function() { 
                $(".viewport_img_high").attr("src", nextImage);
         }).fail(function() { 
                 if (nextImageNmb < 1) {
                $.get('countImages.php', function(count) {
                    nextImageStr = count;
                });
                countImageLength();
                $(".viewport_img_high").attr("src", nextImage);
            }
            else {
                nextImageStr = "1";
                countImageLength();
                $(".viewport_img_high").attr("src", nextImage);
            }
         });
}   

这是我的PHP脚本:

<?php
if (isset($_POST["id1"])) 
{
  $imgStr = $id1;
} 
else 
{
  $imgStr = "1";
  echo "Oops. Something went really wrong here.";
}
$imagePath = "c:/xampp/htdocs/portfolio/images2/" + $imgStr + "/";
$count = iterator_count(new DirectoryIterator($imagePath));
echo $count;
?>

编辑:我将在下面添加一些Firebug数据。也许这可以帮助理解。

响应头:

Connection  Keep-Alive
Content-Length  77
Content-Type    text/html
Date    Tue, 15 Jul 2014 04:26:24 GMT
Keep-Alive  timeout=5, max=100
Server  Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9
X-Powered-By    PHP/5.5.9

请求头:

Accept  */*
Accept-Encoding gzip, deflate
Accept-Language de,en-US;q=0.7,en;q=0.3
Cache-Control   no-cache
Connection  keep-alive
Content-Length  43
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost
Pragma  no-cache
Referer http://localhost/portfolio/index_b.php
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
X-Requested-With    XMLHttpRequest

响应:

array(1) {
  ["id1"]=>
  string(35) "images2/des004_large_/des004_large_"
}
0

在你的PHP脚本中,你使用了$id1但从未设置它。你是不是想要写成$imgStr = $_POST["id1"]; - Barmar
4个回答

3

这一行代码:

$imgStr = $id1;

应该是:

$imgStr = $_POST['id1'];

谢谢!我在这里看到了两个被接受的答案,我都尝试了,但都没有起作用,所以它不是我的主要问题的解决方案。问题是它甚至从来没有达到那个点。它不进入正面的if分支(我尝试从那里回显消息,但我从未得到它们,但我总是从else分支得到错误消息)。但还是谢谢,我会改变它 :)。 - FrozenHarlequin

1
使用vardump($_POST)检查数组中的所有值。如果只有一个空数组,那么您的页面没有发布任何内容,否则它将输出您的帖子的所有内容。然后开始围绕它工作:检查所有存在的索引并在您的代码中替换它们;)

我刚试着了解vardump,但仍有些困惑,所以希望我做得正确。我在if语句之前插入了"$a = var_dump($_POST); echo $a;"(一开始尝试使用($_POST["id1]),但那只给了我一个错误),它回显array(0){}。 - FrozenHarlequin
不,你只需要写 var_dump($_POST),不需要将其赋值给变量,因为它已经单独打印到输出中了。 - g.carvalho97
啊,谢谢 :). 我仍然得到相同的数组输出(0){}。这意味着PHP脚本没有从我的jQuery函数接收数据,对吗? - FrozenHarlequin
是的,如果它是一个空数组,它就不会进行POST。此外,我强烈建议使用$.post进行POST或者使用$.get进行GET请求,而不是使用$.ajax - g.carvalho97
我刚刚再次检查了Firebug。它显示我的POST函数的响应如下: array(1) { ["id1"]=> string(35) "images2/des004_large_/des004_large_" } 0所以在我看来,它似乎已经发布了(而且它发布的数据正是我想要发布的数据)。只是PHP脚本没有识别/接收到它。我一定会查看$.post和$.get命令。谢谢 :)! - FrozenHarlequin
显示剩余5条评论

0

我来晚了,但最近我也遇到了同样的问题,却找不到任何帮助。

简单的答案是,如果PHP无法识别表单,它就不会填充$_POST,但输入仍然可用。

当我通过JavaScript提交(在我的情况下是JSON数据),我可以通过以下方式从PHP获取它:

$postbody = file_get_contents("php://input");

请注意,这不等同于一个已处理的帖子,因此您可能需要在此上花费大量时间。
有关流包装器的更多信息,请参见此处:[PHP输入的PHP手册][http://php.net/manual/en/wrappers.php]。

0

好的,所以我仍然不知道出了什么问题,但我简单地从头开始重写了我的jQuery脚本的POST/GET部分,以及PHP脚本,现在它可以工作了。如果有人在将来再次遇到类似的问题,这是我的新代码。我用以下代码替换了POST-$.ajax函数(同时还更改了其余jQuery中的一些变量,不要让这使你感到困惑):

$.post( "test3.php", {a: imageStringSlice}, function(data) {
            //alert(data);
    count = data - 2;
});

使用$.get方法:

nextImageStr = count.toString();
countImageLength();
$(".viewport_img_high").attr("src", nextImage);

还有这个 PHP 脚本:

<?php
if( $_REQUEST["a"] )
{
    $imgstr = $_REQUEST['a'];
    settype($imgstr, "string");
    $count = iterator_count(new DirectoryIterator($imgstr));
    echo $count;
}
else {
    echo "1";
}
?>

感谢Barmar和尤其是gcarvalho97的帮助 :)!


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