通过php按钮将表导出为CSV

时间:2014-02-21 02:15:58

标签: php mysql csv

我是php的新手,我学到的一切都来自我的学校教科书和在线研究。有了这个说我试图完成一项任务,我被困在最后一部分。对于最后一部分,分配说明“创建一个PHP脚本,该脚本将employee表的内容转储到CSV文本文件中,每个记录都有逗号分隔值。每个新记录应该从一个新行开始”。我尝试了许多在线教程,但没有一个教授如何将此事件放在一个按钮中。我包含了我的代码,所以你可以看到我的混乱。这并不坏,但我相信我可以用更少的代码完成同样的任务。我刚刚开始,这是我现在能做的最好的事情。任何人都可以就如何做到这一点提出任何建议。我在第140行有我的按钮。我还使用了db_connect()函数,所以我不必多次写它。在我保存为csv之前,我可以使用它来读取数据库。

任何建议都将不胜感激。警告这需要遵循很多代码。

    <h2>Employee Search</h2>
    <form action="Draft.php" name="dbToCSV" method="GET">
        <input type="submit" name="dbToCSV" value="Export Database to CSV" <?php if     (isset($_GET['dbToCSV']))
                    {
                        //Do this code
                    }
                    else
                    {
                        echo "Error!";
                    } ?>><br />

    </form>
    <form action="Draft.php" method="GET">
        By name: <input type="text" name="searchName">
        <input type="submit" value="Search Name"><br />
    </form>
    <form action="Draft.php" method="GET">
        By language: <input type="text" name="searchLang">
        <input type="submit" value="Search Language"><br />
    </form>

4 个答案:

答案 0 :(得分:7)

2017年,mysqli现在比mysql更常见。所以这里是Josh Liptzin的一个mysqli版本的答案:

<?php

/* Attempt MySQL server connection. */  
$connection = mysqli_connect($database_server, $database_username, $database_password, $database_name);

// Check connection
if($connection === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$query = "SELECT * FROM Employee_data";
$result = mysqli_query($connection, $query);

$number_of_fields = mysqli_num_fields($result);
$headers = array();
for ($i = 0; $i < $number_of_fields; $i++) {
    $headers[] = mysqli_field_name($result , $i);
}
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp, $headers);
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}

function mysqli_field_name($result, $field_offset)
{
    $properties = mysqli_fetch_field_direct($result, $field_offset);
    return is_object($properties) ? $properties->name : null;
}

?>

答案 1 :(得分:5)

您确实试图将PHP代码放在HTML按钮中。该按钮可以只是到另一个页面的链接(如dump.php),其中包含一些PHP,如下所示:

链接:

<a href="dump.php" target="_blank">Download employee data</a>

dump.php:

<?php

$result = mysql_query('SELECT * FROM `employee_data`');
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++) {
    $headers[] = mysql_field_name($result , $i);
}
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export.csv"');
    header('Pragma: no-cache');
    header('Expires: 0');
    fputcsv($fp, $headers);
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
        fputcsv($fp, array_values($row));
    }
    die;
}

?>

代码来源:PHP code to convert a MySQL query to CSV

为了您自己,您不应该将上述代码复制并粘贴到您的作业中 - 您发布的代码与上面的代码之间存在差异,即分级程序会立即获取。

答案 2 :(得分:0)

所以课程结束了,我想我会告诉我如何解决我的问题。这对我来说最有意义,并没有采用多行代码。我确信甚至可能有更短的方法来做到这一点,但对于我是非常新的事情,我做了一个很好的代码。

我基本上创建了一个if语句,用于检查数据库中是否有任何记录,然后它会获取每个记录字段并在添加逗号时将其写入cdv文件。我做了两次代码。顶部代码写入数据库字段名称,后半部分写入这些字段中的值。谢谢大家的建议。我很高兴能够及时发现我的作业。

if (isset($_GET['dbToCSV']))
{
    // database connection
    db_connect();

    $query = mysql_query("SELECT * FROM employee_data") or die(mysql_error());
    $number_rows = mysql_num_rows($query);

    if ($number_rows >= 1)
    {
        $filename = "exported_db_" . date("m-d-Y_hia") . ".csv"; // filenme with date appended
        $fp = fopen($filename, "w"); // open file

        $row = mysql_fetch_assoc($query);

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

        foreach ($row as $name => $value)
        {
            $seperator .= $comma . $name; // write first value without a comma
            $comma = ","; // add comma in front of each following value
        }
        $seperator .= "\n";

        echo "Database has been exported to $filename";

        fputs($fp, $seperator);

        mysql_data_seek($query, 0); // use previous query leaving out first row

        while($row = mysql_fetch_assoc($query))
        {
            $seperator = "";
            $comma = "";

            foreach ($row as $name => $value)
            {
                $seperator .= $comma . $value; // write first value without a comma
                $comma = ","; // add comma in front of each following value 
            }

            $seperator .= "\n";

            fputs($fp, $seperator);
        } 

        fclose($fp);

    }
    else
        echo "There are no records in the database to export.";

    mysql_close();   
}

答案 3 :(得分:0)

以下是我正在使用的PHP脚本。

<?php

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}

$table_name = "employees";

$fp = fopen('php://output', 'w');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="'.$table_name.'.csv"');
header('Pragma: no-cache');
header('Expires: 0');

$result = mysql_query("SELECT * FROM $table_name");
if (!$result) die("Couldn't fetch records");
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++) {
    $headers[] = mysql_field_name($result , $i);
}

if ($fp && $result) {
    fputcsv($fp, $headers);
    while ($row = mysql_fetch_assoc($result)) {
        fputcsv($fp, $row);
    }
}

exit;
?>