为啥在使用 AJAX/PHP 时收到未定义索引错误?

Posted

技术标签:

【中文标题】为啥在使用 AJAX/PHP 时收到未定义索引错误?【英文标题】:Why am I receiving an Undefined Index error when using AJAX/PHP?为什么在使用 AJAX/PHP 时收到未定义索引错误? 【发布时间】:2016-11-07 18:55:24 【问题描述】:

我目前正在开发一个遥控应用程序,我正在尝试将操纵杆坐标从 javascript 发送到 php。但是,当我收到未定义索引错误时,我永远无法通过 PHP 文件访问数据。

我知道这个问题已经被解决了很多次,但是我在过去的一周里浏览了论坛和谷歌,我尝试过的解决方案都没有奏效,所以如果有人可以看看,我将不胜感激我的代码,看看我是否有一些基本的误解或特定于应用程序的问题。

编辑:我之前忘了提这个,但是我尝试了一些其他人在网上发布的示例 PHP/AJAX 代码,并且运行该代码也不起作用,这让我认为这可能是我的服务器的问题配置。

我的代码:(仅包括我认为与问题相关的文件;如果您想查看项目中的其他文件,请告诉我。) JavaScript 和 PHP 文件位于同一目录中。我正在使用 XAMPP。

joystick.js(包含 ajax 调用)

var hasGP = false;
var repGP;

// Joystick State Variables
var triggerPressed;
var x_value;
var y_value;
var z_value;
var t_value;

function canGame() 

    return "getGamepads" in navigator;


function reportOnGamepad() 

    // Display the gamepad's ID.
    var gp = navigator.getGamepads()[0];
    var html = "";
    html += "<u>ID</u>: " + gp.id + "<br>";

    // Display the status of the x-axis.
    x_value = gp.axes[0];
    html += "<u>x-axis</u>: " + x_value + "<br>";

    // Display the status of the y-axis.
    trigger_pressed = gp.buttons[0].pressed;
    y_value = gp.axes[1];
    if (trigger_pressed)
    
        html += "<u>Pitch angle</u>: " + y_value + "<br>";
    
    else
    
        html += "<u>y-axis</u>: " + y_value + "<br>";
    

    // Display the status of the z-axis.
    z_value = gp.axes[3];
    html += "<u>z-axis</u>: " + z_value + "<br>";

    // Display the status of the t-axis.
    t_value = gp.axes[2];
    html += "<u>Roll angle</u>: " + t_value + "<br>";

    $("#gamepadDisplay").html(html);

    $.ajax( url: 'ajax.php',
        type: 'POST',
        data: x:x_value,
        success: function(data) 
        
            console.log("x_value " + data + " has been sent to the  server.");
        
    );



$(document).ready(function() 

    if(canGame()) 
    
        var prompt = "To begin using your gamepad, connect it and press any button!";
        $("#gamepadPrompt").text(prompt);

        $(window).on("gamepadconnected", function() 
        
            hasGP = true;
            $("#gamepadPrompt").html("<b>The gamepad has been successfully connected.</b><br><br>");
            console.log("connection event");
            repGP = window.setInterval(reportOnGamepad,100);
        );

        $(window).on("gamepaddisconnected", function() 
        
            console.log("disconnection event");
            $("#gamepadPrompt").text(prompt);
            window.clearInterval(repGP);
        );

        // Set up an interval for Chrome
        var checkGP = window.setInterval(function() 
        
            console.log('checkGP');
            if(navigator.getGamepads()[0]) 
            
                if(!hasGP) $(window).trigger("gamepadconnected");
                window.clearInterval(checkGP);
            
        , 500);
    
);

ajax.php(Javascript 数据应该发送到的文件)

<?php
    $temp = $_POST['x'];
    if(isset($temp) && !empty($temp))
    
        echo "x value is ". $temp ."!"; // Success Message
    
?>

错误信息:

注意:未定义索引:第 2 行 C:\xampp\htdocs\TeachMoverInterface\ajax.php 中的 x

PHP $_POST 数组似乎为空。

可能有用的浏览器调试信息:

正如我所说,过去一周我一直在查看论坛,因此我尝试解决问题的一些操作是更改格式,更改 ajax 方法中的缓存和异步属性,替换 ajax用 $.post 调用或 XMLHttpRequest 调用,用 ajax 调用中的数字替换 JavaScript 变量,以及我忘记的其他一些方法。

【问题讨论】:

如果$_POST 数组为空,您如何获得屏幕截图中显示的消息(即“x 值为...”)? 如果你在var_dump() $_POST 变量的开头会发生什么?我想知道 0.00684... 是否被四舍五入为零,随后在您的 empty() 支票中为“假”。 发生该错误时对服务器的请求是什么样的?您正在显示一个成功的通话。 如果直接加载 ajax.php,$_POST 数组未设置,因此未定义。您必须像处理 AJAX 调用一样将变量发送到 ajax.php(通过 POST)。 @Gopika 这里要注意一点——如果你正在制作游戏,那么使用 AJAX 请求发送操纵杆位置将会非常滞后,因为 HTTP 请求通常会产生很大的开销。您可能应该考虑使用 Web 套接字建立单个套接字连接,然后将控制器位置实时传送到服务器。 【参考方案1】:

改变数据:x:x_value,变成数据:"x":x_value,

【讨论】:

我认为 x 在没有引号的情况下仍然可以正常工作(即使根据 ECMAScript 标准在技术上不正确),因为它不是保留字。 100% 一样【参考方案2】:
<?php
if(!empty($_POST))
    $temp = $_POST['x'];
    if(isset($temp) && !empty($temp))
    
        echo "x value is ". $temp ."!"; // Success Message
    

?>

修改你的 ajax.php 代码

【讨论】:

这可能会通过首先检查空数组来防止“未定义索引”错误,但它不能解释问题或为什么$_POST 数组为空。【参考方案3】:

正如一些人所指出的,我的谷歌浏览器控制台截图显示 ajax.php 文件正在接收 ajax 调用发送的数据。我的错误是我认为直接访问 ajax.php 文件应该输出数据,但是正如 Jay Blanchard 指出的那样,这是一种不正确的方法。感谢所有指出我错误的人。另外,感谢 Jeremy Harris 提到了 AJAX 的替代方案,它在时间性能方面可能更适合我的应用程序。

【讨论】:

以上是关于为啥在使用 AJAX/PHP 时收到未定义索引错误?的主要内容,如果未能解决你的问题,请参考以下文章

我创建了通知功能并收到此错误“未定义索引:用户”如何解决?

想要在 mysql 查询中求和时收到“未定义索引”通知[重复]

为啥我会收到此错误 - “您正在使用未定义的组件调用 withTheme(Component)。” -反应JS

我收到“未定义的引用”错误,我不明白为啥(C++ OO)

收到“未定义无参数构造函数”错误,不知道为啥

为啥我在 AngularJS 中收到错误“ReferenceError:未定义类别”?