使用PHP按钮生成CSV时,CSV文件中的内容会两次附加

时间:2015-04-20 07:03:31

标签: php mysql csv

这是我生成csv文件的代码。当我单击php按钮生成Csv文件时,该文件中填充了基于数据库中类别列的内容。但我的问题是,当内容在两次填充时csv文件如下所示。请帮助我修改代码的位置,以便我只能获得一次填充内容,如下所示。提前谢谢。

createcsv.php

<?php

$servername = "localhost";
$username = "user";
$password = "";
$dbname = "stats";

define("DB_SERVER", "localhost");
define("DB_NAME", "stats");
define("DB_USER", "user");
define("DB_PASSWORD", '');

$dbconn = @mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
$conn = @mysql_select_db(DB_NAME,$dbconn);


// Create connection
//$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    echo "DB connection failed";
} 

// Query DB to fetch hit count for each category and in turn create corresponding .csv file
function createCSVFile($type) {
    $msql = "SELECT TRIM(TRAILING '.000000' from UNIX_TIMESTAMP(hitdate)*1000) as unixdate,count from h_stats where category='".$type."' order by unixdate asc";

    $query = mysql_query($msql); 

    $type = str_replace(' ', '', $type);

    $tmp_file = "data/tmp_".$type.".csv";
    $fp = fopen("$tmp_file", "w");

    // Write the query contents to temp file
    while($row = mysql_fetch_array($query))
    {
      fputcsv($fp, $row);

    }
    fclose($fp);

    // Modify the contents of the file as per the high chart input data format
    $fp = fopen("$tmp_file", 'r+');
    rewind($fp);
    $file = "data/".$type.".csv";


    $final = fopen("$file", 'w');

    while($line = fgets($fp)){
        trim($line);
        $line = '['.$line.'],';
        fputs($final,$line);
    }

    // Append var $type and remove the trailing ,
    $final = file_get_contents($file);
    $content = 'var '.$type .'= [' . rtrim($final, ","). ']';
    file_put_contents("$file",$content); 

}

// Query DB to fetch success/failure count for Hits and in turn create corresponding .csv file
function createHitOutcomeCSVFile($type,$category) {
    $sql = "SELECT TRIM(TRAILING '.000000' from UNIX_TIMESTAMP(hitdate)*1000) as unixdate,".$type." from h_stats where category='".$category."' order by unixdate asc";

    $query = mysql_query($sql); 

    $tmp_file = "data/tmp_".$type."_".$category.".csv";
    $fp = fopen("$tmp_file", "w");

    // Write the query contents to temp file
    while($row = mysql_fetch_array($query)){
      fputcsv($fp, $row);
    }
    fclose($fp);

    // Modify the contents of the file as per the high chart input data format
    $fp = fopen("$tmp_file", 'r+');
    rewind($fp);

    $category = str_replace(' ', '', $category);

    $file = "data/".$type."_".$category.".csv";

    $final = fopen("$file", 'w');

    while($line = fgets($fp)){
        trim($line);
        $line = '['.$line.'],';
        fputs($final,$line);
    }

    // Append var $type and remove the trailing ,
    $final = file_get_contents($file);
    $content = 'var '.$type.'_'.$category.'= [' . rtrim($final, ","). ']';
    file_put_contents("$file",$content); 

}
    // Invoke function to create the Hits.csv file
    createCSVFile('Hits');

    // Invoke function to get Three Hits csv file
    createHitOutcomeCSVFile('TCount','Hits');

    // Invoke function to get O2 Hits csv file
    createHitOutcomeCSVFile('BCount','Login');

    echo "Generated successfully";

?>

不期望csv文件包含两次填充数据:

var Login_Hits= [[1427826600000,1427826600000,8763,8763
]]

按照高图格式预期的csv文件:

var Login_Hits= [[1427826600000,8763
]]

2 个答案:

答案 0 :(得分:1)

尝试调试它...
它会比看到拼写错误更容易...
看起来tmp文件已经损坏了...
尝试显示$row变量和$query ...
问题可能来自这里......

答案 1 :(得分:0)

在while循环中,我在两个函数中都使用了mysql_fetch_assoc而不是mysql_fetch_array

while($row = mysql_fetch_assoc($query))
    {
      fputcsv($fp, $row);

    }

内容在Csv文件中不会重复两次。这样可以尝试!