在PHP中将MySQL数据导出为CSV时自动前进到下一行?
我试图让一个脚本工作,其中某些选定的记录(取决于用户输入)被选中,然后导出到CSV文件。我尝试过各种方法来做到这一点;到目前为止,这是我能找到的最成功的方法(实际上是从我几年前编写的一些代码中),但它只会一次又一次地返回第一行,直到行用完为止(您可以在我用来告诉PHP继续获取行直到结果用尽的传输方法中看到我的锯末)。我的问题是:也许有一种更简单的方法可以做到这一点——有什么想法吗?如果没有,我该怎么做才能让MySQL在下次运行循环时前进到下一行?我认为mysql_fetch_数组应该可以做到这一点 是的,我看过fputcsv,但我似乎无法获得任何数据。当我尝试使用fputcsv传递数组并通过mysql\u fetch\u array、mysql\u fetch\u assoc或mysql\u fetch\u row获取数组时,CSV文件总是显示为空 我一直在不断地学习,而这正是我为了继续前进而没有学到东西的时候之一。我也不知道那么多 我的代码,或者至少是必要的代码:在PHP中将MySQL数据导出为CSV时自动前进到下一行?,php,mysql,csv,export,Php,Mysql,Csv,Export,我试图让一个脚本工作,其中某些选定的记录(取决于用户输入)被选中,然后导出到CSV文件。我尝试过各种方法来做到这一点;到目前为止,这是我能找到的最成功的方法(实际上是从我几年前编写的一些代码中),但它只会一次又一次地返回第一行,直到行用完为止(您可以在我用来告诉PHP继续获取行直到结果用尽的传输方法中看到我的锯末)。我的问题是:也许有一种更简单的方法可以做到这一点——有什么想法吗?如果没有,我该怎么做才能让MySQL在下次运行循环时前进到下一行?我认为mysql_fetch_数组应该可以做到这一
$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
非常好。我简直不敢相信我没有注意到查询在循环中!