为啥在使用 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 查询中求和时收到“未定义索引”通知[重复]