1

我试图让一个脚本工作,其中选择某些选定的记录(取决于用户输入),然后导出到 CSV 文件。我已经尝试了各种方法来做到这一点;到目前为止,这是我能找到的最成功的(实际上来自我几年前做的一些代码),但它只会一遍又一遍地返回第一行,直到行用完(你可以看到我的锯末-传输方法我曾经告诉 PHP 不断获取行,直到结果用尽)。我的问题:可能有一种更简单的方法可以做到这一点——有什么想法吗?如果没有,我该怎么做才能让 MySQL 在下次运行循环时前进到下一行?我认为无论如何都应该使用 mysql_fetch_array 来做到这一点。

是的,我看过 fputcsv,但我似乎无法让任何数据通过。当我尝试使用 fputcsv 传递数组并通过 mysql_fetch_array、mysql_fetch_assoc 或 mysql_fetch_row 获取数组时,CSV 文件总是空白。

我一直在学习,这是我还没有学到一些东西以继续前进的那些时候之一。而且我知道的也不多。

我的代码,或者至少是必要的代码:

        $result = mysql_query("SELECT id FROM student_history WHERE username='$username'");
    $numrows = mysql_num_rows($result);
    if (!$result) {
        die("Query to show fields from table failed!:" .mysql_error());
    }
    $write = fopen("exportedmagic.csv", 'w') or die ("Can't create/open file to write! Drats!");
    fwrite($write, "ID, Username, Class, Status, Date, Time\n");
    while($numrows > 0) {
        $query = "SELECT id, username, class, status, date, time FROM student_history WHERE username='$username'";
        $result = mysql_query($query);
        $row = mysql_fetch_array($result);
        $id = $row['id'];
        $username = $row['username'];
        $class = $row['class'];
        $status = $row['status'];
        $date = $row['date'];
        $time = $row['time'];
        fwrite($write, $id .", " .$username .", " .$class .", " .$status .", " .$date .", " .$time ."\n");
        $numrows--;
    }
4

3 回答 3

0

您是否考虑过 MySQL 将查询结果转储到 CSV 输出文件的内置功能?

http://dev.mysql.com/doc/refman/5.5/en/select-into.html

它有几个注意事项,例如文件是写在数据库服务器上的。

但是谈到您的代码,我注意到您将 mysql_query()放在while 循环中,因此它在仅获取一行后有效地重新开始查询。我期待更多这样的事情:

$result = mysql_query(...);
while ($row = mysql_fetch_array($result)) {
  fputcsv($filehandle, $row);
}
于 2013-01-26T23:06:54.547 回答
0

尝试更改为-

if($numrows > 0) {
    $query = "SELECT id, username, class, status, date, time FROM student_history WHERE username='$username'";
    $result = mysql_query($query);
    while ($row = mysql_fetch_array($result){
        $id = $row['id'];
        $username = $row['username'];
        $class = $row['class'];
        $status = $row['status'];
        $date = $row['date'];
        $time = $row['time'];
        fwrite($write, $id .", " .$username .", " .$class .", " .$status .", " .$date .", " .$time ."\n");
    }
}

随着使用while($numrows > 0){$query= ... $numrows--;,您每次通过循环时都会重做查询。

此外,fwrite()您可以使用fputcsv()which 而不是使用 which 可以添加行,而无需遍历当前代码中的每个列值。

注意:您将需要查看更新到mysqli_*PDOmysql_*扩展折旧时更新。

于 2013-01-26T23:13:25.160 回答
0

mysql_已弃用。请使用http://php.net/manual/en/book.pdo.phphttp://php.net/manual/en/book.mysqli.php

这是 PHP PDO 示例:

$stmt = $this->db
    ->prepare("SELECT 1;", [\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false]);
$stmt->execute();

$fp = fopen('compress.zlib:///foo.csv.gz', 'wb9');

while ($e = $stmt->fetch(\PDO::FETCH_NUM)) {
    fputcsv($fp, $e);
}

fclose($fp);

如果您不想使用 gzip 压缩,则只需删除compress.zlib://前缀并替换wb9wb.

于 2013-07-07T00:21:25.367 回答