Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON保存到文件通常会中断_Javascript_Php_Jquery_Ajax_Json - Fatal编程技术网

Javascript 将JSON保存到文件通常会中断

Javascript 将JSON保存到文件通常会中断,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我试图找到anwser,但可能我没有使用正确的术语来解决我的问题,因此我需要在这里询问: 我制作了一个webapp,可以从JSON文件加载更大的对象数组。如有必要,用户将更新数组的某些部分、删除对象或推送新数据。 因此,当用户决定使用JQUERY AJAX将数组保存回JSON文件时,在处理数据的PHP中,我使用了“w+”标记,因此我删除了内容并写回了所有新的和修改过的内容 问题是,即使JSON文件由单个用户使用,有时在将整个内容写入清除的文件之前,写入过程也会中断。这将导致重要的数据丢失 //我

我试图找到anwser,但可能我没有使用正确的术语来解决我的问题,因此我需要在这里询问:

我制作了一个webapp,可以从JSON文件加载更大的对象数组。如有必要,用户将更新数组的某些部分、删除对象或推送新数据。

因此,当用户决定使用JQUERY AJAX将数组保存回JSON文件时,在处理数据的PHP中,我使用了“w+”标记,因此我删除了内容并写回了所有新的和修改过的内容

问题是,即使JSON文件由单个用户使用,有时在将整个内容写入清除的文件之前,写入过程也会中断。这将导致重要的数据丢失

//我确实为备份文件节省了安全性,但这意味着每次保存中断时,我都必须将最后一个备份JSON文件复制到webapp加载数据的原始JSON文件上,直到我这样做之前,没有人可以使用我的webapp

这是我在.js文件中的JQUERY AJAX:

$.ajax
({
    url: 'json/save_json.php',
    type: 'POST',
    dataType : 'json',
    data: { pid: currentdate, data: JSON.stringify(allinfobj), userlevel: jslevel},
    complete: function(){alert("this worked out!")};

});
我的save_json.php:

<?php
$datecode = $_POST['pid'];
$myFile = "work".$datecode.".json";
$userData = $_POST['userlevel'];
if($userData != 4 && $userData != 3){
    $fh = fopen($myFile, 'w+') or die("Error while opening the file.");
    flock($fh, LOCK_EX);   // acquire an exclusive lock
    $stringData = $_POST['data'];
    fwrite($fh, $stringData);
    flock($fh, LOCK_UN);
    fclose($fh);
}
?>
但有时我不明白的是,我的结果是:

[{"name":"Apple","color":"red","quality";"awful"};{"name":"Tesla","color":"met
因此,下次用户无法加载此JSON数据时,因为它缺少内容,并且永远不是正确的数组或JSON

a
pr
a+
在PHP中,我认为这不是一个解决方案,因为我经常需要替换或删除数组中较旧的JSON对象,因此我无法通过附加到现有数据来摆脱,或者新数组可能比旧数组短

仅供参考:在我的ajax调用中,
success
error
标记不会起任何作用。我不知道为什么
complete
仍然有效,正如您所看到的,我在代码中使用了它


我希望我已经说得很清楚了,如果有人建议为什么写入JSON文件会中断,我将非常感激。我应该去哪里了解和解决这个问题<谢谢你

因为您只编写文件,所以只需要
w
而不是
w+

但我认为这不会解决这个问题

我认为您的服务器在您的
POST
GET
请求的大小上有限制

为了测试它,我建议您查看被破坏的
JSON
字符串的大小是否与您在
PHP
配置中设置的限制相同

请求的最大大小在
PHP.INI
max\u input\u vars
中设置

要测试PHP脚本中的数据是否正确,请尝试以下操作: 附加(在另一个文件中)您收到的JSON的大小。当它崩溃时,查看断开的JSON字符串的大小是否与您在另一个文件中写入的长度相同

此外,您还可以通过JS发送
JSON
字符串的客户端长度。然后,您可以将reiceve长度与您在reiceve字符串上计算的长度进行比较


这将有助于区分问题是客户端还是服务器端。

在将Post数据保存到文件之前,检查Post数据是否未被截断。 如果Json数据正在增长,请检查post_max_size。 保存文件时,请尝试将w+模式更改为c模式。w+可以截断文件

此链接也可以帮助您:


谢谢,我会尝试一下,但是新的JSON文件在中断发生后,非常短,很难相信这就是原因所在。同样,在用备份文件(大小大致相同)替换JSON文件后,即使它再获得10或20KB的新数据,它也会工作数天。向文件中写入任意代码非常容易。如果我发送一个pid,如
some_file.php\0
(其中
\0
是空字符),会发生什么情况然后作为
data
放入一些
PHP
code。您可能认为攻击者不知道文件名中的前缀
work
字符串。但是在
read_json.php
中可以通过做同样的事情并读取异常结果来猜测它。你完全正确。不过,我现在想重点讨论数据中断fenomenon,然后当然是提高安全性,但指出这种不安全性无疑是好的。它看起来像是将
w+/code>更改为
c
,然后使用
ftruncate($fh,0)
fflush($fh)获得独占锁
修复了该问题,因为在超过24小时的密集使用后,部分截断问题没有出现。目前,我将把这个标记为正确答案。我对所有答案都投了赞成票,因为它们或多或少都帮助我理解了这个问题。非常感谢。
[{"name":"Apple","color":"red","quality";"awful"};{"name":"Tesla","color":"met