2015-12-08 127 views
2

我有这个PhP代码在用户点击一个按钮,它会自动下载一个.csv文件,它里面是不同种类的信息。所以这个.csv文件是逗号分隔的,所以只要有一个逗号,指针就会进入下一个单元格。但我想将分隔符更改为逗号以外的任何内容,因为我的某些数据具有逗号,例如“位置”列中包含501A和501B等数据,并且它需要位于单个单元格中。但是,它会转到另一个单元格,因此当我以纵向打印时,id不适合。所以我只是想问一下如何改变分隔符并用逗号来维护数据?谢谢!PhP导出.csv从逗号更改分隔符到其他人

<?php 
define("DB_HOST", "localhost"); 
define("DB_USER", "root"); 
define("DB_PASS", ""); 
define("DB_NAME", "envoy"); 
function db_connect() { 

    $db = mysqli_connect(DB_HOST, DB_USER, DB_PASS) or die("ERROR!"); 
    mysqli_select_db($db, DB_NAME); 

    return $db; 
} 

$db = db_connect(); 
date_default_timezone_set("EST5EDT"); 
$date = date('m-d-Y,h.i.sa'); 
$date2 = date('m/d/Y'); 
$filename = $date.'.csv'; 
//$fp = fopen($filename,"w"); 

$sql2 = "SELECT sku as Sku,name as 'Brochure Name',location as Location FROM brochureinfo where modified LIKE '$date2' ORDER BY name "; 
$rs2 = mysqli_query($db, $sql2); 
$total_records = mysqli_num_rows($rs2); 
mysqli_close($db); 

if($total_records>0){ 
$row = mysqli_fetch_assoc($rs2); 

$seperator = ""; 
$comma = ""; 

foreach ($row as $name => $value){ 
    $seperator.= $comma. ''.str_replace('','""',$name); 
    $comma=","; 

} 
$seperator .= "\n"; 

//echo $seperator; 




mysqli_data_seek($rs2,0); 

while ($row = mysqli_fetch_assoc($rs2)){ 


//$seperator = ""; 
$comma = ""; 

foreach ($row as $name => $value){ 

      $value = str_replace(array("\r" , "\n", "\r\n", "\n\r") ,'' , $value); 
      $value = str_replace('</b><br>','',$value); 
      $value = str_replace('<b>','',$value); 
      $value = str_replace('<br>','',$value); 
      $value = str_replace('<br />','',$value); 

    $seperator.= $comma. ''.str_replace('','""',$value); 
    $comma=","; 

    } 
$seperator .= "\n"; 
} 

header('Content-Type: text/csv'); 
header("Content-Disposition: attachment; filename=$date.csv"); 
header('Pragma: no-cache'); 

echo $seperator; 
} 
else{ 
    header('Content-Type: text/csv'); 
header("Content-Disposition: attachment; filename=$date.csv"); 
header('Pragma: no-cache'); 
echo "No record modified today";} 

回答

5

您可以CSV格式使用fputcsv()为下一代数据

int fputcsv (resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' [, string $escape_char = "\" ]]]) 

编辑:

你的代码将看起来somethiing这样的:

<?php 
define("DB_HOST", "localhost"); 
define("DB_USER", "root"); 
define("DB_PASS", ""); 
define("DB_NAME", "envoy"); 
function db_connect() { 

    $db = mysqli_connect(DB_HOST, DB_USER, DB_PASS) or die("ERROR!"); 
    mysqli_select_db($db, DB_NAME); 

    return $db; 
} 

$db = db_connect(); 
date_default_timezone_set("EST5EDT"); 
$date = date('m-d-Y,h.i.sa'); 
$date2 = date('m/d/Y'); 
$filename = $date.'.csv'; 
$fp = fopen($filename,"w"); 

$sql2 = "SELECT sku as Sku,name as 'Brochure Name',location as Location FROM brochureinfo where modified LIKE '$date2' ORDER BY name "; 
$rs2 = mysqli_query($db, $sql2); 
$total_records = mysqli_num_rows($rs2); 
mysqli_close($db); 

if ($total_records>0) { 
    $row = mysqli_fetch_assoc($rs2); 

    $delimiter = ';'; 
    $data = []; 
    foreach ($row as $name => $value){ 
     $data[] = $name; 
    } 
    fputcsv($fp, $data, $delimiter); 


    mysqli_data_seek($rs2,0); 

    while ($row = mysqli_fetch_assoc($rs2)){ 
     fputcsv($fp, $row, $delimiter); 
    } 

    fclose($fp); 

    header('Content-Type: text/csv'); 
    header("Content-Disposition: attachment; filename=$date.csv"); 
    header('Pragma: no-cache'); 

    echo $seperator; 
} 
else { 
    fclose($fp); 

    header('Content-Type: text/csv'); 
    header("Content-Disposition: attachment; filename=$date.csv"); 
    header('Pragma: no-cache'); 
    echo "No record modified today"; 
} 
+0

那么我会替换哪一个?对不起回合愚蠢的问题 – jeeeee

+0

好吧,编辑,见上面 – mnv

+0

谢谢,但我不能使用fopen();因为它会在我的.php文件的文件夹中生成一个文件。但我试图用fopen并删除$ seperator现在它不显示任何东西。 – jeeeee

0

使用PHP函数,fputcsv把每一行都作为arr ay(其中每个列的值将成为数组的一个项目),所以你不需要担心内部的逗号。由于您直接下载文件,因此请使用PHP输出作为文件句柄。请记住在输出开始之前设置标题。

$output = fopen('php://output', 'w'); 

// output the column headings/ values 
fputcsv($output, array('Column 1', 'Column 2', 'Column 3');