【问题标题】:Extract datas with ',' from database to csv file使用“,”从数据库中提取数据到 csv 文件
【发布时间】:2014-01-12 06:52:34
【问题描述】:

这是我从数据库中提取数据到 csv 文件的代码。它工作正常,但现在我把它放在数据有地址的程序中,因此有逗号(,),我在打印它时遇到问题。

看起来是这样的:

Name        Address1         Address2         City          Email
Name1       123 Mcarthur     San Juan City    12 Jones      Manila

应该是这样的:

Name        Address1                       Address2         City          Email     
Name1    123 Mcarthur, San Juan City   12 Jones, Manila     Manila      sample@yahoo.com

城市和电子邮件被推送到另一列。我搜索了互联网,但我看到的只是用逗号 (, ) 导入的数据。

另外,php 中的警告和错误消息也会导出到 csv 文件中。我没有那么大的问题,因为一旦我解决了这个问题,我认为不会有任何警告。

那么这是我的代码:

        if(isset($_POST['csvextract'])){
        $name = "sample";
        $file = $name.".csv";

            $con = mysql_connect("localhost", "root");
            if(!$con){
                 echo "Error connection";
                     }

             $select_db = mysql_select_db('outbound', $con);
             if(!$select_db){
                 echo "Error to select database";
                    }
            mysql_set_charset("utf8", $con);

             header("Content-type: text/csv; charset=UTF-8");
             header('Content-disposition: attachment; filename='.basename($file)); 

           $myquery = mysql_query("SELECT * FROM temp");

        //While loop to fetch the records
        $contents = "Name, Company, Address1, Address2, City, Province, Postal Code, Contact No, Email, Commodity, Type, Weight, Length, Width, Height, Decreased Value, Special Instruction, Shipping Reference, Payment Method, Package No, Tracking No\n";
        while($row = mysql_fetch_array($myquery))
        {
            $contents.=$row['0'].",";
            $contents.=$row['1'].",";
            $contents.=$row['2'].",";
            $contents.=$row['3'].",";
            $contents.=$row['4'].",";
            $contents.=$row['5'].",";
            $contents.=$row['6'].",";
            $contents.=$row['7'].",";
            $contents.=$row['8'].",";
            $contents.=$row['9'].",";
            $contents.=$row['10'].",";
            $contents.=$row['11'].",";
            $contents.=$row['12'].",";
            $contents.=$row['13'].",";
            $contents.=$row['14'].",";
            $contents.=$row['15'].",";
            $contents.=$row['16'].",";
            $contents.=$row['17'].",";
            $contents.=$row['18'].",";
            $contents.=$row['19'].",";
            $contents.=$row['20'].",";
            $contents.=$row['21']."\n"; 
        }

        $contents_final = chr(255).chr(254).mb_convert_encoding($contents, "UTF-16LE","UTF-8");
        print $contents_final;
        }

【问题讨论】:

  • 你为什么不使用fputcsv()?如果它包含分隔符,它将在值周围加上引号。
  • 我尝试使用 fputcsv 但我得到的只是一个空白页。
  • 您是否使用php://stdout 作为输出文件?还是常量STDOUT
  • 没有。这是我用来导出它的唯一代码。
  • 好吧,如果你想将 CSV 发送到浏览器,这就是你必须做的。如果您正在写入文件,那么您当然会得到一个空白页。

标签: php mysql csv export comma


【解决方案1】:

我不确定你是否已经在使用它。但我对你的代码做了一点改动。

代码如下:

if (isset($_POST['csvextract'])) {
$name = "sample";
$file = $name . ".csv";
$delimiter = ',';

$con = mysql_connect("localhost", "root");
if (!$con) {
    echo "Error connection";
    exit;
}

$select_db = mysql_select_db('outbound', $con);
if (!$select_db) {
    echo "Error to select database";
    exit;
}
mysql_set_charset("utf8", $con);

header("Content-type: text/csv; charset=UTF-8");
header('Content-disposition: attachment; filename=' . basename($file));

$myquery = mysql_query("SELECT * FROM temp");

//While loop to fetch the records
$contents = "Name, Company, Address1, Address2, City, Province, Postal Code, Contact No, Email, Commodity, Type, Weight, Length, Width, Height, Decreased Value, Special Instruction, Shipping Reference, Payment Method, Package No, Tracking No\n";
while ($row = mysql_fetch_array($myquery)) {

    for ($i = 0; $i < 22; $i++) {
        if (false === strpos($row[$i], $delimiter)) {
            $contents .= '"' . $row[$i] . '"';
        } else {
            $contents.=$row[$i];
        }
        if ($i === 21) {
            $contents .= "\n";
        } else {
            $contents .= $delimiter;
        }
    }
}

$contents_final = chr(255) . chr(254) . mb_convert_encoding($contents, "UTF-16LE", "UTF-8");
print $contents_final;
}

我改成关注了。

  1. 我在脚本顶部添加了一个分隔符变量。这样,您可以在分隔符之间轻松切换,所以如果它从 , 变为 ;您只需编辑 1 行即可。
  2. 我使用了 for 循环而不是所有行,因为每个表都只是一个数字。
  3. 添加检查以查看字符串中是否包含分隔符,如果是,请在其周围放置 qoutes
  4. 检查$i 是否为 21,因为那我们需要换行。
  5. 在没有db连接或无法选择数据库时添加退出

如果这不起作用,请告诉我,我会修复它。请注意,我自己没有尝试过此代码。

【讨论】:

  • 我已经让代码工作了。我会试试你的代码。我认为这比命名所有索引要容易得多。谢谢。 :D
【解决方案2】:

使用这个:

echo "Name, Company, Address1, Address2, City, Province, Postal Code, Contact No, Email, Commodity, Type, Weight, Length, Width, Height, Decreased Value, Special Instruction, Shipping Reference, Payment Method, Package No, Tracking No\n";
while ($row = mysql_fetch_row($myquery)) {
    fputcsv(STDOUT, $row);
}

【讨论】:

  • 我试过了,但是没有输出数据。我也试过这样做: $contents.=fputcsv(STDOUT, $row['0']).",";直到 $row['21'],仍然没有输出数据。
猜你喜欢
  • 2019-03-03
  • 2012-06-19
  • 2018-12-10
  • 2017-07-24
  • 2021-05-22
  • 2018-04-24
  • 1970-01-01
  • 2018-05-20
  • 2022-06-11
相关资源
最近更新 更多