当我使用file_put_contents

时间:2017-05-29 18:59:15

标签: javascript php arrays json ajax

主要问题在评论中得到了解决,虽然其中一个奖励问题仍未解决,其他解决方案可以使用一些改进

所有这些都发生在虚拟主机服务上,文件夹结构如下:

JavaScript和PHP文件位于/ public_html /中,JSON位于/ public_html / data /。

在我的JS代码中,我发送了一个POST请求,其中包含我的JSON文件的一些数据:

console.log(objdata.buildings[0].coords);
var params = JSON.stringify(objdata);
if (objdata.buildings[0].coords != " "){
    $.ajax({
        type: "POST",
        data: params,
        url: "writecoords.php",
        success: function(data){
                console.log(params);
                console.log(data);
                console.log("AJAX success");
        },
        error: function(){
                console.log("failed to send POST");
                alert("error");
        }
    });
}

PHP文件:

<?php

function debug_to_console($data){
    if(is_array($data) || is_object($data))
    {
        echo("\n".json_encode($data));
    } else {
        echo("\n".$data);
    }
}

$newJSON = json_decode(file_get_contents('php://input'));
debug_to_console($newJSON);

if (is_writable('data/strogi.json')) {
    $a = file_put_contents('data/strogi.json', $newJSON);
    if(! $a)
        debug_to_console("Wrote nothing");
    debug_to_console("PHP write success");
} else {
    debug_to_console("PHP write failed");
}
?>

正如您所看到的,我会在每个可能的位置执行检查以查看我是否实际处理非空数据 - 我记录了相关密钥的值,只有在发送时才会发送AJAX请求更改后,我记录发送的数据,并记录我的PHP文件接收和解码的数据。

我还检查文件是否可写以避免可能的权限问题,然后我才尝试写入该文件。该文件为空,我在控制台

中获得以下输出
  • params是我的JSON对象,作为一行;
  • 数据是:我的JSON对象作为一行,在每个新对象之前都有换行符,所有西里尔语都转换为\ u格式,&#34;没有写任何东西!&#34;,&#34; PHP写成功&#34 ;;
  • &#34; AJAX成功&#34;

如果我在此之后检查strogi.json文件,它绝对是空的。

为了排除传递JSON对象格式的问题,我尝试在与.php相同的目录中写入一个简单的test.txt文件,该文件也是空的。

我尝试使用here描述的方法,但没有任何改变。

我尝试使用FTP上传(该方法在评论here中的某处指出),我得到了#34;没有这样的文件或目录&#34;返回strogi.json和test.txt文件。我使用public_html/test.txttest.txt作为文件名。

我尝试使用锁FILE_APPEND |的组合LOCK_EX,两个文件都没有变化。

我的问题是:

  1. 为什么?
  2. 如果所有这些都发生在同一文件上调用的$ .getJSON()的.done()回调中,可以使用不同的解决方案吗?
  3. 后续问题值得单独一节:

    coords是一个三维数组

    [
    [[x1,y1],[x2,y2],...]]
    ]
    

    其中外部数组最多包含两个数组。第一个数组包含外部多边形的点和(如果存在)第二个数组包含用作切口的内部多边形的点。

    有问题的代码是尝试将strords数组提交给至少一个对象的strogi.json工作。

    一般来说,我想做的是

    • $。getJSON()data / strogi.json文件
    • 在.done()中遍历其中的buildings []对象数组 回调
    • 对于每个对象,检查&#34; coords&#34;是&#34; &#34; (默认值)

    如果是,则使用map API调用构造函数构建多边形,构造完成后,$ .ajax用于提交通过API函数之一提取的coords。

    截至目前,我提交了整个JSON对象,因为我只使用其中一个内部对象,但我想重新提交整个事物是多余的,提出了多个对象。

    1. 有没有办法将objdata.buildings [i] .coords与索引i一起传递给PHP来改变&#34; coords&#34;某些建筑物的JSON中的键值[i]对象?
    2. 我是否需要对我处理数据的方式进行任何更改以使我的JSON在进一步读取时有效?我认为我必须改变&#34; coords&#34;从[[[x1,y1],[x2,y2]]](现在的传递方式)到this之类的值(pastebin,因为即使我使用4空格缩进也没有代码格式) 为了它的工作,对吗?我该怎么做? 通过在JS中使用两个for()循环遍历数组并将toString()应用于每个坐标来解决部分问题,这样做会更好方式

0 个答案:

没有答案