douti0687 2014-01-05 04:04
浏览 57
已采纳

将JSON数组从Javascript传递给PHP并转换为csv

I am attempting to create a .csv file from a JSON array passed into a php file from JavaScript after submit event is detected in the page.

I am to the point where I can see the array coming back from the JavaScript as JSON... It is passing it to the php file, and then having the php file parse the object and output it into a .csv file

I've included the HTML, JavaScript, and php that I'm using to make it this far... Can I get pointed in the right direction?

The errors I get vary with the following:

When I attempt to inject my array manually:

http://localhost/~admin/dev/parse.php?submittedResults=[[%22uploads/featured/doublewm-3683.jpg%22,%22featured%22]]

[Sat Jan 04 22:12:29 2014] [error] [client ::1] PHP Warning:  file_get_contents($path): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 62
[Sat Jan 04 22:12:29 2014] [error] [client ::1] PHP Warning:  fopen(clients/downloads/csv/[["uploads/featured/doublewm-3683.jpg","featured"]].csv): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 65
[Sat Jan 04 22:12:29 2014] [error] [client ::1] PHP Warning:  Invalid argument supplied for foreach() in /Users/Admin/Sites/dev/parse.php on line 66
[Sat Jan 04 22:12:29 2014] [error] [client ::1] PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /Users/Admin/Sites/dev/parse.php on line 69

When I attempt to let JavaScript to do the array passing:

[Sat Jan 04 22:15:36 2014] [error] [client ::1] PHP Notice:  Array to string conversion in /Users/Admin/Sites/dev/parse.php on line 57, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:15:36 2014] [error] [client ::1] PHP Warning:  file_get_contents($path): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 62, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:15:36 2014] [error] [client ::1] PHP Warning:  fopen(clients/downloads/csv/Array.csv): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 65, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:15:36 2014] [error] [client ::1] PHP Warning:  Invalid argument supplied for foreach() in /Users/Admin/Sites/dev/parse.php on line 66, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:15:36 2014] [error] [client ::1] PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /Users/Admin/Sites/dev/parse.php on line 69, referer: http://localhost/~Admin/dev/index.htm

HTML:

<form onsubmit"">
      <div class="imageTile">
        <a class="fancybox" rel="rel" href="uploads/featured/doublewm-4097.jpg"><img src="uploads/featured/doublewm-4097.jpg" style="max-width: 120px; max-height: 110px;"></a><br>
        <input class="data" type="hidden" name="imageFilename" value="uploads/featured/doublewm-4097.jpg">
        <input class="data" type="hidden" name="imageGalleryID" value="featured">
        <label for="uploads/featured/doublewm-4097.jpg">Keep<input class="checkbox" type="checkbox"></label>
    </div>
    <div class="imageTile">
        <a class="fancybox" rel="rel" href="uploads/featured/moon-5469.jpg"><img src="uploads/featured/moon-5469.jpg" style="max-width: 120px; max-height: 110px;"></a><br>
        <input class="data" type="hidden" name="imageFilename" value="uploads/featured/moon-5469.jpg">
        <input class="data" type="hidden" name="imageGalleryID" value="featured">
        <label for="uploads/featured/moon-5469.jpg">Keep<input class="checkbox" type="checkbox"></label>
    </div>
    <div id="submit_buttons">
        <button type="reset">Reset</button>
        <input class="submit" type="submit" onclick="return false" value="Submit">
    </div>
</form>

JAVASCRIPT:

$('.submit').click(function(event) {
    event.preventDefault();
    var imageTile = this.parentElement.parentElement.getElementsByClassName('imageTile');
    var l = imageTile.length;
    var data = [];
    for (var i = 0; i < l; i++) {
        if (imageTile[i].getElementsByClassName('checkbox')[0].checked) {
            var dat = imageTile[i].getElementsByClassName('data');
            console.log(dat);
            var ll = dat.length;
            var datArr = [];
            for (var j = 0; j < ll; j++) {
                datArr.push(dat[j].attributes['value'].value);
            }
            data.push(datArr);
        }
    }
    // Now 'data' is the array

    // dataString is a JSON representation of the array to send to the server
    var dataString = JSON.stringify(data);

    // Test
    console.log(data);
    console.log(dataString);

    $.ajax({
        url: 'parse.php?submittedResults' + dataString,
        type: 'GET',
        dataType: "json",
        async: false
    }).done(function(data) {

    })
});

