【问题标题】:Creating csv output with PHP from MySQL table using semicolon as delimiter使用分号作为分隔符从 MySQL 表中使用 PHP 创建 csv 输出
【发布时间】:2014-06-11 22:22:14
【问题描述】:

我遇到了用 php 和 mysql 创建 csv 输出的问题。问题是我无法根据页面上填充元素的数量显示不同的输出。

简介:我有几个文本区域,用户填写他们关于某事的文本或数字。用户对一个问题的回答在数据库中以分号分隔。

MySQL table: finish
Columns(fields): pt1, pt2, pt3

目标:我想生成 csv,它将在单独的列中显示用户的答案。如果用户只回答每个问题的 1 个文本区域,结果应该是这样的:

如果用户填写所有文本区域,例如使用从 1 到 8 的数字 - 我下面的代码在 csv 文件中给出如下结果:

问题:我可以做些什么来显示这样的结果:

我想知道我是否可以这样做,让它以某种方式在 excel 输出中添加额外的列,并使用分隔符 (;) 将答案的值与 mysql 表分开。

这是我的代码。

索引.PHP

<form action="process.php" method="post">
First point: <br>
    <textarea rows="1" cols="50" name="point11"></textarea><br>
    <textarea rows="1" cols="50" name="point12"></textarea><br>
    <textarea rows="1" cols="50" name="point13"></textarea><br>
    <textarea rows="1" cols="50" name="point14"></textarea><br><br>
Second point: <br>
    <textarea rows="1" cols="50" name="point21"></textarea><br>
    <textarea rows="1" cols="50" name="point22"></textarea><br>
    <textarea rows="1" cols="50" name="point23"></textarea><br><br>
Third point: <br>
    <textarea rows="1" cols="50" name="point31"></textarea><br>
<input type="submit">
</form>

PROCESS.PHP

<?php
for($j=1;$j<101;$j++) {
    $point[$j] = "";
}
for($i=1;$i<4;$i++) {
    for($k=1;$k<10;$k++) {
    if(isset($_POST['point'.$i.$k]) && !empty($_POST['point'.$i.$k])) {
        $point[$i] .= $_POST['point'.$i.$k].'; ';
    }}}
for ($i=1;$i<4;$i++) {
    $pt[] = "pt".$i;
}
$pt_list = implode(',', $pt);
for ($i=1;$i<4;$i++) {
    $point_ids[] = $point[$i];
}
$point_list = implode("','", $point_ids);
?> 
<?php
$host = 'localhost';
$user = 'root123';
$pass = '123';
$db   = 'exampledb';
$table = 'finish';

$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");

$result = mysql_query("INSERT into ".$table."({$pt_list}) VALUES ('{$point_list}')");

echo "The database has been updated";
?>

<form action="export.php" method="post"><input type="submit" value="Export as CSV"></form>

EXPORT.PHP

<?php
$host = 'localhost';
$user = 'root123';
$pass = '123';
$db = 'exampledb';
$table = 'finish';
$file = 'export_';

$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");

$result = mysql_query("SHOW COLUMNS FROM ".$table."");
if (mysql_num_rows($result) > 0) {
 while ($row = mysql_fetch_assoc($result)) {
  $csv_output .= $row['Field'].", ";
  $i++;
 }}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
 for ($j=0;$j<$i;$j++) {
  $csv_output .= $rowr[$j].", ";
 }
 $csv_output .= "\n";
}

$filename = $file."_".date("Y-m-d");
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
print $csv_output;
exit;
?>

【问题讨论】:

    标签: php mysql sql csv export-to-csv


    【解决方案1】:

    请将您的 export.php 文件的内容替换为以下代码,希望对您有所帮助

    <?php
    $host = 'localhost';
    $user = 'root123';
    $pass = '123';
    $db = 'exampledb';
    $table = 'finish';
    $file = 'export_';
    $i = 0;
    $link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
    mysql_select_db($db) or die("Can not connect.");
    $result = mysql_query("SHOW COLUMNS FROM ".$table."");
    $columnName = array();
    if (mysql_num_rows($result) > 0) 
    {
        while ($row = mysql_fetch_assoc($result)) 
        {
            $columnName[] = $row['Field'];
            $i++;
        }
    }
    $needle = ';';
    $values = mysql_query("SELECT * FROM ".$table."");
    while ($rowr = mysql_fetch_row($values)) 
    {
        for ($j=0;$j<$i;$j++) 
        {
            $colName = $columnName[$j];
            $count = strlen($rowr[$j]) - strlen(str_replace(str_split($needle), '', $rowr[$j]));
            if ($count > 1)
            {
                for($p=0;$p<$count;$p++)
                {
                    $colName .= ",";
                }
                $columnName[$j] = $colName;
                $csv_output_column_names .= $columnName[$j].", ";
                $csv_output_column_values .= str_replace(';',',',$rowr[$j]).", ";
            }
            else
            {
                $csv_output_column_names .= $columnName[$j].", ";
                $csv_output_column_values .= $rowr[$j] .", ";
            }
        }
    }
    $csv_output = $csv_output_column_names."\n".$csv_output_column_values;
    $filename = $file."_".date("Y-m-d");
    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: csv" . date("Y-m-d") . ".csv");
    header("Content-disposition: filename=".$filename.".csv");
    print $csv_output;
    exit;
    ?>
    

    【讨论】:

    • excel中columnNames下的行不是每一行都有吗?您是否遇到同样的问题...显然某处需要 \n 。顺便说一句,你的代码很有帮助,因为这可能是一个解决方案
    • 实际上,更大的问题是当数据库中有超过一行时,它会打印出多个列名。它应该是一个 columnNames (pt1,pt2,pt3) 并且在内容下方
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2016-03-13
    • 2015-09-24
    • 1970-01-01
    • 2021-12-30
    • 2012-12-22
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多