PHP 未检测到来自 JavaScript 请求的 POST JSON 数据

Posted

技术标签:

【中文标题】PHP 未检测到来自 JavaScript 请求的 POST JSON 数据【英文标题】:PHP not detecting POST JSON data from JavaScript request 【发布时间】:2019-09-04 19:15:54 【问题描述】:

我需要一些对我的应用程序至关重要的代码的帮助。我正在制作一个小型点击游戏,我希望用户能够通过 php 将数据保存和加载到我的服务器。我不想使用本地存储让任何人更难编辑他们的经济和“作弊”。当用户单击我拥有的保存按钮时,它会触发我的 vue 方法来初始化保存。我将数据转换为 JSON 格式没有问题,但是我无法让 PHP 通过 POST 读取这些数据。我检查了网络标头,它显示正在发送的东西,似乎 PHP 只是没有捕捉到它。我将在下面包含 JS 部分和 PHP 部分的代码。只有当 array_key_exists 现在存在时,PHP 才会设置为回显,因为在解决了这个问题后,我将能够轻松处理其余部分。任何帮助将不胜感激!

我已经尝试过这个,到目前为止还没有工作Send JSON data from javascript to PHP?

JS

saloOut: function() 
            var saveData = 
                saveMoney: this.money,
                saveCrystals: this.crystals,
            ;
            saveData = "saveData=" + (JSON.stringify(saveData));
            var sendData = new XMLHttpRequest();
            sendData.open("POST", "salo.php", true);
            sendData.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            sendData.send(saveData);
            console.log(saveData);
        

PHP

<?php
    if (array_key_exists("saveData", $_POST)) 
        echo "<p>SALO Ready!</p>";
    
?>

【问题讨论】:

您在检查员网络选项卡中看到请求?如果是,请点击它,如果是 POST,请检查“请求方法”,然后转到 Request Payload 并查看参数是否存在 如果您发现任何错误,请分享服务器日志。 @RăducanuIonuţ 我检查了请求方法是 POST,但是我没有看到请求有效负载。它有一个表单数据区域,它确实显示了我发送的内容 @Naina 服务器日志尽可能干净(无错误) 【参考方案1】:

在访问值之前在 PHP 端解码 JSON 字符串,如下所示:

<?php
    if(isset($_POST['saveData']))
        $result = json_decode($_POST['saveData'], true);
        // use $result['saveMoney'] and $result['saveCrystals'] accordingly
    
?>

更新#1:

正如 OP 在下面评论的那样,I expect that it will print "SALO Ready" but it is instead doing nothing

那是因为您没有使用XMLHttpRequest 对象的responseText 属性来查看从服务器接收到的文本。使用下面的 sn-p 查看响应文本。

saloOut: function() 
    var saveData = 
        saveMoney: this.money,
        saveCrystals: this.crystals,
    ;
    saveData = "saveData=" + (JSON.stringify(saveData));
    var sendData = new XMLHttpRequest();
    sendData.open("POST", "salo.php", true);
    sendData.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    sendData.send(saveData);

    sendData.onreadystatechange = function() 
        if (this.readyState == 4 && this.status == 200) 
            alert(this.responseText);
        
    ;

参考:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText

【讨论】:

我还没有尝试访问这些值,现在我只是在检查 POST 数据是否存在,就像提交普通表单一样。我的问题在于我的 PHP 的行为方式,数据根本不存在 @Elderis 你的意思是什么我的问题是我的PHP是如何行动的,数据根本不存在?到底什么不适合你?请说明您的预期实际输出。 在 Chrome 的我的网络选项卡上,它显示了通过 POST 发送到 PHP 文件的数据,并显示它有数据。但是当我在我的 PHP 中测试 POST 数据时,什么也没有发生。我正在测试它,就像我测试表单中的 POST 数据一样 我希望它会打印“SALO Ready!”但它什么都不做 @Elderis 我已经更新了我的答案,请参阅我的答案的 Update# 1: 部分。

以上是关于PHP 未检测到来自 JavaScript 请求的 POST JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中检测获取请求

cppcheck 未检测到来自 epoll_create 的资源泄漏

在 webview 中启用 Javascript 时,Android Webview 未检测到链接点击

即使未检测到,如何在php中删除空格[重复]

检测 Android 和 iOS Webviews

使用 SonarLint 插件和 SonarQube 服务器未检测到 HTTP 请求重定向漏洞