PHP:

if (isset($_GET['submittedResults'])) {
    if (empty($_GET['submittedResults'])) {
        die('Give me something to work with!!');
    }
    $resultSet = (string) $_GET['submittedResults'];
    $path = $resultSet;
    if (strpos($path, '../') !== false || strpos($path, "..\\") !== false || strpos($path, '/..') !== false || strpos($path, '\..') !== false) {
        http_response_code(403);
    } else {
        $getFile = file_get_contents('$path');
        $json_obj = json_decode($getFile);
        echo "$json_obj";
        $fp = fopen("clients/downloads/csv/$path.csv", 'w');
        foreach ($json_obj as $row) {
            fputcsv($fp, $row);
        }
        fclose($fp);
    }
}

JSON:

[["uploads/featured/doublewm-4097.jpg","featured"],["uploads/featured/moon-5469.jpg","featured"]] 

So I did notice I was missing the '=' sign... I redid the ajax call to match what you suggested, the behavior is the same. I also included the echo as requested below here are the results:

The requested echo:

 var_dump($_GET['submittedResults'])

string(101) "[["uploads/featured/doublewm-3683.jpg","featured"],["uploads/featured/doublewm-3935.jpg","featured"]]"

The current Logs:

[Sat Jan 04 22:27:43 2014] [error] [client ::1] PHP Warning:  file_get_contents($path): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 63, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:27:43 2014] [error] [client ::1] PHP Warning:  fopen(clients/downloads/csv/[[&quot;uploads/featured/doublewm-3683.jpg&quot;,&quot;featured&quot;],[&quot;uploads/featured/doublewm-3935.jpg&quot;,&quot;featured&quot;]].csv): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 66, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:27:43 2014] [error] [client ::1] PHP Warning:  Invalid argument supplied for foreach() in /Users/Admin/Sites/dev/parse.php on line 67, referer: http://localhost/~Admin/dev/index.htm
[Sat Jan 04 22:27:43 2014] [error] [client ::1] PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /Users/Admin/Sites/dev/parse.php on line 70, referer: http://localhost/~Admin/dev/index.htm

Current JavaScript:

$.ajax({
    url: 'parse.php',
    data: { submittedResults: JSON.stringify(data) },
    type: 'GET',
    dataType: "json",
    async: false
}).
  • 写回答

1条回答 默认 最新

  • douxu2467 2014-01-05 04:31
    关注

    PHP Warning: file_get_contents($path): failed to open stream: No such file or directory in /Users/Admin/Sites/dev/parse.php on line 62

    $resultSet = (string) $_GET['submittedResults'];
    $path = $resultSet;
    

    this is causing you a problem because $path is equal to the json data. Which is wrong, path should be a filename. Try like this :

    //$resultSet =(string) $_GET['submittedResults'];
    $resultSet = '[["uploads/featured/doublewm-4097.jpg","featured"],
               ["uploads/featured/moon-5469.jpg","featured"]]';
    $path = "myfile.csv"; //or clients/downloads/csv/myfile.csv
    if (strpos($path, '../') !== false || strpos($path, "..\\") !== false 
      || strpos($path, '/..') !== false || strpos($path, '\..') !== false) {
        http_response_code(403);
    } else {
        $json_obj = json_decode($resultSet);
        echo "$json_obj";
        $fp = fopen($path, 'w');
        foreach ($json_obj as $row) {
            fputcsv($fp, $row);
        }
        fclose($fp);
    }
    

    myfile.csv :

    uploads/featured/doublewm-4097.jpg,featured
    uploads/featured/moon-5469.jpg,featured
    

    EDIT: Give a unique filename

    $json_obj = json_decode($resultSet);
    $path = $json_obj[0][1].".csv";
    

    output

    featured.csv

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题