Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中将MySQL数据导出为CSV时自动前进到下一行?_Php_Mysql_Csv_Export - Fatal编程技术网

在PHP中将MySQL数据导出为CSV时自动前进到下一行?

在PHP中将MySQL数据导出为CSV时自动前进到下一行?,php,mysql,csv,export,Php,Mysql,Csv,Export,我试图让一个脚本工作,其中某些选定的记录(取决于用户输入)被选中,然后导出到CSV文件。我尝试过各种方法来做到这一点;到目前为止,这是我能找到的最成功的方法(实际上是从我几年前编写的一些代码中),但它只会一次又一次地返回第一行,直到行用完为止(您可以在我用来告诉PHP继续获取行直到结果用尽的传输方法中看到我的锯末)。我的问题是:也许有一种更简单的方法可以做到这一点——有什么想法吗?如果没有,我该怎么做才能让MySQL在下次运行循环时前进到下一行?我认为mysql_fetch_数组应该可以做到这一

我试图让一个脚本工作,其中某些选定的记录(取决于用户输入)被选中,然后导出到CSV文件。我尝试过各种方法来做到这一点;到目前为止,这是我能找到的最成功的方法(实际上是从我几年前编写的一些代码中),但它只会一次又一次地返回第一行,直到行用完为止(您可以在我用来告诉PHP继续获取行直到结果用尽的传输方法中看到我的锯末)。我的问题是:也许有一种更简单的方法可以做到这一点——有什么想法吗?如果没有,我该怎么做才能让MySQL在下次运行循环时前进到下一行?我认为mysql_fetch_数组应该可以做到这一点

是的,我看过fputcsv,但我似乎无法获得任何数据。当我尝试使用fputcsv传递数组并通过mysql\u fetch\u array、mysql\u fetch\u assoc或mysql\u fetch\u 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--;
    }

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

它有几个警告,例如文件是写在数据库服务器上的

但是说到您的代码,我注意到您将mysql_query()放在while循环中,这样它就可以在只获取一行之后有效地重新启动查询。我希望有更多这样的事情:

$result = mysql_query(...);
while ($row = mysql_fetch_array($result)) {
  fputcsv($filehandle, $row);
}
试着换成-

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()
,这样就可以添加行,而无需遍历当前代码中的每个列值


注意:当扩展名
mysql\u*
折旧时,您需要查看更新到
mysqli\u*
PDO

mysql\u*
已弃用。请使用或

以下是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://
前缀,并将
wb9
替换为
wb

非常好。我简直不敢相信我没有注意到查询在循环中!