0

我将数据导出到 CSV,而我使用"\r\n"它时只是在一行上输出数据,而不是在标题行下的自己的新行上输出每组数据,即:

name | address | phone | email | greg | 2 old street | 09236462942 | greg343@gmail.com | michael | 2 new street | 0927464623 | michael343@gmail.com | ...

代码如下:

JS

var file = "Database.csv";

allData=name+","+address+","+phone+","+email;
        allData=allData.replace(/[\\]/g,'');
        saving();

function saving(){
    $.ajax({
        type: 'POST',
        url: 'save.php',
        timeout: 5000,
        data: { data: allData, filename: file },
        error: function() {localStorage["allData"]=allData; wiadomosc("Internet conection error. But don't worry, your data will be stored when conection will be stable.");},
        success: function() {localStorage["allData"]="";}
    });
}

PHP

<?php
if(isset($_POST["filename"]) == true && isset($_POST["data"]) == true){
    $fp = fopen($_POST["filename"], "a+");

    if($fp !== null){
        fputs($fp, $_POST["data"] . "\r\n");
        fclose($fp);
    }
}
?>
4

1 回答 1

1

allData似乎是一个全局变量。根据您其余的代码,几乎任何事情都可能发生。您应该明确传递allDatasaving. 并在浏览器端(例如使用 Firebug)和服务器端(例如使用 Netbeans)进行调试。

而且这条线是纯粹的邪恶

$fp = fopen($_POST["filename"], "a+");

这样您就可以覆盖系统(服务器)上的几乎所有内容!

并且不要检查isset($_POST["filename"]) == true。要么做isset($_POST["filename"]) === true(在这种情况下不需要)要么只是做isset($_POST["filename"]).

编辑:

这应该可以避免 JS 中的一些问题:

var allData=name+","+address+","+phone+","+email;
        allData=allData.replace(/[\\]/g,'');
        saving(allData);

function saving(allData){
    $.ajax({...

这在 PHP 中:

function mk_safe_filename($name, $allow_subfolders=false)
{
    $f = trim($nazwa, './\\');
    if (!$allow_subfolders)
    {
        $f = strtr($f, array('\\'=>'__', '/'=>'__', '..'=>'_', ':'=>'_'));
    }
    else
    {
        $f = strtr($f, array('\\'=>'/', '..'=>'_', ':'=>'_'));
        $f = trim($f,'/');
    }
    return $f;
}
$file_name = mk_safe_filename($_POST["filename"]);

$fp = fopen($file_name, "a+");
于 2013-03-01T00:38:24.963 回答